割り込みと聞いて、何を思い浮かべるか....
(1) サービスエリアでお手洗いの行列を無視する、おばちゃんとか...
(2) コンビニのレジで、やっぱり順番を守らない、怖いおじさんとか...
などであろうか。
いずれも、それまでの順番を無視して、自分の仕事を先行して処理させる事であり、コンピュータでは、この様な処理を「割り込み」(interrupt)という。
もう少し別の言い方をすると、
(1) 通常処理があって、順番に実行中に、
(2) 何らかの出来事(イベントと言う)が発生し、
(3) イベントに対応するため、通常処理を中断して、割り込みハンドラを起動し、こちらを実行する。
(4) 割り込みハンドラが終了したら、中断していていた通常処理を再開する。
という流れで処理が行われる。
割り込みの要因となるイベントには、キーボード、マウスの入力とか、待ち状態に入っていたハードウエアからの応答、タイマなどがある。
以上を図にすると、以下のようになる。
なお、割り込みと良く似た動作(用語と言った方が正確かもしれない)に「例外」と言うのがある。例外には、「ソフトウエア例外」、「ハードウエア例外」があるが、
・「ソフトウエア例外」は、トラップ命令という特別な命令(一般的には、アセンブラで記述する)を使って、割り込みハンドラを呼び出す処理
・「ハードウエア例外」は、イベントの発生によって割り込みハンドラを呼び出す処理(=割り込み)
となる。「例外」と「割り込み」の用語の使いかたは、CPUによって若干の差があるが、「例外」は、「割り込み」を包含する概念として使われる事が多い。なお、「例外」は英語でexception(イクセプション)と表現する。
実際の動作
C言語で書かれたプログラムでは、割り込みの動作はイマイチ見え難い(そんなことないって?)。割り込みの動作は機械語(=アセンブラレベル)で行われているので、細かい事を言い出すと、アセンブラの知識がないと歯が立たない。そんなこと言っても、煙に巻かれるばかりなので、おおざっぱに動作を俯瞰すると、
と言うことになる。
AVRマイコンとC言語を用いたプログラミングの実際については、こちら。
H8マイコンとC言語を用いたプログラミングの実際については、こちら。
使用上の注意
割り込み処理を設計する際の注意事項として、割り込みイベントの発生頻度と、割り込みハンドラの処理時間の関係に留意する必要がある。例えば、
①イベント発生の間隔 >> 割り込みハンドラの処理時間 |
であれば、何の問題もないが、
②イベント発生の間隔 ≧ 割り込みハンドラの処理時間 |
だったり、
③イベント発生の間隔 < 割り込みハンドラの処理時間 |
だったりすると、不可解なバグに悩まされることになる。③の場合、割り込みハンドラの処理が終わらないうちに、次の割り込みが発生してしまうので、おかしなことになるのは自明である(あえて、この様に設計する場合もあり得るが)。②は一見すると、問題なさそうではあるが、割り込みハンドラの処理によっては、危険が生じる可能性がある(機械語レベルで実行時間=マシンサイクル.. を計算するスキルがあれば、別であるが、普通は、そんな面倒なことはやってられない)ので、慎重に設計する必要がある。
イベント発生の間隔 ≦ 割り込みハンドラの処理時間 |
については、言わずもがなである。