AVRマイコンで動作する軽量RTOS「FunkOS/Mark3」は勉強や遊びに最適!?:リアルタイムOS列伝(31)(1/2 ページ)
IoT(モノのインターネット)市場が拡大する中で、エッジ側の機器制御で重要な役割を果たすことが期待されているリアルタイムOS(RTOS)について解説する本連載。第31回は、ほぼ独力で開発された軽量RTOS「FunkOS/Mark3」を紹介する。
今回ご紹介する「FunkOS/Mark3」は、実体的にほぼ1人の開発者によって開発されているリアルタイムOS(RTOS)だ。ついでに言えば知名度も非常に低い。
全機能を使ってもメモリフットプリントは5KB弱
Mark Slevinsky氏が「FunkOS」というRTOSの開発に着手したのは2008年のことである。最初のターゲットMCUはAVRとMSP430で、特にAVR向けはいろいろと機能が充実していた。2009年に最初バージョンであるR1(Andromache)がリリース。続いて同年11月にはR2(Bacchus)、2010年3月にR3(Cactrot)がリリースされている。このR3では、プラットフォームハードウェアとしてAVRの他にCortex-M3とMSP430に対応した。開発環境も、Cortex-M3がGCCとKeil IDE、AVRがCodevision/GCC/IAREW(IAR Embedded Workbench)/ICCv7(Imagecraft C)、MSP430がCCS(Code Composer Studio)とIAREWに対応、ということで結構充実している。
以下に、FunkOSそのものの特徴を挙げてみよう。
- 最大255レベルのプライオリティ制御、タスク数無制限(メモリが許す限り)
- 同一プライオリティのタスク同士はRound-robinで制御
- Time Sliceをサポート。またオプションでWatchdog Timerをサポート
- タスク当たりのスタックサイズをそれぞれコンフィギュレーション可能
- MutexおよびBinary/Counting Semaphoreを搭載
- Event queueはThread safeな形でタスクごとに設定可能
カーネルそのものはプリエンプティブな構成ではないが、R3にはオプションでPipsqueak Nano-Kernelと呼ばれるプリエンプティブなミニマルカーネルも同梱されており、こちらに入れ替えればプリエンプティブな動作が可能になった(サポートされるAPIに若干制約が入るが)。
むしろFunkOSの焦点は完璧なプリエンプティブ動作ではなく、さまざまなプラットフォームへの容易な移植とオーバーヘッドの最小化にあった。R3の場合、Atmel ATMega328を使ったケースでのメモリのフットプリントは、全機能を搭載した状態で以下のようになっている。
機能 | 概要 | メモリフットプリント |
---|---|---|
driver | Device driver infrastructure | 478バイト |
heap | Fixed-block dynamic memory | 280バイト |
message | Simple Inter-process communications | 386バイト |
mutex | Resource-protection locks | 468バイト |
plumber | Complex inter-process communications | 1054バイト |
semaphore | Thread synchronization object | 446バイト |
task | FunkOS portable kernel | 802バイト |
(port) | Port-specific functions | 696バイト |
timer | Lightweight threads and periodic events | 228バイト |
watchdog | Software watchdog interface | 188バイト |
合計 | − | 5026バイト |
表1 FunkOS R3のAtmel ATMega328におけるメモリフットプリント |
ATMega328のフラッシュ容量は32KBだから、5KB弱ならアプリケーションを書くのに十分なゆとりが残っているといえる。実際にはここまで全機能を使うことはなく、そうなるとさらにメモリのフットプリントは減る。実際にWinAVR GCCコンパイラを使ってビルドしたケースでは3万2600バイトのフラッシュと2014バイトのSRAMがアプリケーションから利用可能で、Pipsqueak Nano-Kernelを使った場合は3万904バイトのフラッシュと1648バイトのSRAMが利用可能だったとされている。SRAMが2KB、フラッシュが32KBのMCUとしては十分な容量としてよいかと思う。
移植の容易性に関して言えば、実験的ではあるもののカーネルをC++で書き直したKernel++というコンポーネントがFunkOS R3には同梱されている。こちらは機能がほぼFunkOSそのままであり、APIがC++対応になったというだけで、対応環境もAVR+GCC(WinAVR)のみであるが、もしニーズがあれば広範なプラットフォームへの移植がさらに容易だったはずだ。
FunkOSはR3でさらにμOLEDのドライバや、PSXジョイパッド、フレームバッファベースのアクセラレータ付き2Dディスプレイのサポート、Bitmapフォントレンダラなど、あまり見かけないデバイスドライバ(いずれもAVR8向け)なども追加されている。
どうもこのFunkOS、Slevinsky氏のお仕事(Funkenstein Software Consultingという組み込み向けシステムコンサルティング)のために開発/メンテナンスが行われていたのではないかと思われる。妙に特定のデバイス向けのドライバのみが充実しているのがその傍証である。
FunkOSのライセンスにはSleepycat Licenseが採用されている。Sleepycat Licenseのライセンス要件は以下の通りだ。
- ソースコードの配布には原著作権者の表示が必要
- バイナリの配布には原著作権者の表示は不要
- オリジナルと異なるターゲットに移植した場合、それを原著作権者へ送付が必要
- ハードウェアに実装した形でバイナリを再配布する場合、原著作権者の表示が必要
要するに、例えばマニュアルの最後に原著作権者を表示しさえすれば、商用製品として販売することに支障はない。
Copyright © ITmedia, Inc. All Rights Reserved.