概要
FreeRTOSはみんな使っててつまらないから別のRTOSを使ってみるよ
NuttXについて
NuttX[1]はPOSIX, ANSI準拠のフリーのRTOSで,いろいろなプラットフォームに対応しています. 有名所ではSonyのICレコーダやマルチコプター向けのフライトコントローラPixhawkに採用されていたりします[2].
FreeRTOSなどのほとんどのメジャーなRTOSにはシェルは提供されていませんが,NuttXにはNuttShell(nsh)というbashライクな独自のシェルが用意されています. また,ファイルシステムやネットワーク,オーディオ,グラフィクスなどの拡張機能も実装されています. アプリケーションはRTOSのコードと一緒にリンクする必要はなく,別にリンクしたELFの読み込みもサポートしています. もはやふつうのOSと遜色ない機能を持ち合わせています.何にでも使えそうな感じがします.
続きからF4Discovery向けにビルドしていきます.
F4Discovery向けのビルド
基本的に以下のチュートリアルを参考にすればおkですが,メモとして残しておきます. http://nuttx.org/doku.php?id=wiki:getting-started:stm32f4discovery_unix
NuttXをビルドするには,kconfig-frontends
をインストールする必要があります.
わたしはArchなのでAURで入れました(執筆時点ではそのままではビルドできなかったので,AURのコメント欄にあるパッチを適用しました).
zipかgit経由でnuttx本体とappsをダウンロードして,nuttx, appsのフォルダを同じディレクトリにつっこみます.
$ ls |
ビルドに移ります. 今回はF4Discoveryを使用し,オンボードのMicroUSB経由でnshをいじることにします.
$ cd nuttx/tools |
distcleanしろと怒られた場合はnuttxディレクトリで make distclean
を実行してから再試行します.
ビルドが完了すると nuttx.hex
ファイルがnuttxディレクトリに出力されます.
動作確認
st-flash等で焼きます.
$ st-flash --format ihex write nuttx.hex |
F4DiscoveryのMicroUSBポートとPCを接続し,別途モバイルバッテリー等を使用してF4Discoveryに電源を供給します(MicroUSBからは給電されません). USB CDC-ACMデバイスとして認識されるので,適当なシリアルターミナルを開きます.
$ picocom --b 115200 /dev/ttyACM0 |
起動まで若干の時間がかかりますが,Enterを何回か押していると反応するはずです. 以下の画像のようにシェルとして使用できます.
アプリケーションを試しに入れてみる
いきなり自作のELFを実行というのもアレなので,まず最初のステップとして付属のビルトイン(NuttXと一緒にリンクする)アプリケーションを動かしてみます. appsの中にあるpwmというサンプルを動かしてみます.
ビルトインアプリケーションを入れるには,menuconfigから設定を行うと楽です.
$ make menuconfig |
- System Type
- STM32 Peripheral Support
- TIM4 にチェック
- Timer Configuration
- TIM4 PWM にチェック
- TIM4 PWM Output Channel を 2 に変更 (ヘッダにCH2しか定義されていないので,他のCHを指定すると失敗する)
- STM32 Peripheral Support
- Device Drivers
- PWM Driver Support にチェック
- Application Configuration
- Examples
- Pulse width modulation (PWM) example にチェック
- Examples
また,執筆時点(v7.24)では以下の修正が必要です. バグなのかconfigのどこかが抜けているのかよくわかりませんが,ビルドに失敗します. 以下のコードを configs/stm32f4discovery/src/stm32_pwm.c の85行目あたりに書き加えて修正します.
make
して書き込み,シリアルターミナルを開きます.
nsh> pwm -h |
とするとヘルプが表示されます. たとえば
nsh> pwm -d 10 -t 1 |
を実行すると,基板下部の橙色LEDがDuty比10%で1秒間発光します.
/dev/pwm0
はnsh上から echo
で値を書き込むことはできないようです.
ioctl
でプロパティを操作する必要があるようです.
つぎはなにをしよう
Discoveryでは遊べることに限界があるので,つぎはaitendoのSTM32F103ボード[3]を使ってSDIOとファイルシステムのテスト,SDに書いたELFの実行あたりをやってみようと思います.