ITRONとWindows CEの違いについて

語りたいと思う。
まず、Windows CEの同期機構だが、イベントフラグはないものの、イベントオブジェクトという仕組みがある。これはCreateEventによって動的に生成することができる。この仕組みによりイベントによる待ち合わせができる。さらにセマフォ(CreatSemaphore)、ミューテックス(CreateMutex)、クリティカルセクション(InitializeCriticalSection)といったスレッド間同期の仕組みを使うことができる。ITRONに慣れた方にとって唯一困るのがメールボックスかもしれない。NT系 Windowsではメールスロットという仕組みがあるが、Windows CEにはない。しかしこれは、Windows CEの各種同期機構を組み合わせて比較的簡単に実現することができる。実際、私もITRONからWindows CEに移行する開発チームのためにWindows CE版のメールボックス機構を作ったことがある。
さらにもうひとつの大きな違いは、割り込み処理機構だ。ITRONでは割り込みハンドラという実装だろう。皆さんもご存知の通り、割り込みハンドラの実態は割り込みルーチンだ。かつては、この割り込みルーチンに何でもかんでも処理を詰め込む傾向があった。実際、私なども、シリアル通信にてENQ/ACK/NAKのコンテンションプロトコルを埋め込んだものだ。ENQを受信してからACKが出てくるまでの応答が凄いだろう!なんて馬鹿なことで酔いしれていた。今からしてみれば、お恥ずかしい限だ。
ITRONの登場のころから、「割り込みルーチンに処理を詰め込むのは野蛮だよね!」と言った考えあり、とにかく割り込みルーチンの中での割り込み処理は最低限にして、優先度の高いスレッドで多くの処理をさせることが良いとする傾向になってきた。この優先度の高いスレッドのことを「割り込みスレッド」と呼んでいたような気がする。(ITRONの言葉かどうかは定かではないが、もしかしたらiRMXのことかもしれない)しかし、今ではそのような割り込み処理の思想が主流になった。
さて、Windows CEではこの割り込みハンドラに相当するのがISRだ。ISRは通常OAL(OEM Adaptation Layer)の中に組み込まれている。OALとはNT系 Windowsで言うところのHAL(Hardware Abstraction Layer)に相当する部分だが、大きな違いはWindows CEのOALはOEMよって移植され、ユーザにて改版することができることである。勿論このOALの中のISRに割り込み処理を埋め込むこともできるが、Windows CEでは、ドライバのスレッドとして割り込み処理を実装するIST(Interrupt Service Thread)という仕組が用意されている。これは先ほどの話ででてきたITRONの「割り込みスレッド」に相当するものだ。Windows CEでは、割り込みルーチンに多大な処理をさせないという思想が、ISTという仕組みで実現されている。往々にして、このことが、Windows CEでは割り込み処理のオーバヘッドが大きいといった誤解を生んでいるようだが、実際にはエンジニアの判断によってISR、ISTを適切に実装してあげれば、殆どの問題は解決することができる
Hiroyuki Shimizu/CodeGear,Inc.