割込みハンドラのプログラミングは、割込み実現の形式にいろいろなバリエーションがあるので、回路図を呼んで各コントローラの割込み出力線がどのようにCPUにつながっているかを見て行う必要があるようです。



①IRQが複数存在する仕組み
IRQ0~IRQ3が4つも用意されていて割込みに対してリッチな仕組みになっています。
$OS自作してみる。-w1

ピンとコントローラは1対1で、ピンごとに割込みベクタが用意できるようなので、コントローラ専用の割込み管理をする場合に向いているようです。

(割込みベクタは後述しますが割込みに対してどんな処理を実施するか関数アドレスの対応付けがされている部分でそれを複数管理できるために配列になっているところ)

あるコントローラから割込みがある場合に、別の割込みを受け付けないなど、割込みに対して優先度をつける設計に向いているようです。


②IRQが1本でOR論理で統合する仕組み
IRQが1つだけあり、そのIRQにはOR論理で複数のコントローラからの割込み出力が統合されている仕組みになります。
$OS自作してみる。-w2

どこかのコントローラで割込み出力がされればIRQが割込みすると検知できるわけですが、漠然と割込みがあるんだなと把握できるだけで、どこのコントローラからの要求でどんな割込みを実施するかが分かりません。

そのようなときは、とりあえず割込み処理として最初に各コントローラで用意している割込み関連のレジスタを参照しにいきハンドラ内部で割込み要因を調べる必要があります。

割込み要因が判明したあと、割込み要因に対応した処理を実施します。

いわば、①割込み要因調査、②要因に対応した処理実施の2段階で処理を実施することになります。


③IRQが1本で割込みコントローラで統合する仕組み
$OS自作してみる。-w3

②と系と似ていますが、OR論理のところが割込みコントローラになっています。

割込みコントローラは、内部にレジスタを持ちどのコントローラからの割込み出力がされたかを記憶することができるので、②のようにコントローラに割込みあると聞きまわらないで済むところがメリットとしてあります。

割込みの要求のあるコントローラントの判定は割込みコントローラを備えたことで分かるのですが、割込みの詳細の理由はコントローラの割込み関連のレジスタに聞きに行く必要があるようです。

その他に割込みコントローラを持つメリットとしては、各割込みの有効/無効化(割込みマスク)や優先度の制御を実施でき、それらを一元管理できるところです。

どんなときに割込みが発生される必要があるのか、割込みを起こす必要のある原因となる現象のことを割込み要因といいます。

①外部割込み/ハードウェア割込み
外部ハードウェアによって割込み線がアサートされることで発生する割込み
・タイマ割込み:タイマ・コントローラに設定した時刻が満了した
・シリアル受信割込み:シリアルから文字を受信した

②リセット
電源ONも割込みの1つよして扱われ、電源ON時に実行される割込みで、H8ではリセット割込み入力(RES)がLowからHighになったときリセット割込みが発生します。RES端子は電源電圧に接続されており、さらにコンデンサを挟んでグラウンドに接続されています。
・リセット・割込み:リセット・ボタンが押された

②内部割込み/ソフトウェア割込み/例外
不正メモリ・アクセスやゼロ除算などによりCPU内部で発生する割込み
・ゼロ除算例外:ゼロ除算が行われた
・不正アドレス・アクセス例外:不正なアドレスにアクセスした

③システム・コール割込み
システム・コール命令やトラップ命令などによりプログラム側から「わざと」発生させる割込み
・システム・コール割込み:システム・コール命令が実行された
・トラップ割込み:トラップ・命令が実行された/デバッグのために特定の箇所でプログラムの実行をブレークしたい場合などの利用

割込みとはなにか?

CPUにはピンがあります。

そのピンに信号が入るとソフトで用意した関数を処理する仕組み、それが割込みです。

アプリケーションのソフトを作成時に、CPUのピンなんて普通意識しません。(少なくとも私は意識したことはありません。)

そのような仕組みがいわば、CPU(ハード)とソフトの特別な関係によって実現する処理になります。

イメージがわかるように具体的に割込み手順を見てみます。

①リアル・コントローラが文字受信した際には、シリアル・コントローラが割込み出力線(IRQに情報を送信するためにコントローラ側が用意しているピン)に信号を出力します。

②CPUは割込み入力でこの出力信号を検知することでCPUに割込みが通知され、CPUが割込み処理に入るという動作になります。

多くのCPUで用意される割込みのためのピンにはIRQという名前がついているようです。

ソフトはCPUあってはじめて存在するものだと思うので、親子関係でいうと親がCPUでソフトが子。

ソフトはアセンブラ言語に見えるようにCPUに処理してほしい流れを記述して示すわけですが、親であるCPUはその処理の流れ通りに処理をしたり、時には止まらせてその処理の流れ以外の流れをに変更できる権限の強さと仕掛けがあるという解釈をしておくことにします。


CPUのピンと関数呼び出しの仕掛けがあることで、ソフトでポーリングを実施するときに生じるCPU浪費をなくすことに成功しているようです。