ファームウェアの書き込みと動作 までで、NuttX のシェル(NuttShell) が起動するところまで確認できました。
NuttX は便利なシェルが利用できますので、アプリケーションの開発方法としては、
というふうに実装するとデバッグが容易になります。
そこで、まずはビルトインアプリケーションをどのように作るか、について記載します。
※ マニュアルは https://cwiki.apache.org/confluence/display/NUTTX/Custom+Application+Directories にあります。
NuttX のソースを clone した2つのディレクトリのうち、アプリケーションは apps/ ディレクトリ以下に作成します。
編集したあとでも元に戻せるよう、新しい作業用ブランチを作成します。
develop:~/src/NuttX_XG50$ cd apps/ develop:~/src/NuttX_XG50/apps$ git checkout -b hello_test Switched to a new branch 'hello_test'
apps/ ディレクトリ以下は、下のようになっています。
develop:~/src/NuttX_XG50/apps$ ls -lnF total 260 -rw-rw-r-- 1 1000 1000 4166 3月 7 09:15 Application.mk drwxrwxr-x 14 1000 1000 4096 3月 8 14:53 BearSSL/ -rw-rw-r-- 1 1000 1000 8793 3月 7 09:15 COPYING -rw-rw-r-- 1 1000 1000 145150 3月 7 09:17 ChangeLog.txt -rw-rw-r-- 1 1000 1000 2797 3月 7 09:15 Directory.mk -rw-rw-r-- 1 1000 1000 3095 3月 7 09:15 Make.defs -rw-rw-r-- 1 1000 1000 5297 3月 7 09:15 Makefile -rw-rw-r-- 1 1000 1000 9111 3月 7 09:15 README.txt drwxrwxr-x 3 1000 1000 4096 3月 8 14:56 builtin/ drwxrwxr-x 6 1000 1000 4096 3月 8 14:49 canutils/ drwxrwxr-x 121 1000 1000 4096 3月 8 14:49 examples/ drwxrwxr-x 7 1000 1000 4096 3月 8 14:49 fsutils/ drwxrwxr-x 3 1000 1000 4096 3月 8 14:49 gpsutils/ drwxrwxr-x 9 1000 1000 4096 3月 8 14:49 graphics/ drwxrwxr-x 3 1000 1000 4096 3月 7 09:15 import/ drwxrwxr-x 14 1000 1000 4096 3月 7 09:17 include/ drwxrwxr-x 7 1000 1000 4096 3月 8 14:49 interpreters/ drwxrwxr-x 7 1000 1000 4096 3月 7 09:15 modbus/ drwxrwxr-x 23 1000 1000 4096 3月 8 14:49 netutils/ drwxrwxr-x 2 1000 1000 4096 3月 8 14:56 nshlib/ drwxrwxr-x 6 1000 1000 4096 3月 8 14:56 platform/ drwxrwxr-x 34 1000 1000 4096 3月 8 14:49 system/ drwxrwxr-x 2 1000 1000 4096 3月 7 09:15 tools/ drwxrwxr-x 5 1000 1000 4096 3月 8 14:49 wireless/ develop:~/src/NuttX_XG50/apps$
テストなので、適当に test というディレクトリを作り作業を進めます。
develop:~/src/NuttX_XG50/apps$ ls -lnF total 264 -rw-rw-r-- 1 1000 1000 4166 3月 7 09:15 Application.mk drwxrwxr-x 14 1000 1000 4096 3月 8 14:53 BearSSL/ -rw-rw-r-- 1 1000 1000 8793 3月 7 09:15 COPYING -rw-rw-r-- 1 1000 1000 145150 3月 7 09:17 ChangeLog.txt -rw-rw-r-- 1 1000 1000 2797 3月 7 09:15 Directory.mk -rw-rw-r-- 1 1000 1000 3095 3月 7 09:15 Make.defs -rw-rw-r-- 1 1000 1000 5297 3月 7 09:15 Makefile -rw-rw-r-- 1 1000 1000 9111 3月 7 09:15 README.txt drwxrwxr-x 3 1000 1000 4096 3月 8 14:56 builtin/ drwxrwxr-x 6 1000 1000 4096 3月 8 14:49 canutils/ drwxrwxr-x 121 1000 1000 4096 3月 8 14:49 examples/ drwxrwxr-x 7 1000 1000 4096 3月 8 14:49 fsutils/ drwxrwxr-x 3 1000 1000 4096 3月 8 14:49 gpsutils/ drwxrwxr-x 9 1000 1000 4096 3月 8 14:49 graphics/ drwxrwxr-x 3 1000 1000 4096 3月 7 09:15 import/ drwxrwxr-x 14 1000 1000 4096 3月 7 09:17 include/ drwxrwxr-x 7 1000 1000 4096 3月 8 14:49 interpreters/ drwxrwxr-x 7 1000 1000 4096 3月 7 09:15 modbus/ drwxrwxr-x 23 1000 1000 4096 3月 8 14:49 netutils/ drwxrwxr-x 2 1000 1000 4096 3月 8 14:56 nshlib/ drwxrwxr-x 6 1000 1000 4096 3月 8 14:56 platform/ drwxrwxr-x 34 1000 1000 4096 3月 8 14:49 system/ drwxrwxr-x 2 1000 1000 4096 3月 8 15:00 test/ <-------- drwxrwxr-x 2 1000 1000 4096 3月 7 09:15 tools/ drwxrwxr-x 5 1000 1000 4096 3月 8 14:49 wireless/ develop:~/src/NuttX_XG50/apps$
作成した test ディレクトリ以下に、
を作成します。
# # For a description of the syntax of this configuration file, # see the file kconfig-language.txt in the NuttX tools repository. # config APP_HELLO bool "\"Hello, World!\" example" default n ---help--- Enable the \"Hello, World!\" example if APP_HELLO config APP_HELLO_PROGNAME string "Program name" default "hello" depends on BUILD_KERNEL ---help--- This is the name of the program that will be use when the NSH ELF program is installed. config APP_HELLO_PRIORITY int "Hello task priority" default 100 config APP_HELLO_STACKSIZE int "Hello stack size" default 2048 endif
ifeq ($(CONFIG_APP_HELLO),y) CONFIGURED_APPS += test endif
-include $(TOPDIR)/Make.defs # Hello, World! built-in application info CONFIG_APP_HELLO_PRIORITY ?= SCHED_PRIORITY_DEFAULT CONFIG_APP_HELLO_STACKSIZE ?= 2048 APPNAME = hello PRIORITY = $(CONFIG_APP_HELLO_PRIORITY) STACKSIZE = $(CONFIG_APP_HELLO_STACKSIZE) # Hello, World! Example ASRCS = CSRCS = MAINSRC = hello_main.c CONFIG_APP_HELLO_PROGNAME ?= hello$(EXEEXT) PROGNAME = $(CONFIG_APP_HELLO_PROGNAME) include $(APPDIR)/Application.mk
#include <nuttx/config.h> #include <stdio.h> int hello_main(int argc, char *argv[]) { printf("Hello, World!!\n"); return 0; }
nuttx/ ディレクトリで make clean
した後で make menuconfig
を実行します。
Linux Kernel と同じような画面になります。
Application Configuration から “Hello, World!” example を選択します。
<Exit> → <Exit> を選び、config の編集内容を反映させます。
ビルドを行います。
develop:~/src/NuttX_XG50/nuttx$ make ... 略 ... make[1]: Leaving directory '/home/kikuchi/src/NuttX_XG50/nuttx/arch/arm/src' CP: nuttx.hex CP: nuttx.bin develop:~/src/NuttX_XG50/nuttx$
ファームウェアの書き込みと動作 と同じ手順で、XG-50 に書き込んで実行してみます。
NuttShell (NSH) nsh> help help usage: help [-v] [<cmd>] [ dirname false mkfatfs pwd time ? date free mkfifo reboot true basename dd help mkrd rm uname break df hexdump mh rmdir umount cat dmesg kill mount set unset cd echo ls mv sh usleep cp exec mb mw sleep xd cmp exit mkdir ps test Builtin Apps: cu hello <---- 増えている i2c sudoku nsh>
ビルトインアプリケーションとして hello が出てきました。
さっそく実行してみます。
nsh> hello Hello, World!! nsh>
きちんと動作しました!