====== アプリケーションの自動起動 ======
[[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]]
\\