tshimizu's diary

日々の記録

組み込みOS(第7回)

ステップ7の内容

割り込み処理を実装する。前回までのシリアル入力の受取りはビジー・ループによって行われていたが、今回はシリアル割り込み処理によるものに変更する。

割り込み入力ピン

部割り込みに対しては、ピンへの入力によって割り込みハンドラを呼び出す。
ピンの数が外部からの割り込み出力の種類より多い場合はそれぞれのコントローラにピンを割り当てればよい。しかし、ピンが1つしかない場合は、複数のコントローラの出力のORをピンへの入力とし、各コントローラの持つ割り込み関連のレジスタを、ハンドラ内で調べて処理を変更する。

割り込みコントローラ

複数の出力をOR論理で結合してピンに伝えるが、それぞれの割り込みの優先度などの制御ができる。

割り込み処理の流れ

割り込みが発生すると、プログラムカウンタの値を、割り込みベクタに登録してある割り込みハンドラへのアドレスに書き換える。
このとき、もとのプログラムカウンタの値は自動的にスタックや専用レジスタに保存される。(保存先はCPUによってことなる。)同時に、モード・レジスタの値も保存され、自動的にモード・レジスタの設定は割り込み禁止に変更される。
割り込みハンドラの最後では、プログラム・カウンタとモード・レジスタの状態を復帰させる処理を行う。

H8の仕様

CCR

H8では、モード・レジスタの機能をもつCCRというレジスタがある。CCRはモード・レジスタの役割の他にも、フラグ・レジスタの役割も担っており、各桁のビットがそれぞれの役割を果たしている。

PCとCCRの保存先

割り込みが発生した時の、プログラム・カウンタとCCRの保存先は、スタック・ポインタ(PC)のER7レジスタになる。ER7の指す先のアドレスの上位1バイトにCCR、下位3バイトにPCの値が格納される。

割り込み復帰方法

プログラム・カウンタとCCRの値を復旧させるrte命令を、割り込みハンドラの最後で呼び出す。

インライン・アセンブラ

C援護のプログラムの中で、アセンブラを記述るためのもの。
今回は、ブートローダのプログラム中でCCRを操作するために使用する。


12ステップで作る組込みOS自作入門

12ステップで作る組込みOS自作入門