STM32でNUTTXを使ってみる

タスクの自動起動


今までタスク関連のAPIを紹介しました。
そこで、今回はAPIから少し離れて、タスクの自動起動を紹介します。
デフォルトの設定では/devと/procのディレクトリだけが存在しています。


以下の手順でFAT File systemとROMS File systemを追加します。
$ make clean
$ make menuconfig



FAT file system と ROM file systemの2か所を選びます。


メインメニューに戻り、Appication ConfigurationからNSH Libraryを選びます。


Scripting Supportの中のSupport ROMS start-up scriptを有効にします。




ここまで変更したらひたすらExitで抜けます。
最後に以下の画面で[.config]を上書きします。


新しい[.config]を使ってファームウェアをビルドし、新しいファームウェアをマイコンに書き込みます。
nshに接続すると/etc/init.dディレクトリが追加されていて、その中にrc.sysinitが有ります。
このファイルはnsh起動時(=システム起動時)に自動的に起動されます。




デフォルトのrc.sysinitファイルは以下の場所に有ります。
$HOME/nuttxspace/apps/nshlib/rc.sysinit.template
このファイルを直接変更しますが、最初にgenromfsをインストールします。
$ sudo apt update
$ sudo apt install genromfs


【変更前】
$ cat $HOME/nuttxspace/apps/nshlib/rc.sysinit.template
# Create a RAMDISK and mount it at XXXRDMOUNTPOINTXXX

mkrd -m XXXMKRDMINORXXX -s XXMKRDSECTORSIZEXXX XXMKRDBLOCKSXXX
mkfatfs /dev/ramXXXMKRDMINORXXX
mount -t vfat /dev/ramXXXMKRDMINORXXX XXXRDMOUNTPOINTXXX

【変更後】
先頭の3行はタスクの自動起動に直接関係ないので、今回はコメントアウトします。
Nuttxの起動と同時にtask_test3 initを実行する様にします。
$ cat $HOME/nuttxspace/apps/nshlib/rc.sysinit.template
# Create a RAMDISK and mount it at XXXRDMOUNTPOINTXXX

# mkrd -m XXXMKRDMINORXXX -s XXMKRDSECTORSIZEXXX XXMKRDBLOCKSXXX
# mkfatfs /dev/ramXXXMKRDMINORXXX
# mount -t vfat /dev/ramXXXMKRDMINORXXX XXXRDMOUNTPOINTXXX

task_test3 init

変更が終わったら以下のコマンドで rc.sysinit.template を nsh_romfsimg.h に変換します。
$ cd $HOME/nuttxspace/apps/nshlib

$ $HOME/nuttxspace/nuttx/tools/mkromfsimg.sh $HOME/nuttxspace/nuttx

$ ls -l nsh_romfsimg.h
-rw-rw-r-- 1 nop nop 6433  1月  7 12:25 nsh_romfsimg.h



Nuttxディレクトリに戻ってファームウェアをビルドし、新しいファームウェアをマイコンに書き 込みます。
nshに接続すると /etc/init.d/rc.sysinit が変更されていて、これに従って task_test3 init が実行されます。
task_test3 init は myTask1とmyTask2をInactiveにするコマンドなので、myTask1とmyTask2がInactive状態で起動されます。


/etc/init.d/rc.sysinit にmq_test startを登録すると、起動と同時にmyTask1とmyTask2を起動し、
myTask1は[foo] myTask2は[bar]のMessage Queueの待ち状態となります。




ファームの書き込み方法と、nshへの接続方法はこちらに紹介しています。
STM32F4 Discovery
STM32F3 Discovery
STM32F103RB Nucleo
STM32F103 BluePill/BlackPill
STM32F103 VEボード
STM32F407 VGボード

続く...