読者です 読者をやめる 読者になる 読者になる

【組込OS自作入門】7thステップのメモ

基本概念の勉強

割り込み処理

3つの要点

  • 割り込み発生時に実行させたい処理を、割り込みハンドラとして登録しておく
  • 割り込みが発生した際には、現在実行中の処理を中断し、登録しておいた割り込みハンドラが実行される。
  • 割り込みハンドラの実行後に、中断していた本来の処理に戻る。

この最後の本来の処理に戻るために、一般的なCPUでは、

の2つを割り込み発生時に退避させる。

H8/3069Fの割込みベクタ

H8はベクタ割込み方式を採用している。
割込み発生時には割込みベクタを参照し、そこに登録された割込みハンドラにジャンプする。

H8/3069Fでは、モードレジスタに相当するものとしてCCR(コンディションコードレジスタ)という1byteのレジスタを持っている。

H8の割込み発生時の動作をまとめると以下になる

  1. 割込み発生時には、スタック上に、PCとCCRの値を保存する
  2. その後、割込み要因に応じて割込みベクタを参照し、割込みハンドラにジャンプする(PCに割込みベクタの値を代入する)
  3. 割込みハンドラが実行される(ユーザ側で用意したハンドリング処理を行う)
  4. 割込みハンドラの終了時には、割込み復帰命令(rte)を呼ぶ。これによりスタックからPCとCCRの値が復旧されて戻り、中断していた箇所から実行が再開される。

実装

割込みベクタの位置は、メモリの先頭アドレスである0x000000以降の256バイト(0x000000~0x0000ff)
割込みベクタはROM上にあるので、割込みベクタの内容を決め打ちで設定しておく。

つまり、OS側の割込みハンドラのアドレスは固定となる。
なかなか融通がきかない。
また、割込みベクタ64コに固定の割込みハンドラを割り当てると、かなりのサイズになってしまう。

そこで実装は以下の方針とする。
ブートローダ側で割込みハンドラを用意する。その中でRAMのOS側の割込みハンドラへ飛ぶようにする
つまり、二段階の構成とする。

  • 割込みベクタ(ROM)を見ると、ブートローダ側の割込みハンドラのアドレス(RAM)が書いてある。
  • ブートローダ側のハンドラでは、いくつか用意してあるOS側のハンドラへ飛ぶ。(こちらをソフトウェア割込みベクタとよんでいる)
  • OS側のハンドラはmain()の中で設定しておく.

ソフトウェア割込みベクタは3種類用意する

疑問

割込みベクタとか内蔵ROMとか内蔵RAMとかアドレス空間はどうやって決めたのか。
…でもよく考えたら、それを電子回路で割りつけているという話だった。