IoT(モノのインターネット)市場が拡大する中で、エッジ側の機器制御で重要な役割を果たすことが期待されているリアルタイムOS(RTOS)について解説する本連載。第23回は、20年近い歴史を持ち、省フットプリントと高速を特徴とする古典的RTOS「scmRTOS」を紹介する。
今回ご紹介する「scmRTOS」は、最新版に当たるLatest Releaseが2021年2月のv5.2.0なので、その意味ではやや古いというか、そろそろ今後のアップデートが期待できないかもしれない境目にきているリアルタイムOS(RTOS)である。ただし、最初にリリースされたのは2003年で、そこからゆっくりと20年近くに渡ってメンテされてきたこともあり、ある意味安定したRTOSと言ってもよい。省フットプリントと高速がscmRTOSの売りであり、その意味では古典的なRTOSである。
scmRTOSの開発者はロシアのHarry E. Zhurov氏。もともとZhurov氏は、2003年頃にTIのMSP430向けに非常に小さなリアルタイムカーネルを移植する仕事をしており、その次にはAtmelのAVR8にこれを乗せ換える仕事が待っていたそうだ。このタイミングで、ちょうど使っていたIAR SystemsのEC++(Embedded C++)コンパイラがMSP430やAVR8向けにリリースされたそうで、その結果として名前空間やテンプレートといったC++のC言語に対する拡張機能が利用可能になった。
そこで、主にテンプレートをフル活用する格好で、この小さなリアルタイムカーネルを書き直した。というのは、ご存じの通りMSP430とAVR8ではアーキテクチャが全く異なるため、MSP430向けのカーネルはAVR8向けだとほぼ書き換えになってしまう。そこでテンプレートを利用することで、移植を容易にする互換性のある構造で作り替えられる、と考えたらしい。その結果として生まれたのが「scmRTOS v2」である(v1はC言語ベースのリアルタイムカーネル)。
scmRTOSは基本的にPreemptive Kernel(プリエンプティブカーネル)構成を取る。これは、他のスケジューラ(例えばRound-robinやCooperativeなど)に比べると割り込み遅延時間(というか、ISR(割り込みハンドラ)が起動するまでの待ち時間)を一番少なくすることが可能で、結果一番高速になるからという話であるが、その反面Preemptive KernelはどうしてもRAMの使用量が多くなる。
例えば、従来のPreemptive RTOS(具体的な名前が出ていないが、Preemptive RTOSの例として「μC/OS-II」と「proc」の2つが挙がっていたから、これらのどちらかだろう)をMSP430上で動かした場合、Context Sizeは28バイト、さらにNested callをかませた場合は1回当たり20バイトを消費するため、おおむね1プロセス当たり50バイト程度となり、5〜6プロセスを動かすとトータルで250〜300バイトを消費する。これは、搭載RAMが512バイト程度のMCUにはかなり厳しい。アプリケーションで利用するためのRAM容量をOSで全部消費してしまいかねないためだ。scmRTOSは、このオーバーヘッドを最小にするように設計されており、カーネルが8〜12+プロセス数×2倍と、プロセスデータは5バイトにすぎない。5〜6プロセスの場合でも47〜54バイトにとどまり、512バイトのSRAMを搭載するMCUでもメモリ容量の大半をアプリケーションに利用できることになる。
ちなみに速度については、もう少し新しいバージョンの「scmRTOS 5.0」でのプロセススイッチングに要する時間として以下のような数字が示されている。
これだけアーキテクチャがバラバラだと一概には言えないが、おおむね200〜300サイクル前後でのスイッチングが可能なので、これはかなり高速な部類に入ると思う。省フットプリントと高速性をうまく実現した(というか、省フットプリントだから高速性が実現できたのかもしれないが)実装といえる。
Copyright © ITmedia, Inc. All Rights Reserved.