割り込みとは何者ぞ

割り込みと聞いて、何を思い浮かべるか....

(1) サービスエリアでお手洗いの行列を無視する、おばちゃんとか...
(2) コンビニのレジで、やっぱり順番を守らない、怖いおじさんとか...

などであろうか。
 いずれも、それまでの順番を無視して、自分の仕事を先行して処理させる事であり、コンピュータでは、この様な処理を「割り込み」(interrupt)という。

 もう少し別の言い方をすると、

(1) 通常処理があって、順番に実行中に、
(2) 何らかの出来事(イベントと言う)が発生し、
(3) イベントに対応するため、通常処理を中断して、割り込みハンドラを起動し、こちらを実行する。
(4) 割り込みハンドラが終了したら、中断していていた通常処理を再開する。

 という流れで処理が行われる。
 割り込みの要因となるイベントには、キーボード、マウスの入力とか、待ち状態に入っていたハードウエアからの応答、タイマなどがある。
 以上を図にすると、以下のようになる。

 なお、割り込みと良く似た動作(用語と言った方が正確かもしれない)に「例外」と言うのがある。例外には、「ソフトウエア例外」、「ハードウエア例外」があるが、

  ・「ソフトウエア例外」は、トラップ命令という特別な命令(一般的には、アセンブラで記述する)を使って、割り込みハンドラを呼び出す処理
  ・「ハードウエア例外」は、イベントの発生によって割り込みハンドラを呼び出す処理(=割り込み)

 となる。「例外」と「割り込み」の用語の使いかたは、CPUによって若干の差があるが、「例外」は、「割り込み」を包含する概念として使われる事が多い。なお、「例外」は英語でexception(イクセプション)と表現する。
 



実際の動作

 C言語で書かれたプログラムでは、割り込みの動作はイマイチ見え難い(そんなことないって?)。割り込みの動作は機械語(=アセンブラレベル)で行われているので、細かい事を言い出すと、アセンブラの知識がないと歯が立たない。そんなこと言っても、煙に巻かれるばかりなので、おおざっぱに動作を俯瞰すると、

  1. 通常の処理が動作している最中に、
  2. 割り込みイベントが発生すると、その割り込みを受け付けてよいか判断(割り込みを禁止する事を、割り込みをマスクすると言う)し、
  3. 現在実行中の命令のアドレス(プログラムカウンタと言うレジスタの値)とCCRレジスタを、スタックに記憶(これを、スタックに積むと言う)し、
  4. 割り込みベクタテーブルから、該当する割り込みハンドラのアドレスを読み取って、プログラムカウンタ(PC)に、その値を設定する.... これで、処理が割り込みハンドラに移る。
  5. 割り込みハンドラの処理が終了する時に、rte命令(割り込みハンドラからのリターン)を実行する。すると、3でスタックに積んだ、CCRとPCの値を取ってきて、それぞれのレジスタに設定する。(これで処理が1の通常の処理に戻る)

 と言うことになる。

 AVRマイコンとC言語を用いたプログラミングの実際については、こちら

 H8マイコンとC言語を用いたプログラミングの実際については、こちら

 



使用上の注意
 

 割り込み処理を設計する際の注意事項として、割り込みイベントの発生頻度と、割り込みハンドラの処理時間の関係に留意する必要がある。例えば、

 ①イベント発生の間隔 >> 割り込みハンドラの処理時間

であれば、何の問題もないが、

 ②イベント発生の間隔 ≧ 割り込みハンドラの処理時間

だったり、

 ③イベント発生の間隔 < 割り込みハンドラの処理時間

だったりすると、不可解なバグに悩まされることになる。③の場合、割り込みハンドラの処理が終わらないうちに、次の割り込みが発生してしまうので、おかしなことになるのは自明である(あえて、この様に設計する場合もあり得るが)。②は一見すると、問題なさそうではあるが、割り込みハンドラの処理によっては、危険が生じる可能性がある(機械語レベルで実行時間=マシンサイクル.. を計算するスキルがあれば、別であるが、普通は、そんな面倒なことはやってられない)ので、慎重に設計する必要がある。

  イベント発生の間隔 ≦ 割り込みハンドラの処理時間

については、言わずもがなである。

 

最終更新:2015年04月16日 15:29
添付ファイル