「組み込み」ならではの基礎知識 ――スタートアップ・ルーチンからハードウェアまで
●非同期呼び出し
「非同期呼び出し」とは,ある実行場面で特定の関数fooが呼び出されても,その実際の実行は別のタイミングで行われる可能性がある場合に使う表現です.つまり,呼び出しの時期と実行の時期が同期していないので,非同期呼び出しと言うのです.
冒頭に挙げたエアコンの例で,ボタンを押されたという外部イベントが生じて初めて暖房運転する関数(例えばheating())が実行されるようにしたいという場合がこれにあたります(図5-2).
このように説明すると,C言語をご存じの皆さんは「ボタンの押下を検出する入力レジスタを繰り返しチェックして,押されたとわかってからheating()を呼べばよいのだから,非同期呼び出しは不要だ」と思われるかもしれません.また,「割り込み関数の宣言を使うことと何が違うのかわからない」という方もいらっしゃることでしょう.
ここでおもしろいのは,実務上,このボタン押下に対処するには,
a)ポーリングを繰り返し実行してボタン押下を検出する
b)ボタン押下をハードウェア割り込みとして検出する
c)OSやJavaVMにボタン・デバイスの変化を検出させる
など,いくつもの手法が存在することです.そして,その手法のいずれを使うかは,要求されるボタン押下の検知速度や検知の信頼性,採用した言語,開発容易性などの複数の要因で決まります(たかがボタン,されどボタン).ちなみに,上記の3種類の実装方法のうち,a)は同期呼び出し,b)は完全な非同期呼び出し,c)は不明(OSやJavaVMの実装によって異なる),というのが現実です.
ところが,設計実務をこなしているとき,こうした検知のしくみを細かく検討する前に考えるべきことはまだたくさんあります.例えば,押下を検出した直後に何をするべきかは重大な問題です.吸気口が詰まっているのに予熱の処理を行ってしまったら火事のもとです.検出の方法をあれこれ考えるより先に,予熱の準備手続きとして,通気性チェックなど(仕様書に書いてある方法)を実行する関数を呼び出しておくべきでしょう.