MCUに慣れていなくても使いやすい、サブシステム向けRTOS「Apache Mynewt」:リアルタイムOS列伝(15)(3/4 ページ)
IoT(モノのインターネット)市場が拡大する中で、エッジ側の機器制御で重要な役割を果たすことが期待されているリアルタイムOS(RTOS)について解説する本連載。第15回は、ASF(ソフトウェア財団)のインキュベーションを受けて、Linuxを用いるような大規模システムのサブシステム向けに開発されたRTOS「Apache Mynewt」を紹介する。
MCUの経験が浅いプログラマーでも取っ付きやすい
さて、順序が普段と逆だが、Apache Mynewtの特徴がこちら(図6)。完全マルチタスクOS、プリエンプティブ構成でプライオリティベースのスケジューリング(最大253レベルのプライオリティサポート)が行われる(図7)。
特徴的なのはパワーマネジメントやロギング、さらにリソース利用率のトラッキングなどが搭載されていることだろう。このあたりは、Apache Mynewtがそれ単体として使われるというよりは、大きなアプリケーションのサブシステムとして利用されることを前提としている感じだ。
プログラミングそのものはかなりLinuxの環境に近い。例えば、いわゆるLチカはこんな感じで行える(図8)。
LinuxにこんなAPIがあるか? と言われればもちろんないのだが、MCU風にレジスタをあれこれ操作しまくるといった手間は掛からず、また機種依存コードも全部HALで遮蔽する格好で記述できるので、MCUの経験が浅いプログラマーでも取っ付きやすいだろう。これをマルチタスク化したのがこちら(図9)。
図9 main()の最後が少し分かりづらいが、os_eventq_dflt_get()はOSのメインタスクが処理するデフォルトのイベントキューで、これをos_eventq_run()に渡して実行する格好。この場合だと、os_task_init()でmy_task_func()がデフォルトキューに入っているので、これを繰り返し実行する格好になる[クリックで拡大]
Apache Mynewtの処理単位はTaskであり、ProcessやThreadという概念は存在しない。しかし、実装の実態としては、この図9を見る限りThreadベースであり、これをTaskとして扱っている、という感じだ。ちなみにmain()の最後、以前はos_start()でスケジューラが稼働を始め、my_task_func()に制御が移る格好だったが、このあたりはバージョンアップで改定されたらしい。
また、先にPriorityが253レベルと書いたが、システム全体は255レベルで、うちIdleとSanityという2つの固有Taskが2レベルを占有している。スケジューラが完全Priorityベースというのは、1Task=1Priorityになっており、同一Priorityを持つTaskを複数持つことはできないようだ。こういった割り切りもなかなかに珍しい。
Copyright © ITmedia, Inc. All Rights Reserved.