---
title: NO13 メカトロニクスCPU（実行順序制御、割込み）
tags:  #機械系のためのメカトロニクス #メカトロニクス #割り込み処理 #マイクロコントローラ #interrupt #polling #arduino #arm cortex #pdp-11  
author: [下条誠](https://convert.docswell.com/user/m_shimojo)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/5G7595Z2J4.jpg?width=480
description: 達成目標 1. Program Counter(PC) が、命令の実行順序を決めている 2. 実行順序の制御では、 ①通常命令での制御と（JMP, JSRなど）、 ②割込み(Interrupt)による制御がある これらについてわかるようになる。（特に割込みは重要です）
published: May 16, 22
canonical: https://convert.docswell.com/s/m_shimojo/5EWGG5-2022-05-16-210858
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/5G7595Z2J4.jpg)

第13回コンピュータの原理
メカトロニクス
CPU（実行順序制御、割込み）
下
条
誠
電気通信大学名誉教授
https://researchmap.jp/read0072509/
機械系のためのメカトロニクス
The University of Electro-Communications Department of Mechanical Engineering and Intelligent System


# Page. 2

![Page Image](https://bcdn.docswell.com/page/V9J22NR1JR.jpg)

達成目標
1. Program Counter(PC) が、命令の実行順序を決めている
2. 実行順序の制御では、
① 通常命令での制御と（JMP, JSRなど）、
② 割込み(Interrupt)による制御がある
これらについてわかるようになる。（特に割込みは重要です）
参考のためのスライドです。とばしても構いません。
参考文献：都倉信樹、コンピュータ概論、岩波書店（１９９２）
2


# Page. 3

![Page Image](https://bcdn.docswell.com/page/5DEYYPD4EM.jpg)

内
容
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


# Page. 4

![Page Image](https://bcdn.docswell.com/page/2VJNP56678.jpg)

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ビット)となっています。


# Page. 5

![Page Image](https://bcdn.docswell.com/page/GYE93YLRE3.jpg)

コンピュータの基本構成要素
5
ごく簡単化したモデル
data
Bus
保存
store
実行
execute
データの保存
命令解読
decode
CPUの動作
サイクル
命令取出し
fetch
データの読出し
Memory
NO
割込み処理へ
Yes
割込み？
interruput
割込み機能は、メカトロニクス
に大変重要な技術
Bus
data
メモリは、データを記憶する
（プログラムもデータの一種）
Busは、CPUとメモリの間でデータ
のやり取りを行う通信路


# Page. 6

![Page Image](https://bcdn.docswell.com/page/5GE8M6XGED.jpg)

1
命令の実行順序の制御
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/MLEL398XJR.jpg)

1
命令の実行順序の制御
7
今回はプログラムの実行に重要な次の2つについて説明します
1. 通常の実行順序の制御
① BEQ (branch if equal to zero)
② JSR(jump to subroutine)など
2. 割込み処理(interrupt)
keypoint：
プログラムの実行順序の制御はPC(Program
Counter)が行っている
CPUは実行す
る命令の順番
をどのように
して制御する
のだろう？


# Page. 8

![Page Image](https://bcdn.docswell.com/page/54JMDZ63JW.jpg)

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


# Page. 9

![Page Image](https://bcdn.docswell.com/page/ZPJR46PRJ9.jpg)

1
命令の実行順序の制御
9
CPUは実行す
る命令の順番
をどのように
して制御する
のだろう？
memory
答え：Program Counter (PC）
Program Counter (PC）
が実行する命令があるメモリ
アドレスを指し示す
PC
Program Counter
memory
1101011111100101
0111010101101101
1101011101100111
0101110101101100
1111010101010011
0101011101101101
…….
machine instructions
RAM


# Page. 10

![Page Image](https://bcdn.docswell.com/page/NPEX2M3Y7X.jpg)

1.１
2つの分類（通常動作と割込み）
実行順序の制御として、次の2つがあります
１．
通常業務
1. 通常の実行順序の制御
➢
BEQ (branch if equal to zero)
➢
JMP (jump)
➢
JSR(jump to subroutine)
など
2．
割込み処理
いつ起こるかわからない
出来事への対応
2. 割込みでの実行順序の制御
➢ 割込み処理(interrupt)
Event!
通常業務
割り込み処理
10


# Page. 11

![Page Image](https://bcdn.docswell.com/page/63EKMGY4JD.jpg)

２.
通常の制御命令の例
1. 通常の実行順序の制御例
① BEQ (branch if equal to zero)
② JMP (jump)
③ JSR(jump to subroutine)
次からは、具体例についてのべます。これらの命令で、どのようにして
CPUの実行順序が変わっていくのか解説します。
話が細かいので斜め読み、もしくは飛ばしても構いません。
ルーチン業務
例はPDP-11を用いています。基本はどのようなCPUでも変わりません。
11


# Page. 12

![Page Image](https://bcdn.docswell.com/page/4L73YN9DE5.jpg)

①実行制御に関わる命令（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+(２×offset) if Z=1
注）バイトアドレスのため×２
（命令は16bit長即ち２バイト）
注
1. PSWのフラグZがセット(Z=1)の場合、分岐する
address
memory
➢ PC←分岐先番地=PC+(２×offset)
(PSW: Program Status Word 注２)
例）
1. CMP a, b ; aとｂを比べる
① 等しい場合→PSW Z=1
1000
CMP a,b
1022
BEQ c
2. BEQ c ； 等しかったらｃへ分岐
① Z=1ならば
➢ P←PC+ (２×offset)
② Z≠ 1ならば
➢ PC=1024(次の命令)
注2）PSR: Program Status Registerと同じ
offset
1024
c_address
c: TST
2byte(16bits)


# Page. 13

![Page Image](https://bcdn.docswell.com/page/V87D5WG27G.jpg)

① 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+(２×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


# Page. 14

![Page Image](https://bcdn.docswell.com/page/4VJPG93LJ8.jpg)

②実行制御に関わる命令（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
&lt;address_a&gt;
① PCに、jumpさせたいプログラムの開始
アドレスを代入すればよい
i.
…..
PC←a_address
a_address
a: TST
プログラムの実行順序の制御は、PC(Program Counter)を
操作すればよい


# Page. 15

![Page Image](https://bcdn.docswell.com/page/L2EV6M467Q.jpg)

②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 &amp; 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なプログラムを作ります


# Page. 16

![Page Image](https://bcdn.docswell.com/page/Z57GNG12JL.jpg)

②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/


# Page. 17

![Page Image](https://bcdn.docswell.com/page/V4EQQXD9EP.jpg)

③実行制御に関わる命令（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
&lt;address_SUBR&gt;
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


# Page. 18

![Page Image](https://bcdn.docswell.com/page/DKJ4N6GR71.jpg)

③実行制御に関わる命令（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を-２した後、SPの示す番地にR5の内容を保存
R5←（SP) ⭡; R5←（SP) then SP←SP+2
➢ SPの示す番地の内容をR5に戻した後、 SPを+２する
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
にある


# Page. 19

![Page Image](https://bcdn.docswell.com/page/PLE15VDV7G.jpg)

③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を想定した


# Page. 20

![Page Image](https://bcdn.docswell.com/page/8GEW5LY3J2.jpg)

③ 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を-２した後、SPの示す番地にPCの内容を保存
PC←（SP) ⭡; PC←（SP) then SP←SP+2
➢ SPの示す番地の内容をPCに戻した後、 SPを+２する
R6(SP)
n
n
data0
PC(R7)
030754
n-2
030754
n-4
戻り先番地


# Page. 21

![Page Image](https://bcdn.docswell.com/page/W47ZNMXG73.jpg)

3. スタック(Stack)とはなにか
スタック(Stack)とは、CPUが行うデータ保管方法のひとつで、データが入って
きた順に積み重ね、後に入れたデータから順に取り出す方法です。
スタックではデータは順番に積み重ねられていく。スタックにデータを積むことを、
「プッシュ」という。これに対して、プッシュされたデータを取り出すことを
「ポップ」と呼ぶ（「プル」と呼ぶこともある）。スタックは「後に入れたデータ
が先に出てくる」データ構造といえる。これを「Last-in, First-out」「LIFO」
「後入れ先出し」などと表すこともある。
PUSH
Stack
https://atmarkit.itmedia.co.jp/ait/articles/1908/06/news015.html
POP
21


# Page. 22

![Page Image](https://bcdn.docswell.com/page/KYJ68N4Q7V.jpg)

3.
Stackとはなにか（イメージ）
スタック領域は，データを一時的に保存するためのメモリ領域
SP
（１）PUSHはdataを退避する命令 （２）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


# Page. 23

![Page Image](https://bcdn.docswell.com/page/5GJ595Q2E4.jpg)

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領域は無限にあるわけでない。この弱点を突いたスタックバッファオーバーフロー攻撃というの
がある。攻撃者によって，プログラムのクラッシュや，管理者権限の奪取といった被害が発生する可能性がある


# Page. 24

![Page Image](https://bcdn.docswell.com/page/4LE3YNV1J5.jpg)

4．割り込み処理(Interrupt)
割り込み処理とは、突然に発生する出来事への対処
通常業務
割り込み処理
いつ起こるかわからない
出来事への処理
Event!
割込み処理
通常業務をSTOPして
割込み業務に対応します
（実行中のプログラムを外部から切り替える仕組みは割り込みのみである）
24


# Page. 25

![Page Image](https://bcdn.docswell.com/page/V8ED5W8KEG.jpg)

４．割り込み（突然に発生する出来事への対処）
割り込み
⚫ 出来事は突然に発生
例えば
タイマー、I/O装置、ゼロ除算、オバー
フロー、メモリアクセス違反、暴走検知、
ハードウェア障害、電圧低下
CPU外部（周辺
機器など）から
の要求
割込み
処理
例えば
① KeyBoard:キーインあり、
② Mouse:クリックあり
③ printer：用紙切れ、インク切れ
実行順次制御は、
PC←（実行命令番地）
実行命令番地
メモリの決まった番地に用意
（Interrupt Vectors address）
割込み処理では
⚫ 優先順序（priority）で変わる対応順序
⚫ マスク（Mask:抑止）で割込みの許諾を決める
① マスクできない割込み(Non-maskable
interrupt)がある
これ重要
25


# Page. 26

![Page Image](https://bcdn.docswell.com/page/4V7PG98378.jpg)

4.1 割込み処理の必要性（イメージ）
CPUはkeyboard入力をどのように処理するのか？
⚫ Polling：入力があったか、常に見に行く
⚫ Interrupt： 入力があった時に、割込みを発生させる
10回/秒
CPU clock: GHz
10-9秒
27,778時間
（3.17年）
10-1秒
CPUとkeyboard入力の時間感覚
108倍の違い
1秒
とすると
CPUからすると稀な出来事。常時監視は無駄！
26


# Page. 27

![Page Image](https://bcdn.docswell.com/page/L2JV6MNNEQ.jpg)

4.2 割込み処理（polling OR interrupt）
郵便は届いた？
定期的にチェック
到着音が鳴る(出来事発生)
Polling
Interrupt
https://www.youtube.com/watch?v=QtyOiTw0oQc
27


# Page. 28

![Page Image](https://bcdn.docswell.com/page/Z5EGNGK57L.jpg)

4.3 割込みの種類(参考)
1. ハードウェア割込み：主に外部の要因によって発生
softwareでマスク
(抑止)できる
① 周辺機器から：汎用I/O,通信、インターフェース
➢ キーボード・マウス入力、AD変換器、serial I/O、タイ
マー、ネットワークなど
マスク(抑止)
できない
② ノンマスカブル(NMI)：システムにとって重要な状態の場合
➢ ウォッチドックタイマ（暴走検知など）、電圧監視、
ハードウェア障害など
③ 内部割込み注：ゼロ除算、オバーフロー、メモリアクセス違反
2. ソフトウェア割込み：命令の実行によって発生
① CPU命令(TRAPなど)
② スパーバイザーコール(SVC)など
⚫ 割込みの種類を原因によって分類した。しかし、いずれの場合でも同じような処理
が必要になるため、分類分けは、あまり重要ではないと思う。
⚫ メカトロニクス技術としては、周辺機器などからの割込みを理解しておけばよい
注：ソフトウェア割込みに分類する解説も多い。ソフトウェア割込みは意図した命令の実行によって発生する割込みとした
（私見です）。overflowなどALU(hardware)での発生したEventをソフトウェア割込みとするのは私には違和感がある。
28


# Page. 29

![Page Image](https://bcdn.docswell.com/page/V4JQQXNLJP.jpg)

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


# Page. 30

![Page Image](https://bcdn.docswell.com/page/DK74N6G5E1.jpg)

①割込み処理の例（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は事前に作成する（次頁参照）


# Page. 31

![Page Image](https://bcdn.docswell.com/page/PLJ15VD2EG.jpg)

①割込み処理の例（Arduino
）
Atmel系
CPU
INT0
Atmega
328/P
割込み発生
③ PC←0ｘ0002
番地
① 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


# Page. 32

![Page Image](https://bcdn.docswell.com/page/8GJW5LY272.jpg)

①割込み処理の例（Arduino
）
32
Atmel系
⚫ 割込みの原因(出来事)に対応した飛び先番地表(Interrupt vectors)
ATmega328P_Datasheet
これはRESET
ボタン
interrupt vectorsの対応するアドレス
にある命令を実行する


# Page. 33

![Page Image](https://bcdn.docswell.com/page/W4EZNMX4E3.jpg)

②割込み処理の例（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の例


# Page. 34

![Page Image](https://bcdn.docswell.com/page/KY768N4GEV.jpg)

②割込み処理の例（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


# Page. 35

![Page Image](https://bcdn.docswell.com/page/5G7595QXJ4.jpg)

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&amp;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の先駆けです


# Page. 36

![Page Image](https://bcdn.docswell.com/page/V9J22NPQJR.jpg)

③割込み処理の例（ 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/


# Page. 37

![Page Image](https://bcdn.docswell.com/page/5DEYYP5YEM.jpg)

④割込み処理の例（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がある）


# Page. 38

![Page Image](https://bcdn.docswell.com/page/2VJNP5NR78.jpg)

④割込み処理の例（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に割込み処理プログラムアドレスが設定され、処理を開始する


# Page. 39

![Page Image](https://bcdn.docswell.com/page/GYE93YRZE3.jpg)

④割込み処理の例（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～７
レベル)
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優先度
判定結果


# Page. 40

![Page Image](https://bcdn.docswell.com/page/5GE8M6GYED.jpg)

④ 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


# Page. 41

![Page Image](https://bcdn.docswell.com/page/MLEL39G9JR.jpg)

おわり
メカトロニクスエンジニアにとって、これからますます
必要性が増加するマイクロコントローラ（MCU)につい
ての解説も今後の予定しています。
私見ですが、ソフトウェアエンジニアがメカトロ機器を理解することは困難と思います。理解不足でそのソフト
ウェアを作るよりは、メカトロニクスエンジニアがメカトロ機器のソフトウェアを記述したほうが良いと思って
います。ただし、より抽象度の高いレベル階層はソフトウェアエンジニアに任せましょう。
これからメカトロニクスエンジニアは、マイクロコントローラ（MCU）の利用機会が増えると思います。その
ときには統合開発環境 (IDE) などを使いこなし、ソフトウェアを迅速に開発できるべきと思っています。ます
ます最近のMCUの勉強は必要不可欠になるでしょう。
41


