「組み込み」ならではの基礎知識 ――スタートアップ・ルーチンからハードウェアまで
5 時間の制御問題(同期と非同期呼び出し)
組み込みソフトウェアで目的の機能を実現しようとするときに必要なのが,時間にかかわる制御です.そして,時間にかかわる問題をじょうずに設計するときに役立つのが「非同期呼び出し」という技術です.
実は,へたな設計でもよいという場合には,この技術は不要です.読者の皆さんにはぜひじょうずな設計技術を身に付けていただきたいので,ここで説明します.
組み込みシステムでは,(コンピュータから見て)外の世界のようすや状態の変化に応じて次の動作を決める場面が数多く存在します.例えば,家庭用のエアコンは,100Vが通電されていてもふだんは何もしません.室温を表示する以外はひたすら待機しています.運転ボタンが押されて初めて,冷暖房の動作を始めます.
このように,組み込みシステムでは「外界の変化が生じるまで待機する」という動作が必要になります.同期/非同期呼び出しは,その動作を実装する前段階の設計概念です.
●同期呼び出し
時間にかかわる説明の前に,時間にかかわらない設計を考えてみましょう.例えば,パソコンなどで数学的な計算問題を処理する場合,通常,計算に必要な最初のステップのデータがそろってからプログラムを起動します.この場合,起動後にあらためて何かの変化を待つ(変化が起きるまで何もしない)という状況を考慮する必要はないわけです.
計算の式が複雑であったり,計算のステップで同じ式を何ヵ所かで適用する場合,C言語では同じ式を関数としてまとめ,プログラム中からその関数を呼び出すように記述します.「1.プログラムはどのように動くのか」のところで出てきた階乗計算などが良い例です.
以下に,階乗計算の関数factを何度も呼び出す関数fooの例を示します.
long foo(a,b){ ... x=fact(a); y=fact(b); z=x/y; return z; }
この例では,xに代入する階乗計算値はfact(a)が呼び出されると同時に計算されます.この計算が後回しにされることはC言語の仕様からいってありえません.すなわち,zを求める計算であるx/yを実行する時点で,xとyの値は確定しているわけです.これを構造化設計手法で図示すると,図5-1のようになります.
このように,関数factを呼び出す式を実行すると同時に関数factが実行されるという約束にある呼び出しを,設計上の用語として「同期呼び出し」といいます.