====== アプリケーションの自動起動 ====== [[xg_series_devel:add_builtin_command:start]] で追加した、タスクなどを起動するビルトインアプリケーションを、 機器電源 ON 時に自動起動させる方法を紹介します。 ※ 公式ドキュメントの該当箇所は [[http://nuttx.org/Documentation/NuttShell.html#startupscript|こちら]] です。 例として、『[[xg_series_devel:use_adc:start]]』で紹介した **adc** というビルトインアプリケーションを自動起動させてみます。 \\ ===== 設定 ===== ==== config の変更 ==== [[https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=139629410#startupscript|ドキュメント]] にある下記条件 * CONFIG_DISABLE_MOUNTPOINT がセットされていないこと * CONFIG_NFILE_DESCRIPTORS が 4 より大きいこと * CONFIG_FS_ROMFS が有効化されていること はデフォルトでクリアするよう設定してあります。 追加で、**CONFIG_NSH_ROMFSETC** と **CONFIG_NSH_ARCHROMFS** を有効にします。 {{:xg_series_devel:autostart_rcs:menuconfig_nsh_rcs_01.png?640|CONFIG_NSH_ROMFSETC}} {{:xg_series_devel:autostart_rcs:menuconfig_nsh_rcs_02.png?640|CONFIG_NSH_ARCHROMFS}} \\ ==== romfs image の作成 ==== ここでビルドを試みると、下記のエラーになります。 ./nsh_romfsetc.c:57:39: fatal error: arch/board/nsh_romfsimg.h: No such file or directory # include ^ 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 のような制御文も使えますので、\\ 設定をチェックして起動するプログラムを変えるなどもスクリプトで柔軟に行うことができます。 参照 : [[http://nuttx.org/Documentation/NuttShell.html#conditional|NuttShell Conditional Command Execution]] \\