2007-01-27

組込みソフトの作り方[2]

組込みソフトの作り方[1] で、マイコンが登場したとき(1980年代前半)マイコンはハードウェアデバイスのシーケンスをトレースするために使われていたと書いた。マイコンはトレースする順番が変わってもROM上のプログラムを書き換えることで対応できるので重宝された。

マイコンに求められたシーケンス制御の次のステップは、リアルタイム性の実現だった。

リアルタイム制御システムで必ず必要になるのが“割り込み”の機能だ。

組込み機器の多くは、外界の状況変化にともなって制御シーケンスの流れを変える必要がある。いつも同じ処理をぐるぐる回していればいいような機器はあまりない。

このような外部状況の変化を察知して、制御シーケンスの流れを変える場合の一番簡単な方法はポーリングである。

外部状況をセンシングしその様子をマイコンの入力ポートで見られるようにし、このポートの状態をウォッチし続ける。そして状態が変化したら、これまでやっていた制御シーケンスの流れを変える。

ここで大事なのは、一般的なマイコンはコアとなるプロセッサはひとつであり、同時に2つのことはできないということだ。同時に2つのことはできないから、外部状況の変化を知るためには、たまに今やっている仕事を中断して外部の様子を見に行かなければいけない。

割り込みの機能を使わない場合、組込みソフトエンジニアはよく簡易モニタというしくみを使っていた。簡易モニタとは定常的にぐるぐる回るループを用意しておき、このループの中で外部状況の変化をウォッチしておき、外部状況の変化を察知したら制御シーケンスが書かれたサブルーチンに飛び、その処理が終わったらまたループに戻るというしくみだ。

外部状況が変化したときに、サブルーチンに飛ばさずにフラグを立てておいて、ループの切りの良いところで処理を行うという方法もあった。このやり方を新人のときに覚えてベテランになった組込みソフトエンジニアはグローバル変数を使ってフラグ処理を多用する者が多い。このグローバル変数を使ったフラグ処理を多用すると、フラグを通じて関数と関数の結合度が強くなってしまうためキレの悪いソフトウェアシステムができあがってしまう。

最初からオブジェクト指向言語でプログラムを書き始めたソフトウェアエンジニアがこのようなプログラムを見ると仰天するかもしれないが、この風習は組込みソフトの歴史がそうさせたともいえる。

さて、ループ処理で外部の変化を察知するやり方はリアルタイム性が強く求められるシステムには向かない。この問題を解決するためには、割り込みの機能が必要になる。

だから、初期のマイコンでは何はなくとも割り込みコントローラは付いていた。割り込みが発生したときに、今行っている処理を横に置いておいて、割り込み専用の処理を走らせることができる。(もちろん、それまで使っていたレジスタはスタックに退避しておく)

割り込みが使えるようになると、リアルタイム性をそれほど必要としない、ぐるぐる回る定常処理+割り込み処理という組み合わせで、ほとんどのことができるようになる。

これが、マイコンがシーケンス処理からリアルタイム制御のコントローラにステップアップした瞬間だ。

この後のマイコンの変遷は 組込みソフトの作り方[3]で紹介する。

0 件のコメント: