SPRESENSEのNuttXに起動スクリプトを設定する

SPRESENSEのNuttXに起動スクリプトを設定する

概要

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
$ cd 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.hbsp/include/arch/board ディレクトリの中に生成されます.

この作業は make 中に自動実行はされないので,rcS.template を変更したら手動で実行するようにしてください.

リビルド

変更した設定とROMFSを反映させるために,再度ビルドを行います. うまくいかない場合は make cleanmake cleankernel をしてから再試行してください.

$ make buildkernel
$ make

動作の確認

Flashツールで nuttx.spk を書き込み,minicom等でシリアルポートに接続します. ls してみると,etc というディレクトリができている[1]ことがわかります. また,/etc/init.d/rcS に,rcS.template に書いた中身が反映されていることも確認できます.

以下の例は,デフォルトの起動スクリプトをそのまま使用した場合のものです.

nsh> ls
/:
dev/
etc/
mnt/
proc/
var/
nsh> cat /etc/init.d/rcS
# Create a RAMDISK and mount it at "/tmp"

mkrd -m 1 -s 512 1024
mkfatfs /dev/ram1
mount -t vfat /dev/ram1 "/tmp"

Tips

  • SDカードにスクリプトの本体を置くこともできます.その場合は,menuconfig でSDカードの設定をした上で,以下のように rcS.template を変更します.
set FRC /mnt/sd0/rc.txt

if [ -f $FRC ]
then
    sh $FRC
fi

これで,SDカード直下に置いた rc.txt が自動で読み込まれて実行されるようになります.

  • nshでのスクリプトの書き方については,公式のドキュメンテーションを参照してください.形式は通常のシェルスクリプトに似ていますが,パイプや入力リダイレクトのような基本的な機能がないことに気をつけてください.
    NuttShell

  1. ROMFSがマウントされている

Share Comments