AVRマイコンで動作する軽量RTOS「FunkOS/Mark3」は勉強や遊びに最適!?リアルタイムOS列伝(31)(1/2 ページ)

IoT(モノのインターネット)市場が拡大する中で、エッジ側の機器制御で重要な役割を果たすことが期待されているリアルタイムOS(RTOS)について解説する本連載。第31回は、ほぼ独力で開発された軽量RTOS「FunkOS/Mark3」を紹介する。

» 2023年02月07日 07時00分 公開
[大原雄介MONOist]

 今回ご紹介する「FunkOS/Mark3」は、実体的にほぼ1人の開発者によって開発されているリアルタイムOS(RTOS)だ。ついでに言えば知名度も非常に低い。

⇒連載記事「リアルタイムOS列伝」バックナンバー

「Mark3」のロゴイメージ 図1 「Mark3」のロゴイメージ[クリックで拡大]

全機能を使ってもメモリフットプリントは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のライセンス要件は以下の通りだ。

  • ソースコードの配布には原著作権者の表示が必要
  • バイナリの配布には原著作権者の表示は不要
  • オリジナルと異なるターゲットに移植した場合、それを原著作権者へ送付が必要
  • ハードウェアに実装した形でバイナリを再配布する場合、原著作権者の表示が必要

 要するに、例えばマニュアルの最後に原著作権者を表示しさえすれば、商用製品として販売することに支障はない。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.