NuttX ビルトインアプリケーションの自動起動

作成したプロジェクト

nuttx_led_blink

これが今回作成したプロジェクトです。

GitHub - wurly200a/nuttx_hello
Contribute to wurly200a/nuttx_hello development by creating an account on GitHub.
  • 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アプリケーションが自動起動できました。

396_nuttx_hello.png

Copied title and URL