ビルトインアプリケーションの追加 で追加した、タスクなどを起動するビルトインアプリケーションを、 機器電源 ON 時に自動起動させる方法を紹介します。
※ 公式ドキュメントの該当箇所は こちら です。
例として、『AD Converter の利用』で紹介した adc というビルトインアプリケーションを自動起動させてみます。
ドキュメント にある下記条件
はデフォルトでクリアするよう設定してあります。
追加で、CONFIG_NSH_ROMFSETC と CONFIG_NSH_ARCHROMFS を有効にします。
ここでビルドを試みると、下記のエラーになります。
./nsh_romfsetc.c:57:39: fatal error: arch/board/nsh_romfsimg.h: No such file or directory # include <arch/board/nsh_romfsimg.h> ^ compilation terminated. ERROR: arm-none-eabi-gcc failed: 1
nuttx/include/arch/board/nsh_romfsimg.h
を作成する必要があるとわかります。
romfs image は rcS.template
というテンプレートファイルから生成します。
今回は adc というアプリケーションを起動させたいので、下記のようなファイルを作成します。
#! /bin/nsh echo "auto execute adc from rcS!" adc
nuttx/tools/mkromfsimg.sh
というスクリプトで、romfs image を作成します。
develop:~/src/NuttX_XG50/nuttx/include/arch/board$ ../../../tools/mkromfsimg.sh ../../../ develop:~/src/NuttX_XG50/nuttx/include/arch/board$ ls -ln total 48 -rw-rw-r-- 1 1000 1000 9551 3月 13 13:45 board.h -rw-rw-r-- 1 1000 1000 2755 3月 13 13:49 boardctl.h -rw-rw-r-- 1 1000 1000 19504 3月 12 11:10 centurysys-xg50.h -rw-rw-r-- 1 1000 1000 6383 3月 14 15:38 nsh_romfsimg.h <--- 生成された -rw-rw-r-- 1 1000 1000 51 3月 14 15:38 rcS.template develop:~/src/NuttX_XG50/nuttx/include/arch/board$
ビルドを行います。場合にもよりますが、まずは make clean
したほうが良いかもしれません。
ファームウェアを書き込み、実行してみます。
ABCDF auto execute adc from rcS! adc_main: g_adcstate.count: 1 adc_main: Hardware initialized. Opening the ADC device: /dev/adc0 Sample: 1: channel: 0 value: 1498 2: channel: 1 value: 3493 3: channel: 2 value: 0 4: channel: 17 value: 926 NuttShell (NSH) nsh>
rcS
により自動実行されました。
rcS も以下のように見えています。
nsh> ls -lR /etc /etc: dr-xr-xr-x 0 . dr-xr-xr-x 0 init.d/ /etc/init.d: -r-xr-xr-x 51 rcS nsh> cat /etc/init.d/rcS #! /bin/nsh echo "auto execute adc from rcS!" adc nsh>
NuttShell には、if〜then〜else〜fi
や while〜do〜done
など、Linux の shell script のような制御文も使えますので、
設定をチェックして起動するプログラムを変えるなどもスクリプトで柔軟に行うことができます。
参照 : NuttShell Conditional Command Execution