
組み込みプロセッサ入門第二弾ということで割り込み処理の話をしていきます。
この記事は、システムエンベデッドスペシャリストを目指す人に向けて学習内容をまとめています。
プロセッサに関する全般的な情報はこちらを参照してください。
割り込み処理とは

割り込み処理は、実行中のプログラムを位置的に止めて別の処理を優先的に行うことです。
割り込みの種類は大きく、「外部割り込み」と「内部割込み」に別れます。
外部割り込みは、実行中のプログラム以外の外部要因により引き起こされる割り込みのことです。ハードウェアに対する外部信号が関連することが多いためハードウェア割り込みとも呼ばれます。
内部割込みは、実行中のプログラム自体により引き起こされる割り込みのことです。そのため、ソフトウェア割り込みとも呼ばれます。
外部割り込み

外部割り込みについてもう少し詳細を見ていくと、
- 機械チェック割り込み
- タイマ割り込み
- 入出力割り込み
に大別できます。
機械チェック割り込み
ハードウェアのご動作や故障を検出した際に発生する割り込みです。基本的に緊急事態なので、後述する優先順位も高く、割込み禁止もできない事が多いです。
タイマ割り込み
ソフトウェアにより、設定されたインターバルタイマにより指定時間経過後に発生する割り込みです。ソフトウェアが外部のタイマに依頼をかけているイメージなのでこちらも外部割り込みに当たります。一定間隔で決まった処理を行いたい時に使います。
入出力割り込み
外部信号の入力に伴い発生する割り込みです。マウスやキーボードによる入力もこの入出力割り込みに該当します。
内部割込み

内部割込みもまた次の3つに大別されます。
- プログラムによる割り込み
- スーパバイザコール割り込み
- ページフォールト割り込み
プログラムによる割り込み
プログラムによる実行時エラー時に発生します。つまり、やっちゃいけない操作をするプログラムを書いてしまった時に発生します。
具体的には
・ゼロによる割り算を実行した場合
・演算でオーバーフローが起きた場合
・存在するが、プログラムによりアクセスが許可されていないメモリにアクセスしようとした場合
などがあります。
スーパバイザコール割り込み
プログラムからOSに対して入出力処理を依頼した場合に発生します。システムコール割り込みとも呼ばれます。
ページフォールト割り込み
物理メモリ上に存在しないメモリにアクセスしようとした場合に発生します。
割り込みオーバーヘッド

割り込みによる処理の分岐はとても便利なのですが、デメリットもあります。
それが、割り込みに伴い発生する余計な処理及び時間のことで、割り込みオーバーヘッドと呼ばれます。
具体的には、割り込み発生時には前処理として、直前の処理の場所やその状態をスタックに保存し、データの退避を行います。また、後処理として、退避していた情報をもとに、元の処理に戻る時間が発生します。
すなわち、割り込み頻度が多いシステムだとオーバーヘッド時間の累積でパフォーマンスの低下が発生します。
その際は、ポーリングとの併用を検討しましょう。
ポーリング

ポーリングは状態を一定間隔で監視する処理です。
例えば、ボタンが押されている間だけLEDをつけるような処理では、図に示したようにCPUが一定時間間隔でボタン状態を確認し、確認した瞬間のボタン状態の応じてLEDをつけたり消したりします。
見に行ったときに、LEDの操作するためボタンを押した瞬間には反応しません。ポーリングの感覚はプログラムにより決定します。
この例でわかるように、即性の高い処理では、ポーリング間隔を短くする必要があります。一方で処理頻度が一定なので、ソフトも簡単で管理しやすいです。
割込み禁止

ここまで紹介してきた割り込みですが実はソフトウェア側で禁止にすることも可能です。
ソフトウェアにより割り込みを禁止できるものをMI(Maskable Interrupt)、禁止できないものをNMI(Non-Maskable Interrupt)と呼びます。
NMIは主として、システムの致命的障害やNMI用端子の信号など重要度の高い割り込みが該当します。また、後述する優先度も最高なことが多いです。
多重割り込み

割り込み中にさらに割り込みが発生したらどうなるでしょうか?多重割り込みと呼ばれますが、多重割り込みを禁止する場合と許可する場合があります。
多重割り込みを禁止する場合は割り込みA中に発生した割り込みBは割り込みA終了後に実施されます。
また、多重割り込み許可の場合に割り込みA中に発生した、割り込みAよりも優先度の高い割り込みBが発生した場合は、割り込みAの処理を中断し、割り込みBの処理が実行されます。
まとめ
組み込みエンジニアとして、プログラムを作る上で切っても切れない、割り込み処理についてまとめました。
もっと、ここを掘り下げてほしいなどご要望が有りましたらコメント下さい。
次回は、IOマップへのアクセス方法についてまとめます。