ユーザ用ツール

サイト用ツール


xg_series_devel:add_builtin_command:start

差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
xg_series_devel:add_builtin_command:start [2018/03/08 14:54]
admin
xg_series_devel:add_builtin_command:start [2020/11/30 09:55] (現在)
admin [ビルトインアプリケーションの追加]
ライン 1: ライン 1:
 +====== ビルトインアプリケーションの追加 ======
 +
 +[[xg_series_devel:​boot_firmware:​start]] までで、NuttX のシェル(NuttShell) が起動するところまで確認できました。\\
 +NuttX は便利なシェルが利用できますので、アプリケーションの開発方法としては、
 +
 +  * アプリケーションは各機能を **Task/​Thread** に小分けにして、**プロセス間通信**((MessageQueue,​ Mutex, Semaphore などが利用できます。[[http://​nuttx.org/​Documentation/​NuttxUserGuide.html|こちら]]を参照してください。)) で全体の機能を実現
 +  * 各機能を実装したタスクを **NuttShellから起動** するビルトインアプリケーションを実装
 +  * 起動時に NuttShell から各タスクを自動起動する (/​etc/​init.d/​rcS から)(([[http://​nuttx.org/​Documentation/​NuttShell.html#​startupscript|こちら]]を参照))
 +
 +というふうに実装するとデバッグが容易になります。
 +
 +そこで、まずはビルトインアプリケーションをどのように作るか、について記載します。
 +
 +※ マニュアルは [[https://​cwiki.apache.org/​confluence/​display/​NUTTX/​Custom+Application+Directories]] にあります。
 +
 +\\
 +
 +===== 準備 =====
 +
 +NuttX のソースを clone した2つのディレクトリのうち、アプリケーションは **apps/** ディレクトリ以下に作成します。\\
 +編集したあとでも元に戻せるよう、新しい作業用ブランチを作成します。
 +
 +<​code>​
 +develop:​~/​src/​NuttX_XG50$ cd apps/
 +develop:​~/​src/​NuttX_XG50/​apps$ git checkout -b hello_test
 +Switched to a new branch '​hello_test'​
 +</​code>​
 +
 +\\
 +
 +===== 作業 =====
 +
 +==== ディレクトリ、ファイルの追加 ====
 +
 +**apps/** ディレクトリ以下は、下のようになっています。
 +
 +<​code>​
 +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$ ​
 +</​code>​
 +
 +\\
 +
 +テストなので、適当に **test** というディレクトリを作り作業を進めます。
 +
 +<​code>​
 +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$ ​
 +</​code>​
 +
 +\\
 +
 +作成した **test** ディレクトリ以下に、
 +
 +  * Kconfig
 +  * Make.defs
 +  * Makefile
 +  * hello_main.c (プログラムソース)
 +
 +を作成します。
 +
 +<file config Kconfig>
 +#
 +# 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
 +</​file>​
 +
 +<file Makefile Make.defs>​
 +ifeq ($(CONFIG_APP_HELLO),​y)
 +CONFIGURED_APPS += test
 +endif
 +</​file>​
 +
 +<file Makefile Makefile>​
 +-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
 +</​file>​
 +
 +<sxh c toolbar:​false;​ title:​hello_main.c>​
 +#include <​nuttx/​config.h>​
 +#include <​stdio.h>​
 +
 +int hello_main(int argc, char *argv[])
 +{
 +  printf("​Hello,​ World!!\n"​);​
 +  return 0;
 +}
 +
 +</​sxh>​
 +
 +\\
 +
 +==== config の変更 ====
 +
 +**nuttx/** ディレクトリで ''​make clean''​ した後で ''​make menuconfig''​ を実行します。\\
 +Linux Kernel と同じような画面になります。
 +
 +
 +{{:​xg_series_devel:​add_builtin_command:​menuconfig_01.png|make menuconfig}}
 +
 +\\
 +
 +**Application Configuration** から **"​Hello,​ World!"​ example** を選択します。
 +
 +{{:​xg_series_devel:​add_builtin_command:​menuconfig_02.png|Application Configuration}}
 +
 +{{:​xg_series_devel:​add_builtin_command:​menuconfig_03.png|Hello,​ World!}}
 +
 +\\
 +
 +**<​Exit>​** -> **<​Exit>​** を選び、config の編集内容を反映させます。
 +
 +{{:​xg_series_devel:​add_builtin_command:​menuconfig_04.png|exit}}
 +
 +{{:​xg_series_devel:​add_builtin_command:​menuconfig_05.png|save configuration}}
 +
 +
 +\\
 +
 +==== ビルド ====
 +
 +ビルドを行います。
 +
 +<​code>​
 +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$ ​
 +</​code>​
 +
 +\\
 +
 +==== 実機への書き込みと実行 ====
 +
 +[[xg_series_devel:​boot_firmware:​start]] と同じ手順で、XG-50 に書き込んで実行してみます。
 +
 +<​code>​
 +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> ​
 +</​code>​
 +
 +ビルトインアプリケーションとして **hello** が出てきました。\\
 +さっそく実行してみます。
 +
 +<​code>​
 +nsh> hello
 +Hello, World!!
 +nsh> ​
 +</​code>​
 +
 +きちんと動作しました!
 +
 +\\
 +
  
xg_series_devel/add_builtin_command/start.1520488474.txt.bz2 · 最終更新: 2018/03/08 14:54 by admin