 
概要
Arduino IDEで作成したプログラムは,電源投入時に自動実行されるようになっていますが,SPRESENSE SDKを使用して直接NuttX上に実装したコマンドは,デフォルトではnshを使って手動で実行する必要があります. 実はnshには起動スクリプト(init.dのようなもの)の機能があり,適切に設定を行えば,プログラムの起動や環境変数の設定などを自動で行うことができます.
この記事では,SPRESENSEのNuttXの設定を変更し,起動スクリプトを有効化する方法を紹介します.
準備
起動スクリプトは nsh_romfsimg.h というヘッダの中に記述されたROMFSというファイルシステムの中に格納されます.
ROMFSの生成には genromfs が必要なので,まずはインストールします.
Ubuntu
| $ sudo apt-get install genromfs | 
その他のプラットフォームでパッケージがない場合は,SDKのセットアップ時に kconfig-frontends と一緒にソースがついてきているので,それをビルドして使います.
参考→ SPRESENSE SDKをArch Linuxにセットアップする
本題
menuconfigでの設定
SDKのディレクトリに移動して,menuconfigで設定を行います.
| $ make menuconfig | 
- System Tools→NSH Library→Scripting Support→Support ROMFS start-up scriptにチェック
- System Tools→NSH Library→Scripting Support→ROMFS header locationをArchitecture-specificに変更
2番めの設定は,SPRESENSEの bsp 内に nsh_romfsimg.h を用意することを意味しています.
その他の部分はデフォルトのままで構いません.
起動スクリプトのテンプレート
つぎに,起動スクリプトのテンプレートを bsp の中にコピーします.
| $ cp system/nshlib/rcS.template bsp/include/arch/board | 
rcS.template ファイルは,そのままNuttXの /etc/init.d/rcS ファイルになります.
デフォルトではRAMディスクを生成して /tmp にマウントするというスクリプトが書かれています.
たとえば rcS.template の中身を
hello &としておけば,hello が起動時に自動実行されるようになります.
また,
set HOGE fooなどと書いておくことで,環境変数 HOGE の値が foo に起動時に設定され,nshから利用できるようになります.
ROMFSの生成
ひと通り編集したら,ROMFSを生成します.この作業は付属のシェルスクリプトで簡単にできます.
sdk/bsp/include/arch/board の中で以下を実行します.
| $ ../../../../tools/mkromfs.sh ../../../../ | 
ただし, ../../../../ はSDKのディレクトリを指していることに注意してください.
これで,ROMFSのバイナリが書かれた nsh_romfsimg.h が bsp/include/arch/board ディレクトリの中に生成されます.
この作業は make 中に自動実行はされないので,rcS.template を変更したら手動で実行するようにしてください.
リビルド
変更した設定とROMFSを反映させるために,再度ビルドを行います.
うまくいかない場合は make clean や make cleankernel をしてから再試行してください.
| $ make buildkernel | 
動作の確認
Flashツールで nuttx.spk を書き込み,minicom等でシリアルポートに接続します.
ls してみると,etc というディレクトリができている[1]ことがわかります.
また,/etc/init.d/rcS に,rcS.template に書いた中身が反映されていることも確認できます.
以下の例は,デフォルトの起動スクリプトをそのまま使用した場合のものです.
| nsh> ls | 
Tips
- SDカードにスクリプトの本体を置くこともできます.その場合は,menuconfigでSDカードの設定をした上で,以下のようにrcS.templateを変更します.
set FRC /mnt/sd0/rc.txt
if [ -f $FRC ]
then
    sh $FRC
fiこれで,SDカード直下に置いた rc.txt が自動で読み込まれて実行されるようになります.
- nshでのスクリプトの書き方については,公式のドキュメンテーションを参照してください.形式は通常のシェルスクリプトに似ていますが,パイプや入力リダイレクトのような基本的な機能がないことに気をつけてください.
 NuttShell
- ROMFSがマウントされている ↩