ということで簡単にNuttXの歴史を振り返り終わったので、RTOSとしての具体的なNuttXの機能を紹介しよう。まず、カーネルの特徴は以下のようになっている。
もちろん、これら全てを組み込むとフットプリントが過大になるので、当然必要なものだけを組み込むことになるが。
ちなみにProcessと書いてはいるが、実際にはNuttXのカーネルにはProcessという概念はなく、“Processはいわばスレッド(Thread)が稼働するために必要なリソースを収めたコンテナ(Container)だ”“Processは特殊なThread、つまりMain Threadのことだ”と説明されている。もっとも、カーネルにはなくてもライブラリやAPIにはあって、例えばFile DescriptorやFILE stream、errno変数、オプションの環境変数などは、POSIX/ANSI風のAPIであるが故に当然Process単位で割り当てられる=そのProcessに属すると判断されるThreadで共有される格好となる。そんなわけで、実体としてのProcessはない(少なくともPCB:Process Control BlockはNuttXには存在しない)が、プログラマーから見ればあたかもProcessっぽいものが利用できるという、ちょっと面白い実装になっている。
逆にきちんと存在するのがTaskである。RTOSの中にはTask=ProcessやTask=Threadとしているものもあるが、NuttXはちゃんとTCB(Task Control Block)というデータ構造がカーネルで用意され、例えば「task_create()」でTaskが生成されるといった具合だ。もっとも。Task単体では何もできず、結局Taskの中でpthreadsを生成して、これを利用してプログラムを動かすあたり、要するに管理単位はThreadということになる。このあたり、UNIX/Linux系のOSに慣れている開発者にはなじみやすいだろうが、逆にこうしたものに慣れていない開発者にはちょっと分かりにくいかもしれない。
カーネル以外の特徴は以下のようになる。
これら多数の機能は、カーネルと同じで必要に応じて組み込むことが可能だ。
また、NuttX Add-onとして以下のようなものが用意されている。
開発環境としてはGNU Toolchainに対応している。開発ホストの環境は基本Linuxということで、Debianベース/macOS/Windows+WSL/Windows+Cygwinが用意されているが、ターゲット上で動かす構成変更はKConfigで実行される関係で、これが普通に動くUbuntu環境を用意するのが一番楽ではないかと思う。
ターゲットは2015年時点でのリストを先述したが、最新バージョンでは以下のものが加わっている。
これらとは別にx86上で動くエミュレータも存在している。
ここまで機能が多いとメモリのフットプリントが気になるところだが、最新のNuttXだとこれという数字は見つけられなかった。以前の数字でいえば、ARM7ベースのC5471向けにほぼフルのLinux並みの環境を提供した場合で約56KB(図3の下の方にある)。8052ベースの「87C52」向けで最小構成にするとRAM8KB/Flash24KBといったところ。RTOSとしては標準的なサイズではないかと思う。
日本語のドキュメントはないし(公式サイトは日本語未対応)、NuttXの公式サイトで示されている、NuttXに対応しているという開発ボードはちょっとなじみが薄いものが多い(それでも「ESP32 DevKitC」などは秋月電子通商やMouser、Amazonなどで入手できる。「Sparkfun nRF52832 Breakout」はマルツオンラインやMouser、Digi-Keyなどから入手できる)。ただし、冒頭で触れたようにソニーのSpresenseでも稼働しているし(その関係もあってか、ソニーの石川真之氏もやはりNuttXのPPMC兼コミッターとして活躍しておられる)、STマイクロの「STM32 F4 Discovery」で動かすという事例も幾つか見かけており、まずはこのあたりから試してみるのが無難かもしれない。
Copyright © ITmedia, Inc. All Rights Reserved.