STM32F4Discovery向けにNuttX(RTOS)をビルドしてみる

STM32F4Discovery向けにNuttX(RTOS)をビルドしてみる

概要

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
apps nuttx

ビルドに移ります. 今回はF4Discoveryを使用し,オンボードのMicroUSB経由でnshをいじることにします.

$ cd nuttx/tools
$ ./configure.sh stm32f4discovery/usbnsh
$ cd ..
$ make

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を指定すると失敗する)
  • Device Drivers
    • PWM Driver Support にチェック
  • Application Configuration
    • Examples
      • Pulse width modulation (PWM) example にチェック

また,執筆時点(v7.24)では以下の修正が必要です. バグなのかconfigのどこかが抜けているのかよくわかりませんが,ビルドに失敗します. 以下のコードを configs/stm32f4discovery/src/stm32_pwm.c の85行目あたりに書き加えて修正します.

#ifndef OK
#  define OK 0
#endif

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の実行あたりをやってみようと思います.


  1. NuttX Real-Time Operating System

  2. NuttX - Wikipedia

  3. ★特売品★STM32マイコンボード - aitendo

Share Comments