概要
NuttXのビルトインアプリケーション hello を自動起動する設定にします。
board は esp32-devkitc です。
参考
作成したプロジェクト
nuttx_led_blink
これが今回作成したプロジェクトです。
- LICENSE
- README.md
- build-nuttx-esp32
- 01_build-builder.sh
- 02_enter-builder.sh
- 03_build.sh
- Dockerfile
- hello
- Kconfig
- Make.defs
- Makefile
- hello_main.c
ビルド方法
README.md に記載しています。下記と同様です。
設定方法
最終的にはビルドスクリプトに下記のように記述することで対応できました。
kconfig-tweak --file .config --enable CONFIG_FS_ROMFS kconfig-tweak --file .config --enable CONFIG_NSH_ROMFSETC kconfig-tweak --file .config --enable CONFIG_NSH_ARCHROMFS
cd boards/xtensa/esp32/esp32-devkitc/include rm rc.sysinit.template touch rc.sysinit.template rm rcS.template touch rcS.template echo "#! /bin/nsh" > rcS.template echo "hello" >> rcS.template ../../../../../tools/mkromfsimg.sh ../../../../../ cd ../../../../..
なお、mkromfsimg.sh はxxdコマンドに依存しているため、vim-common パッケージのインストールが必要です。
調査の経緯など
CONFIG_FS_ROMFS
CONFIG_FS_ROMFS は nuttx/fs/romfs/Kconfig で定義されており、下記の内容です。
Enable ROMFS filesystem support
CONFIG_NSH_ROMFSETC
CONFIG_NSH_ROMFSETC は apps/nshlib/Kconfig で定義されており、下記の内容です。
Mount a ROMFS filesystem at /etc and provide a system init script at /etc/init.d/rc.sysinit and a startup script at /etc/init.d/rcS. The default system init script will mount a FAT FS RAMDISK at /tmp but the logic is easily extensible.
認識しづらいですが ROMFSETC は ROMFS で ETC (/etc) ディレクトリをサポートするという意味ですね。 下記が init スクリプトになります。
- /etc/init.d/rc.sysinit
- /etc/init.d/rcS
CONFIG_NSH_ARCHROMFS
CONFIG_NSH_ARCHROMFS は apps/nshlib/Kconfig で定義されており、下記の内容です。
Enable this option to provide an architecture-specific ROMFS header at arch/<boardname>/nsh_romfsimg.h. Note that this header will be linked (or copied) from nuttx/boards/<arch>/<chip>/<board>/include and should be stored at that location in the nuttx boards/ sub-directory.
ESP32ではアーキテクチャ特有のROMFSを使う必要があります。
nuttx/boards/<arch>/<chip>/<board>/include に nsh_romfsimg.h が必要になります。
実際、上記定義を有効にしただけですと、下記のようなコンパイルエラーになります。
./nsh_romfsetc.c:43:12: fatal error: arch/board/nsh_romfsimg.h: No such file or directory 43 | # include <arch/board/nsh_romfsimg.h> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/mkromfsimg.sh
nuttx/tools/mkromfsimg.sh にて nsh_romfsimg.h を生成することができます。
引数なしで実行すると下記のようなメッセージが表示されます。
nuttx/tools/mkromfsimg.sh The full path to the NuttX base directory must be provided on the command line USAGE: nuttx/tools/mkromfsimg.sh [-nofat] <topdir> [rcsysinitfile] [<rcsfile>]
topdir で .config ファイルのある nuttx ディレクトリを指定し、rcsysinitfile と rcsfile のテンプレートをオプションで指定できるようになっているようです。 が、出力先の指定が無いので、出力先(つまり nuttx/boards/<arch>/<chip>/<board>/include) で実行するのがよさそうです。
nuttx/boards/<arch>/<chip>/<board>/include は今回の環境では nuttx/boards/xtensa/esp32/esp32-devkitc/include となります。
ここに2つのファイルを作成します。
- rc.sysinit.template
- rcS.template
rcS.template は下記の内容とします。
#! /bin/nsh hello
nuttx/boards/xtensa/esp32/esp32-devkitc/include 以下で下記のように実行することで、nsh_romfsimg.h が作成されます。
これもわかりづらいですが、相対パスで mkromfsimg.sh を実行し、.config ファイルのある nuttx ディレクトリを引数で指定するという意味になります。
$ ../../../../../tools/mkromfsimg.sh ../../../../../
ビルドスクリプトへの記述
前記のビルドスクリプトへの記述は、この一連の流れを実行するものとなります。
実行結果
helloアプリケーションが自動起動できました。