組み込み開発では、PC上でのプログラムに比べて並列性が求められることが多い。
- 何かを処理中、ユーザーの操作を禁止することが出来ない。
- リアルタイム性が求められる処理が多い。
- 非同期な処理を同期なAPIでラップするためのフレームワークがきちんと整備されていない。というか、ドライバモデルすら無い(ITRONの場合)
このため、プログラムは非常に複雑になる。たとえば、デジカメで静止画を撮影するときのLSI制御では、
void 静止画記録(RawImage *raw) { YuvImage yuv = ConvertRaw2Yuv(raw); JpgImage jpg = ConvertYuv2Jpg(yuv); string filename = Dcf.GetNextFilename(); File f = File.Open( filename, "wb" ); f.write( jpg.GetBytes() ); f.close(); }
となるのだが、これが非同期になると、
YuvImage yuv; JpgImage jpg; File f; void 静止画記録(RawImage *raw) { ConvertRaw2Yuv(raw,yuv); } void OnConvertRaw2Yuv(void) { ConvertYuv2Jpg(yuv,jpg); } void OnConvertYuv2Jpg(void) { string filename = Dcf.GetNextFilename(); File f = File.Open( filename, "wb" ); f.write( jpg.GetBytes() ); } void OnFileWrite(void) { f.close(); }
処理の流れがコマ切れになってしまった。このプログラムに、状態管理を加えて、状態に合わせたOn〜()を呼ぶようにして、エラー処理を加えて、ファイル書き込み中に次のRAWデータの処理を開始できるようにして・・・とすると、同期APIを使ったときのプログラムに比べて、見通しが非常に悪くなる。しかも、C言語で実装してるから、非同期処理中に覚えておかないといけない情報とか状態変数とかがどんどんグローバル変数になっていく。
同期APIを使用するバージョンのプログラムだと、エラー処理を組み込むのも簡単だし、スレッド化すればファイル書き込み中に次のRAWデータの処理を始めるのも超簡単だ。
うちの開発では、ITRON+C言語なうえ、開発者の殆どが知識不足(Javaや.NETでアプリケーションを組んだ経験のある人はごく少数)なので、こういった基礎的な仕組みを入れていくのが非常に大変だ。
SymbianOSとかならもっと楽なのかなぁ・・・。