概要
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
が起動時に自動実行されるようになります.
また,
などと書いておくことで,環境変数 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
を変更します.
これで,SDカード直下に置いた rc.txt
が自動で読み込まれて実行されるようになります.
- nshでのスクリプトの書き方については,公式のドキュメンテーションを参照してください.形式は通常のシェルスクリプトに似ていますが,パイプや入力リダイレクトのような基本的な機能がないことに気をつけてください.
NuttShell
ROMFSがマウントされている ↩