ソニーの「Spresense」が採用するオープンソースRTOS「NuttX」とはリアルタイムOS列伝(10)(3/3 ページ)

» 2021年05月10日 10時00分 公開
[大原雄介MONOist]
前のページへ 1|2|3       

UNIX/Linux系OSに慣れていないとちょっと分かりにくい?

 ということで簡単にNuttXの歴史を振り返り終わったので、RTOSとしての具体的なNuttXの機能を紹介しよう。まず、カーネルの特徴は以下のようになっている。

  • 完全プリエンプティブ
  • マルチプロセッサ(SMP)対応
  • FIFOおよびラウンドロビン式のスケジュール
  • リアルタイム処理に対応可能なプライオリティ制御をサポート
  • POSIX/ANSI風のタスク制御、メッセージキュー、セマフォ、ミューテックス、クロック/タイマー、SIGNAL/pthread、キャンセルポイントの実装、環境変数、ファイルシステムなどのサポート
  • オプションでプロセス(Process)ごとの環境変数のサポート
  • 「VxWorks」風のタスク管理とウォッチドッグタイマー
  • BSD Socket I/Fのサポート
  • プリエンプション状態の管理が可能
  • ローダブルカーネルモジュールの実装
  • メモリモデルとしては、(1)フラットモデル、(2)MPUによるメモリ保護付き、(3)MMUを利用したメモリ管理、の3つがサポートされる
  • メモリの確保方法としては、(1)通常のヒープを利用したメモリ確保、(2)高粒度メモリ確保(Granule Allocator)、(3)共有メモリ、(4)プロセスヒープごとの動的なサイズ管理、の4つがサポートされる
  • オンデマンドページングのサポート
  • システムロギングの実装
  • ビルトインのCPU負荷測定機能の実装

 もちろん、これら全てを組み込むとフットプリントが過大になるので、当然必要なものだけを組み込むことになるが。

 ちなみに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に慣れている開発者にはなじみやすいだろうが、逆にこうしたものに慣れていない開発者にはちょっと分かりにくいかもしれない。

 カーネル以外の特徴は以下のようになる。

  • 仮想ターミナルおよびシステムコンソールの継承機能
  • 複数のファイルシステム(Tiny/VFS/FAT12/16/32/NFS Client/NXFFS/SMART/SPIFFS/LittleFS/ROMFS/CROMFS/TMPFS/BINFS/HOSTFS/Union filesystem/UserFS/procfs)のサポート
  • ASYNC I/O、Network、USB(Host/Device)、Serial、I2C、I2S、NAND、CAN、ADC、DAC、etc……のデバイスドライバ
  • SPIもしくはSDIOベースのMMC/SD/SDHカードサポート
  • フレームバッファーや液晶ディスプレイ向けのグラフィックドライバ
  • Audio Subsystem、Cryptographic subsystem、Power Management subsystemなどのサポート
  • C/C++ Library(C++はオプション扱い)とStandard Math Library
  • IPv4/v6とTCP/UDP/ICMP/ICMP v6/MLDv1/v2/の各ネットワークスタック
  • IEEE 802.11 MACやIEEE 802.15.4 MACとBluetooth LE、6LowPANドライバ
  • SLIP/TUN/PPPのサポート
  • NFS Client、HTTP Server/Client、FTP Server/Client、TFTP/NTP Client、Telnet Server、VNC Serverなど

 これら多数の機能は、カーネルと同じで必要に応じて組み込むことが可能だ。

 また、NuttX Add-onとして以下のようなものが用意されている。

  • NSH(NuttShell):Bash風シェル
  • BAS 2.4:Basicインタープリタ(!)

 開発環境としてはGNU Toolchainに対応している。開発ホストの環境は基本Linuxということで、Debianベース/macOS/Windows+WSL/Windows+Cygwinが用意されているが、ターゲット上で動かす構成変更はKConfigで実行される関係で、これが普通に動くUbuntu環境を用意するのが一番楽ではないかと思う。

 ターゲットは2015年時点でのリストを先述したが、最新バージョンでは以下のものが加わっている。

  • ARM1176JZ/Cortex-A9/Cortex-R4/Misoc LM32/OpenRISC mor1kx/Renesas RX65N/RISC-V(RV32)/ESP32(Xtensa LX6)

 これらとは別に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」で動かすという事例も幾つか見かけており、まずはこのあたりから試してみるのが無難かもしれない。

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.