MCUに慣れていなくても使いやすい、サブシステム向けRTOS「Apache Mynewt」リアルタイムOS列伝(15)(3/4 ページ)

» 2021年09月27日 10時00分 公開
[大原雄介MONOist]

MCUの経験が浅いプログラマーでも取っ付きやすい

 さて、順序が普段と逆だが、Apache Mynewtの特徴がこちら(図6)。完全マルチタスクOS、プリエンプティブ構成でプライオリティベースのスケジューリング(最大253レベルのプライオリティサポート)が行われる(図7)。

図6 図6 セキュアブートへの対応も最近のASICでは欠かせないところ[クリックで拡大]
図7 図7 TaskやEventにそれぞれDebug Infoが付いているというのもちょっと珍しい[クリックで拡大]

 特徴的なのはパワーマネジメントやロギング、さらにリソース利用率のトラッキングなどが搭載されていることだろう。このあたりは、Apache Mynewtがそれ単体として使われるというよりは、大きなアプリケーションのサブシステムとして利用されることを前提としている感じだ。

 プログラミングそのものはかなりLinuxの環境に近い。例えば、いわゆるLチカはこんな感じで行える(図8)。

図8 図8 TimerなどはOSの関数として、ハードウェア操作はHALの関数として操作する格好である[クリックで拡大]

 LinuxにこんなAPIがあるか? と言われればもちろんないのだが、MCU風にレジスタをあれこれ操作しまくるといった手間は掛からず、また機種依存コードも全部HALで遮蔽する格好で記述できるので、MCUの経験が浅いプログラマーでも取っ付きやすいだろう。これをマルチタスク化したのがこちら(図9)。

図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.