「組み込み」ならではの基礎知識 ――スタートアップ・ルーチンからハードウェアまで
●サンプル・プログラム
組み込みソフトウェアも,ポーリングと割り込みを組み合わせて作られています.
ポーリングを使ったプログラムは次のように書きます.
main() { 初期化 以下を繰り返す { 事象を調べる 条件を満たしていたら処理する } }
実際のプログラムでは,ポーリングはwhile文などでループを回し,その中に御用聞きのしごとを書くことで実現します.事象の処理時間を算出して,事象を調べる間隔(ポーリング・サイクル)を上回らないよう配慮しなければなりません.複数の事象を調べてそれぞれ対応した処理を実行しなければならないときは,特に注意しましょう.
割り込みを使ったプログラムは次のように書きます.
// main関数(割り込まれる側) main() { 初期化 以下を繰り返す { 割り込み禁止 割り込まれてはならない処理 割り込み許可 割り込まれてもよい処理 } }// 割り込み処理
interrupt()
{
割り込み処理で使う資源を待避する
割り込み処理本体
待避していた資源を復帰させる
}
割り込みでは,CPUがあらかじめ持っている割り込みのしくみを利用します.CPUは割り込み信号を受け付けたら,割り込みが入らなかった場合に実行されるはずだった番地をスタックに積みます.そして,割り込み処理の内容が記述されている番地注6-1をプログラム・カウンタにセットすることで割り込み処理ルーチンに「ジャンプ」し,処理を進めます.割り込み処理の終わりを示す割り込み復帰命令を実行すると,CPUはスタックに逃がしておいた番地を取り出してプログラム・カウンタに入れ,なにごともなかったかのように以前のしごとに戻ります.もちろん,戻ったときに困らないように,割り込み処理を実行するところで,今まで使っていたメモリやレジスタの内容を保存しておきます.割り込み処理が終わったら前の状態に戻します.
注6-1;割り込み処理ルーチンの番地(割り込み信号が入ったときに実行される番地)は,スタートアップ・ルーチンでシステム全体を初期化するときに登録する.この登録がないと,割り込み信号が入ったときに制御が割り込み処理ルーチンに移らない.