726 Views
May 16, 22
スライド概要
達成目標
1. Program Counter(PC) が、命令の実行順序を決めている
2. 実行順序の制御では、
①通常命令での制御と(JMP, JSRなど)、
②割込み(Interrupt)による制御がある
これらについてわかるようになる。(特に割込みは重要です)
これまでに主に,ロボティクス・メカトロニクス研究,特にロボットハンドと触覚センシングの研究を行ってきました。現在は、機械系の学部生向けのメカトロニクス講義資料、そしてロボティクス研究者向けの触覚技術のサーベイ資料の作成などをしております。最近自作センサの解説を動画で始めました。https://researchmap.jp/read0072509 電気通信大学 名誉教授
第13回コンピュータの原理 メカトロニクス CPU(実行順序制御、割込み) 下 条 誠 電気通信大学名誉教授 https://researchmap.jp/read0072509/ 機械系のためのメカトロニクス The University of Electro-Communications Department of Mechanical Engineering and Intelligent System
達成目標 1. Program Counter(PC) が、命令の実行順序を決めている 2. 実行順序の制御では、 ① 通常命令での制御と(JMP, JSRなど)、 ② 割込み(Interrupt)による制御がある これらについてわかるようになる。(特に割込みは重要です) 参考のためのスライドです。とばしても構いません。 参考文献:都倉信樹、コンピュータ概論、岩波書店(1992) 2
内 容 1. 命令の実行順序の制御 ① 通常の実行順序の制御 ② 割込み処理(interrupt) 2. 通常の制御命令の例 ① BEQ (branch if equal to zero) ② JMP (jump) ③ JSR(jump to subroutine) 3. スタック(Stack)とはなにか 1. SubroutineでのStackの利用 4. 割り込み処理(Interrupt) 1. 割込み処理の必要性 2. polling OR interrupt 3. 割込みの種類 5. 割込み処理はどのように動作するのか ① 割込み処理の例(Arduino Atmel系) ② 割込み処理の例(ARM Cortex系) ③ 割込み処理の例( x86 系) ④ 割込み処理の例(PDP-11) 3
CPUの基礎 4 1. バス(BUS)の説明 2. 算術論理演算器(ALU)の働きとその回路 3. CPUの基礎 ① CPUの内部構造 ② CPUへの命令 ③ アドレス指定モード ④ 実行順序の制御 ⑤ 割込み 4. メモリーの説明 説明は、往年の名機“PDP-11”を参考とする。その考え方 や構造はシンプルであり、後のコンピュータに大きな影響を 与えた。 PDP-11上のオペレーティングシステム (OS) の設計は他 のOS、例えばCP/MやMS-DOSの設計に影響を及ぼしている。 最初の公式にUNIXと名付けられたバージョンのOSは、 1970年に PDP-11/20 上で動作した。PDP-11のプログラ ミング上の低レベルな特徴とC言語の言語要素の類似は非常 によく言われている(wikipedia) PDP-11は16ビットマシンです。ただし、メモ リ番地はバイト単位(8ビット)となっています。
コンピュータの基本構成要素 5 ごく簡単化したモデル data Bus 保存 store 実行 execute データの保存 命令解読 decode CPUの動作 サイクル 命令取出し fetch データの読出し Memory NO 割込み処理へ Yes 割込み? interruput 割込み機能は、メカトロニクス に大変重要な技術 Bus data メモリは、データを記憶する (プログラムもデータの一種) Busは、CPUとメモリの間でデータ のやり取りを行う通信路
1 命令の実行順序の制御 6
1 命令の実行順序の制御 7 今回はプログラムの実行に重要な次の2つについて説明します 1. 通常の実行順序の制御 ① BEQ (branch if equal to zero) ② JSR(jump to subroutine)など 2. 割込み処理(interrupt) keypoint: プログラムの実行順序の制御はPC(Program Counter)が行っている CPUは実行す る命令の順番 をどのように して制御する のだろう?
1 命令の実行順序の制御 PC(Program Counter)←(実行したい命令番地) memory PC Program Counter memory 1. PCは、命令(instruction)があるメモ リアドレス(番地)を指し示す 1101011111100101 0111010101101101 1101011101100111 0101110101101100 1111010101010011 0101011101101101 ……. 2. よって、実行したい命令があるメモ リアドレス(番地)をPCに代入すれ ば、その番地にある命令を実行する machine instructions RAM 次からの説明は、読み飛ばしても問題ないです。ただ、 PC←(実行したい命令がある番地) を理解していただければよいです。 但し、割込み処理は重要ですね。その概念は理解したほうが良いです 8
1 命令の実行順序の制御 9 CPUは実行す る命令の順番 をどのように して制御する のだろう? memory 答え:Program Counter (PC) Program Counter (PC) が実行する命令があるメモリ アドレスを指し示す PC Program Counter memory 1101011111100101 0111010101101101 1101011101100111 0101110101101100 1111010101010011 0101011101101101 ……. machine instructions RAM
1.1 2つの分類(通常動作と割込み) 実行順序の制御として、次の2つがあります 1. 通常業務 1. 通常の実行順序の制御 ➢ BEQ (branch if equal to zero) ➢ JMP (jump) ➢ JSR(jump to subroutine) など 2. 割込み処理 いつ起こるかわからない 出来事への対応 2. 割込みでの実行順序の制御 ➢ 割込み処理(interrupt) Event! 通常業務 割り込み処理 10
2. 通常の制御命令の例 1. 通常の実行順序の制御例 ① BEQ (branch if equal to zero) ② JMP (jump) ③ JSR(jump to subroutine) 次からは、具体例についてのべます。これらの命令で、どのようにして CPUの実行順序が変わっていくのか解説します。 話が細かいので斜め読み、もしくは飛ばしても構いません。 ルーチン業務 例はPDP-11を用いています。基本はどのようなCPUでも変わりません。 11
①実行制御に関わる命令(BEQ) 12 BEQ (branch if equal to zero) BEQ 0 15 0 0 0 0 0 1 1 offset 8 7 1 0 PC←PC+(2×offset) if Z=1 注)バイトアドレスのため×2 (命令は16bit長即ち2バイト) 注 1. PSWのフラグZがセット(Z=1)の場合、分岐する address memory ➢ PC←分岐先番地=PC+(2×offset) (PSW: Program Status Word 注2) 例) 1. CMP a, b ; aとbを比べる ① 等しい場合→PSW Z=1 1000 CMP a,b 1022 BEQ c 2. BEQ c ; 等しかったらcへ分岐 ① Z=1ならば ➢ P←PC+ (2×offset) ② Z≠ 1ならば ➢ PC=1024(次の命令) 注2)PSR: Program Status Registerと同じ offset 1024 c_address c: TST 2byte(16bits)
① BEQの実際のプログラム例 0 BEQ 0 0 0 0 1 0 0 0 4 1 1 15 0 0 0 0 0 6 0 1 8 7 BEQ 3$ 031224 001406 1 0 1 0 address machine code 031216 032737 13 (PDP-11) assembler 2$: BIT 001000 #1000, @#SWR BIT (bit test) 177570 offset=6 PC←PC+(2×offset) if Z=1 031224 001406 031226 032737 BEQ 3$ BIT #10000, BNE 4$ JMP ENDM @#SWR 010000 177570 例)コンソールスイッチ10番目の”0/1”をBIT (bit test) で調べ、 ”0”ならば分岐 ① (BEQ 3$)命令実行後のPCの値は、次の命令番地を示 しているから (031226)8 となる 031234 001010 031236 000167 000614 031242 032737 010000 ② BEQのmchine codeは[001406]であり、offsetは6 ③ offsetの計算 3$: BIT 177570 8進表示 i. offsetは、(2x6=12)10 ←10進表示 ii. offsetは、(12=8+4)10=(14)8 ←8進表示 ④ Z=1の場合、PC= (031226)8+(14)8 = (031242)8 ➢ よってlabel 3$:へ分岐する @#SWR CONSOLE SWITCH REGISTER ココ #10000, @#SWR
②実行制御に関わる命令(JMP) 14 JMP (jump) JMP 0 0 0 0 0 0 0 0 0 1 dst PC←(dst) 実効アドレスをPCにセット address memory 1000 1. 実効アドレスに分岐する ➢ PC←分岐先番地=(dst) 1020 1022 JMP a <address_a> ① PCに、jumpさせたいプログラムの開始 アドレスを代入すればよい i. ….. PC←a_address a_address a: TST プログラムの実行順序の制御は、PC(Program Counter)を 操作すればよい
②JMPの実際のプログラム例 0 JMP 0 0 0 0 0 0 0 0 1 0 0 0 6 1 opcode(JMP) mode 1 1 15 (PDP-11) 7 0 1 1 JMP先番地 1 register 1. JMP先番地はレジスタのアドレス修飾となる 2. 最初の3bitsでmode,次の3bitsでregisterを示す 3. この場合はレジスタ(PC)のindex addressingである address machine code 031252 000167 031254 000600 031256 013727 031260 177776 …… …… 032056 005037 032060 177572 assembler JMP 4$: ENDM MOV @#PSW, (PC)+ ENDM: CLR @#SR0 例)label”ENDM”に無条件 jump ① 命令(JMP)は、16bits+16bits (2 word)、から構成される(code1 & code2) ② 命令は、 (031252)8そして(031254)8に格納されている ③ CPUは初めのfetchで(000167)、次のfetchで(000600)を読み出す ④ よって、fetch後のPCの値は、次の命令番地を示している i. PC ← (031256)8 相対変位 ⑤ JMP命令の飛び先番地は、レジスタ(PC)のindex addressingのため、 i. PC ← ii. PC ← PC+(index)=PC+(000600)8 (031256)8+(600)8= (032056)8 ⑥ PCは、(032056)8となり、この番地に実行が移る ⑦ よってlabel ENDM:へ分岐する 前回講義でのベースレジスタを持たないと き利用される方式 4.3 ③ d.相対アドレ ス (relative addressing)です。このように してrelocatableなプログラムを作ります
②PDP11のアセンブラ出力リスト(例) Line番号 address machine code1 machine code2 machine code3 Label 命令 operand1 operand2 5848 031216 032737 001000 177570 2$: BIT #1000, @#SWR 5849 031224 001406 BEQ 3$ 5850 031226 032737 BIT #10000, 5851 031234 001010 BNE 4$ 5852 031236 000167 000614 JMP ENDM 5853 031242 032737 010000 BIT #10000, 5854 031250 001402 BEQ 4$ 5855 031252 000167 000600 JMP ENDM 5856 031256 013727 177776 MOV @#PSW, 5857 031262 000000 .WORD 0 5858 031264 …… …….. …….. …… …… 5976 032056 005037 CLR @#SR0 010000 177570 177570 3$: 4$: OLDPSW : 177572 ENDM: 16 例① @#SWR 例② @#SWR (PC)+ 8進(octal)表示 @#PSW The Processor Status Word @#SWR CONSOLE SWITCH REGISTER https://www.pcjs.org/software/dec/pdp11/tapes/diag/
③実行制御に関わる命令(JSR)1/2 0 JSR 0 0 0 0 4 0 1 0 R 0 1 0 D 1 d opcode(JSR) d D d d d JMP先番地 mode JSR (jump subroutine) d register 1. JMP先番地はレジスタのアドレス修飾となる JSR R5、SUBR address (R5は例) memory 注)JMP項頁を参照のこと 1. サブルーチンでは戻り番地を保存する必要がある 2. 例では、この格納にR5を利用する 1000 … 1022 JSR R5, SUBR ⚫ JSRを実行 1024 <address_SUBR> i. R5の内容をstackへ退避 1026 … ii. 戻り番地(1026)をR5に保存 iii. PC←飛び先番地(SUBR) ⚫ RTSを実行 i. PC← R5 (戻り先番地) ii. R5←退避したstack内容 17 SUBR_addr Retun SRrtn_addr Goto SUBR: TST … … RTS R5
③実行制御に関わる命令(JSR)2/2 ⚫ JSRを実行 i. R5の内容をstackへ退避 ➢ ⭣(SP)← R5 (注) ii. 戻り番地(1026)をR5に保存 ➢ R5←PC JSR R5, SUBR iii. PC←飛び先番地(SUBR) ➢ PC←SUBR ① 命令(JSR)は2wordから構成される ② 命令は 1022そして1024に格納されている ③ CPUは2回のfetchで命令を読み出す ④ よって、fetch後のPCの値は次の命令番地 1026となる ⚫ RTSを実行 i. PC← R5 (戻り先番地) ➢ PC←1026 ii. R5←退避したstack内容 ➢ R5←(SP) ⭡ (注) • (注) • ⭣(SP)← R5; SP←SP-2 then (SP)←R5 ➢ SPを-2した後、SPの示す番地にR5の内容を保存 R5←(SP) ⭡; R5←(SP) then SP←SP+2 ➢ SPの示す番地の内容をR5に戻した後、 SPを+2する RTS Before Stack領域 R5 #1 n+2 R6(SP) n n PC(R7) 1022 n-2 18 memory にある data0 n-4 After R5 1026 n+2 R6(SP) n-2 n data0 PC(R7) SUBR n-2 #1 n-4 Before Stack領域 R5 1026 n+2 R6(SP) n-2 n data0 PC(R7) Srtn n-2 #1 R5 After n-4 R5 #1 n+2 R6(SP) n n data0 PC(R7) 1026 n-2 #1 n-4 memory にある
③JSRの実際のプログラム例 1/2 19 (PDP11) 0 0 4 7 6 7 address machine code 030750 004767 030752 000232 03754 012737 … … 031206 005737 1. JSR先番地はレジスタのアドレス修飾となる 031210 000764 2. 最初の3bitsでmode,次の3bitsでregisterを示す 031212 100401 3. この場合はレジスタ(PC)のindex addressingである 031214 000207 031216 032737 031220 001000 031222 177570 JSR 0 0 0 0 1 0 opcode(JSR) 0 1 1 1 1 1 0 1 1 1 PC(R7) mode JMP先番地 register ① 命令(JSR)は、16bits+16bits (2 word)、から構成される ② 命令は、 (030750)8そして(030752)8に格納されている ③ CPUは初めのfetchで(004767)、次のfetchで(000232)を読み出す ④ よって、fetch後のPCの値は、次の命令番地を示している i. PC ← (030754)8 相対変位 ⑤ JSR命令の飛び先番地は、レジスタ(PC)のindex addressingのため、 i. PC ← ii. PC ← PC+(index)=PC+(000232)8 (030754)8+(232)8= (031206)8 ⑥ PCは、(031206)8となり、この番地に実行が移る ⑦ よってlabel STMM:へ分岐する assembler END: JSR MOV PC, STMM … … STMM: TST @#OPT.CP BMI 2$ 1$: RTS PC 2$: BIT #1000, @#SWR 以下の解説では、1$へ分岐 してreturnを想定した
③ JSRの実際のプログラム例 2/2 (PDP11) ⚫ JSRを実行 i. PCの内容をstackへ退避 ➢ ⭣(SP)← PC(030754) ii. PC←飛び先番地(SUBR) ➢ PC←031206 Before (注) 20 Stack領域 n+2 R6(SP) n n PC(R7) 030750 n-2 data0 n-4 JSR PC, STMM After ① 命令(JSR)は2wordから構成される ② 命令は 030750そして030752に格納され ている ③ CPUは2回のfetchで命令を読み出す ④ よって、fetch後のPCの値は次の命令番地 030754となる ⑤ この戻り先番地がStackに保存される n+2 R6(SP) n-2 n data0 PC(R7) 031206 n-2 030754 戻り先番地 n-4 Before Stack領域 n+2 ⚫ RTSを実行 i. PC←退避したstack内容 ➢ PC←(SP) ⭡ (注) ➢ PC←030754 (戻り先番地) R6(SP) n-2 n data0 PC(R7) 031214 n-2 030754 n-4 RTS PC After n+2 • (注) • ⭣(SP)← PC; SP←SP-2 then (SP)←PC ➢ SPを-2した後、SPの示す番地にPCの内容を保存 PC←(SP) ⭡; PC←(SP) then SP←SP+2 ➢ SPの示す番地の内容をPCに戻した後、 SPを+2する R6(SP) n n data0 PC(R7) 030754 n-2 030754 n-4 戻り先番地
3. スタック(Stack)とはなにか スタック(Stack)とは、CPUが行うデータ保管方法のひとつで、データが入って きた順に積み重ね、後に入れたデータから順に取り出す方法です。 スタックではデータは順番に積み重ねられていく。スタックにデータを積むことを、 「プッシュ」という。これに対して、プッシュされたデータを取り出すことを 「ポップ」と呼ぶ(「プル」と呼ぶこともある)。スタックは「後に入れたデータ が先に出てくる」データ構造といえる。これを「Last-in, First-out」「LIFO」 「後入れ先出し」などと表すこともある。 PUSH Stack https://atmarkit.itmedia.co.jp/ait/articles/1908/06/news015.html POP 21
3. Stackとはなにか(イメージ) スタック領域は,データを一時的に保存するためのメモリ領域 SP (1)PUSHはdataを退避する命令 (2)POPはdataを復帰する命令 (Stack Pointer)は Stack領域の番地を 示す LIFO: Last In First Out 1. PUSH(3回) SP (n-2) R3 R2 R1 R3 R2 R1 R3 R2 R1 r3 r2 r1 ? r2 r1 ? ? r1 n-2 r3 n data0 SP (n-4) SP=n ① SP←SP-2 ② (SP)←R3 address 2. POP (3回) SP=n-6 ① R3 ←(SP) ② SP←SP+2 (SP)⭡ n-6 r3 n-4 r2 n-2 r1 n data0 n-4 r2 n-2 r3 n data0 SP (n-6) ① SP←SP-2 ② (SP)←R2 ① SP←SP-2 ② (SP)←R1 ⭣(SP) ⭣(SP) ⭣(SP) SP (n-6) 22 n-6 r1 n-4 r2 n-2 r3 n data0 PUSH ?:退避後は 他へ利用され ているとした R3 R2 R1 R3 R2 R1 R3 R2 R1 r3 ? ? r3 r2 ? r3 r2 r1 SP (n-4) POP ① R2 ←(SP) ② SP←SP+2 (SP)⭡ n-4 r2 n-2 r1 n data0 SP (n-2) ① R1 ←(SP) ② SP←SP+2 (SP)⭡ n-2 r1 n data0
3.1 SubroutineでのStackの利用 23 スタック(Stack)は、サブルーチンや割り込み要求が発生した場合、直前まで実行してい たプログラムのフラグやPCの値を一時的に退避する場所(メモリ領域)として使われます。 サブルーチンや割り込み処理終了後、スタックに退避させていた情報は元に戻され、中断 していたプログラムの続きが実行されます。 Mainプログラムと、サブルーチンA、B、C があるとする Main A ① ① サブルーチンAへはJSR Aで飛ぶ。その時、 戻り先番地、および利用しているレジスタ をStackに退避(PUSH)する C JSR A ② RTS B JSR B JSR C RTS JSR A RTS ② サブルーチンAからはRTSで戻る。その時、 戻り先番地をPCにStackから復帰(POP) 、 そして退避したレジスタをStackから復帰 (POP)する この例のように、JSRが重なっても、 Stackを利用することで、戻り先番地なら びに利用しているレジスタも、保存でき、 サブルーチンから戻ってプログラムを実 行し続けられる Stackの脆弱性;Stack領域は無限にあるわけでない。この弱点を突いたスタックバッファオーバーフロー攻撃というの がある。攻撃者によって,プログラムのクラッシュや,管理者権限の奪取といった被害が発生する可能性がある
4.割り込み処理(Interrupt) 割り込み処理とは、突然に発生する出来事への対処 通常業務 割り込み処理 いつ起こるかわからない 出来事への処理 Event! 割込み処理 通常業務をSTOPして 割込み業務に対応します (実行中のプログラムを外部から切り替える仕組みは割り込みのみである) 24
4.割り込み(突然に発生する出来事への対処) 割り込み ⚫ 出来事は突然に発生 例えば タイマー、I/O装置、ゼロ除算、オバー フロー、メモリアクセス違反、暴走検知、 ハードウェア障害、電圧低下 CPU外部(周辺 機器など)から の要求 割込み 処理 例えば ① KeyBoard:キーインあり、 ② Mouse:クリックあり ③ printer:用紙切れ、インク切れ 実行順次制御は、 PC←(実行命令番地) 実行命令番地 メモリの決まった番地に用意 (Interrupt Vectors address) 割込み処理では ⚫ 優先順序(priority)で変わる対応順序 ⚫ マスク(Mask:抑止)で割込みの許諾を決める ① マスクできない割込み(Non-maskable interrupt)がある これ重要 25
4.1 割込み処理の必要性(イメージ) CPUはkeyboard入力をどのように処理するのか? ⚫ Polling:入力があったか、常に見に行く ⚫ Interrupt: 入力があった時に、割込みを発生させる 10回/秒 CPU clock: GHz 10-9秒 27,778時間 (3.17年) 10-1秒 CPUとkeyboard入力の時間感覚 108倍の違い 1秒 とすると CPUからすると稀な出来事。常時監視は無駄! 26
4.2 割込み処理(polling OR interrupt) 郵便は届いた? 定期的にチェック 到着音が鳴る(出来事発生) Polling Interrupt https://www.youtube.com/watch?v=QtyOiTw0oQc 27
4.3 割込みの種類(参考) 1. ハードウェア割込み:主に外部の要因によって発生 softwareでマスク (抑止)できる ① 周辺機器から:汎用I/O,通信、インターフェース ➢ キーボード・マウス入力、AD変換器、serial I/O、タイ マー、ネットワークなど マスク(抑止) できない ② ノンマスカブル(NMI):システムにとって重要な状態の場合 ➢ ウォッチドックタイマ(暴走検知など)、電圧監視、 ハードウェア障害など ③ 内部割込み注:ゼロ除算、オバーフロー、メモリアクセス違反 2. ソフトウェア割込み:命令の実行によって発生 ① CPU命令(TRAPなど) ② スパーバイザーコール(SVC)など ⚫ 割込みの種類を原因によって分類した。しかし、いずれの場合でも同じような処理 が必要になるため、分類分けは、あまり重要ではないと思う。 ⚫ メカトロニクス技術としては、周辺機器などからの割込みを理解しておけばよい 注:ソフトウェア割込みに分類する解説も多い。ソフトウェア割込みは意図した命令の実行によって発生する割込みとした (私見です)。overflowなどALU(hardware)での発生したEventをソフトウェア割込みとするのは私には違和感がある。 28
5 割込み処理はどのように動作するのか? Main Switch -on ① レジスタ退避 ② PC←Event A 処理 プログラムの番地 EventA 処理 プログラム Event_A 発生 RTI ③ レジスタ復帰 ④ PC←戻り先番地 Q1: Eventをどのよう にCPUに知らせ るのだろう? ① ... ② ... Event B 処理 プログラム Event_B 発生 RTI Key-in RTI: return from interrupt ③ … ④ … Q2: どのよう にするの だろう? ここはJSR と基本は同 じかな 割込みは、 どのように 処理する の? 29
①割込み処理の例(Arduino ) 30 Atmel系 信号線 CPU INT0 ATmega 328/P INT1 この他にもあります Event発生 ① interrupt requestの優先度・マ スク状態などチェック。許可 PCなどの退避 ➢ PC←処理プログラム番地 ③ 処理終了後、PCなど復帰 ④ 元のプログラムを継続 (割込み処理は、CPU architectureにより 違うので参考資料です) ① interrupt request(割込み要求) ② interrupt vectors 領域にある JMP命令を実施 ➢ 電 圧 信 号 例 スイッチON 割込み処理 の要求 メモリ境域のinterrupt vectorsは事前に作成する(次頁参照)
①割込み処理の例(Arduino ) Atmel系 CPU INT0 Atmega 328/P 割込み発生 ③ PC←0x0002 番地 ① interrupt requestの優先度・マ スク状態などチェック。許可 ② interrupt vectors 領域にある JMP命令を実施 ➢ PCなどレジスタの退避 ➢ PC←処理プログラム番地 ③ 処理終了後、PCなど復帰 ④ 元のプログラムを継続 interrupt vectors 0x0000 0x0002 0x0004 0x0006 0x0008 0x000A 0x000C 0x0032 0x0034 16進数 表示 Memory jmp RESET jmp INT0 jmp INT1 jmp PCINT0 jmp PCINT1 jmp PCINT2 jmp WDT … … ;Reset ;IRQ0 ;IRQ1 ;PCINT0 ;PCINT1 ;PCINT2 ;watchdog RESET: ldi r16, high(RAMEND) INT0: ….. ….. 割込み処理ハンドラ Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet 31
①割込み処理の例(Arduino ) 32 Atmel系 ⚫ 割込みの原因(出来事)に対応した飛び先番地表(Interrupt vectors) ATmega328P_Datasheet これはRESET ボタン interrupt vectorsの対応するアドレス にある命令を実行する
②割込み処理の例(ARM Cortex系 ) 33 PA3 この他にも沢山あります EXTI 3 Coretex -M4 GPIO-EXTI3 NVIC 信号線 EXITI3-IRQHandler ① interrupt requestの優先度・マ スク状態などチェック。許可 ② interrupt vectors 領域にある Handler addressを取得 ➢ PCなどレジスタの退避 ➢ PC←処理プログラム番地 Interrupt Vector Table 電 圧 信 号 Event発生 Nested vectored interrupt controller (NVIC) ① interrupt request(割込み要求) スイッチON ③ 処理終了後、PCなど復帰 例 ④ 元のプログラムを継続 割込み処理 の要求 (割込み処理は、CPU architectureにより違うので参考資料です) BlueBotton STM32nucleoF446REの例
②割込み処理の例(ARM 割込み発生 ) Cortex系 34 PA3 GPIO Pin 電圧信号 PA3 PB3 EXTI3 . . . PH3 interrupt number interrupt vector table address STM32nucleoF446REの例 例 0x0800030C Handler Program void EXTI3_IRQHandler { …… } RM0390 Reference manual 割込み対象先に対応した処理 Handlerへのpointerが interrupt vector tableに用意 されている interrupt vector table ……. ……. 0x00000068 EXT14_IRQHander 0x00000064 EXT13_IRQHander ……. ……. 0x00000004 Reset_Handler Reset Handlerのpointer 0x00000000 Reserved Stack pointerの初期値 Memory address Memory content EXTI3Handlerへのpointer
Memory Map of Cortex-M4 35 <参考例> (CPU type, vendorにより違うので参考資料です) High address (Interruptとは別話題ですが) 0x3FFFFFF 0xF0000000 Memory Mapped I/O System 0.5GB Peripheral 0x20017FFF 0xE0000000 Stack GPIO, USART, SPI, ADCなどの制御、 データなどの Registerがaddress を持ち、 READ/WRITEできる External RAM 1GB (off-chip memory 0xA0000000 Zero-Initialized data External Device 1GB Heap for data) (such as SD card) Initialized data 0x20000000 0x1FFFFFF versus. 0x60000000 Peripheral 0.5GB Port Mapped I/O (AHB&APB, such as GPIO) 0.5GB 0x20000000 0.5GB SRAM Interrupt Vector Table 0x08000000 Mapped 0x40000000 Code (flash memory) CPUの入出力命令を 使って各I/Oを制御 する方式。Intel系は この方式 Interrupt Vector Table 0x00000000 0x00000000 Lecture 9: Interrupts https://www.youtube.com/channel/UCY0sQ9hpSR6yZobt1qOv6DA 私はmemory mapped i/oが 好みです。PDP-11はMemory Mapped I/Oの先駆けです
③割込み処理の例( x86 アーキテクチャ系 IRQ0:timer IRQ1:Keyboard INT Master PIC 8259 IRQ6:Floppy.. IRQ7... ) 36 IRQ8:RTC.. IRQ9:... Saster PIC 8259 IRQ14:.. IRQ15:... 割込み発生 PIC(Programmable Interrupt Controller) 割込みハンドラ 起動 IDT (Interrupt Descriptor Table) IDTは割込みと割込みハンドラを結び つけるテーブル ➢ IDTは256個までの配列でそれぞれ 順番に0番から255番までの割り込 みに対応する ⚫ 割込みの原因(出来事)に対応した 処理プログラム(割込みハンドラ) に実行が移る IDT は、x86アーキテクチャが割込みベクタ テーブル(interrupt vectors table )を実装す るために使用するデータ構造です APIC(Advanced Programmable Interrupt Controller)による 割込み処理もある。ただし、ここでは触れない https://www.valinux.co.jp/technologylibrary/document/linux/interrupts0001/
④割込み処理の例(PDP-11) NPR 37 優先度 priority 割込み要求信号線 高い BR7 BR4 (割込み処理は、CPU architectureにより 違うので参考資料です) 割込み発生 ① interrupt requestの優先度な どチェック。許可 ① interrupt request(割込み要求) ② 処理プログラム番地の送出 interrupt vector ② interruptの受け入れ ➢ PCなどの退避 ➢ PC←処理プログラム番地 (interrupt vector) ③ 処理終了後、PCなど復帰 ④ 元のプログラムを継続 キーボード 押し込み 割込み処理 の要求 InterfaceBoard上にinterrupt vectorをジャンパ線で設定 interrupt vector:割込み処理プログラムのアドレス(番地) (Interrupt vector は割込み処理プログラムアドレスを示し、その次のアドレスにはnew PSWがある)
④割込み処理の例(PDP-11) 38 UNIBUS 割込み要求 Interface Boardに interrupt vectorを ジャンパ線で設定? interrupt vector 割込み処理プログラム があるメモリアドレス Device Interrupt vectorを送る仕組み 1. BUSの利用権は、常に1つのCPU/Deviceにある ① 利用権があるのがBUS MASTERである ② これの管理を行う仕組みがBUS arbitrationである 2. Deviceからの割込みが許可されると、一時的にそのDeviceがBUS Masterとなり、interrupt vectorをCPUへ送る 3. そしてPCに割込み処理プログラムアドレスが設定され、処理を開始する
④割込み処理の例(PDP-11) 優先度 High Low NPR 割込み要求線 High D1-DMA 割込み要求線 D6 D7 BR6 D5 BR5 割込み要求線 D1 Low 3. NPRは最高優先度であり、CPUによって も抑止できない i. 割込み要求線 D4 1. 割込みには5つの要求線がある 2. 優先度は図に示す通りである D2-DMA BR7 39 D2 DMA(Direct Memory Access)に利用 4. それ以外の割込み要求はCPUによって抑 止できる i. PSWに3bitsでCPU優先度を設定できる(0~7 レベル) ii. CPU優先度以下の割込みレベルは抑止となる 割込み要求線 BR4 KeyBoard TTY NPR: non-processor request 割込みの優先度とProcessor優先度の関係 CPU PSWレジスタ(address: FFFE) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 unused * * * T N Z V C CPU優先度 判定結果
④ PDP-11 interrupt vector 前回No12. でIMSAI用クロスアセンブラを作った話 アセンブリ言語は、機械語と一対一の対応があるため、機械語への変換は簡単です。私も1980年 ごろ、この変換プログラム(Assembler)を作成したことが有ります。当時、私はIMSAI 8080を購入 しましたが、プログムから機械語への変換に大変手間がかかっていました。そこで研究室にあっ たPDP11/40を用いて、IMSAI用のアセンブラ言語を機械語に変換するプログラム(Cross Assembler)を作りました。ニーモニックと機械語の対応表を作り、あとプログラムの中のラベル に対応する処理を行うだけで良かったので、codingは1週間もかかりませんでした。しかし、完成 にはデバックを含めると3週間ほどかかった覚えがあります。 続き;紙テープパンチャ用インターフェースを作った話 IMSAI 8080へのプログラムロードには紙テープを使っていました。そこで、PDP-11/40に安い市販 の紙テープパンチャーを購入して取付けました。当時PDP-11のOSには、データファイル転送ユー ティリティとして非常に便利なPIP(Peripheral Interchange Program)がありました。ただし、これを 利用するにはPDP-11のハンドラーにあわせたインターフェースボードを作る必要がありました。 その製作過程で、ハンドラー用のinterrupt vectorアドレスをジャンパ線で設定したような記憶が あります。(もう45年ほど前なので記憶があやふやですが) 紙テープ 40
おわり メカトロニクスエンジニアにとって、これからますます 必要性が増加するマイクロコントローラ(MCU)につい ての解説も今後の予定しています。 私見ですが、ソフトウェアエンジニアがメカトロ機器を理解することは困難と思います。理解不足でそのソフト ウェアを作るよりは、メカトロニクスエンジニアがメカトロ機器のソフトウェアを記述したほうが良いと思って います。ただし、より抽象度の高いレベル階層はソフトウェアエンジニアに任せましょう。 これからメカトロニクスエンジニアは、マイクロコントローラ(MCU)の利用機会が増えると思います。その ときには統合開発環境 (IDE) などを使いこなし、ソフトウェアを迅速に開発できるべきと思っています。ます ます最近のMCUの勉強は必要不可欠になるでしょう。 41