Windows Embedded CEのアーキテクチャ
プリエンティブ・マルチタスクOSとしてのWindows Embedded CE
さて、性能に関連して、日本で最も使われている組み込みOSはμiTronですが、Windows Embedded CEとは構造上の大きな違いがあります。それは、Windows Embedded CEが「プリエンティブ・マルチタスクOS」であるという点です。
iTronではOSの中でも本当に基本的なタスク管理、リソース管理、割り込み処理などの機能が用意されているだけで、これらの機能を使いながら必要に応じてTCP/IPなどのネットワークプロトコル、exFATなどのファイルシステム、OPEN GLなどのグラフィックシステムといった対象となる組み込み機器にあわせて必要なミドルウエアやドライバーを組み合わせてシステムを開発することになります。先ほどのCEのアーキテクチャ(図4)でいうと、KERNEL.DLLの部分が用意されているだけで、そのほかのカーネル内の機能やコンポーネントは開発者が追加・統合していく必要があります。
プリエンティブ・マルチタスクOSは厳密に期待する処理を期待したタイミングで開始、完了させることが難しいという制約があります。これは、LinuxやUnixなど他のOSでも同様ですが、これは、並列で複数のプロセス(処理)を実行させるため、予測可能性が低下するためです。
例えば、あるプロセス(アプリケーション)がUSBインターフェースを用いてセンサーとの通信を行っているとします。シングルタスク、シングルプロセスのシステムであれば、通信中の割り込み処理はほぼ予測可能です。しかし、マルチタスクの環境では、異なるプロセスが、異なる割り込みを要求することで、一定の時間内に処理することのできるデータ処理量が変わらない以上、割り込みが発生するたびに、処理時間が延びていきます。これは単位時間当たりの処理可能量は増えないにもかかわらず、処理が増えているからです。結果として、直前の処理が終わらないために次の処理が待機した状態が続きます。
しかし優先順位を変更することで強制的に処理待ちを解決する方法があります。Priority Inversionといって、Windows Embedded CEで搭載されている機能です。
図5:Priority Inversion(クリックで拡大) |
どのような時にこの機能が有効なのかというと、あるリソース(インターフェースや、メモリ上のデータ領域など)を優先順位の低いプロセスが使っている時に、より優先順位の高いプロセスが同じリソースを使用したいといった場合です。
この図ではスレッド3があるリソースを所有していますが、優先順位の高いスレッド1が同じリソースをはやく使えるようにするため、スレッド3の優先順位を強制的に高めて、他のスレッドよりも優先的に処理を行うことで、スレッド3で行われていた処理を完了させ、スレッド1に制御を移します。リソースはこの時点で優先順位を変更せずに処理を継続した場合よりも短い時間でスレッド3が所有していたリソースを解放させ、スレッド1の処理に移ることができるようになるのです。
このように、プリエンティブ・マルチタスクOSではその仕組みに準じた方法で性能や最適化を行う必要があります。とはいえ、情報処理システムの開発の現場で行われていることと考え方に大きな違いはありません。あとは、OSの違いを正しく理解することが非常に重要です。RDBMSでも製品や組み合わせによって扱い方が異なるように、組み込みOSも癖がありますので、その特徴をよくつかみ、十分理解したうえで実装する必要があるのです。
組み込み機器の割り込み処理について
さて最後に、割り込みモデルについて触れておきます。
図6:デバイスドライバーの割り込み処理(クリックで拡大) |
Windowsのデバイスドライバーを開発した経験があれば、Windows Embedded CEのデバイスドライバーの開発はそれほど難しくはありません。最適な性能を提供するには、OSの内部構造を十二分に理解する必要があります。
HAL(Hardware Abstraction Layer:メモリ空間のマッピングやタイマーなどを扱う)と呼ばれるCPUとのインターフェースの実装は、最も組み込み機器らしい部分ではありますが、それ以上にデバイスドライバーの実装は、組み込み機器の性能や機能に大きな影響を与えるため、非常に重要です。また、ソフトウエアで処理させると非常に時間がかかるものなどは、ハード側で処理して処理後のデータだけ受け渡すというようなこともよく行われます。例えば、デジタルカメラなどが代表的だと言えるでしょう。
PCなどの汎用のプラットフォームでは実現できないことを個別の要求に合わせて実装し解決するのが組み込み機器開発の醍醐味(だいごみ)でもあります。