Developer World Spresense
English 中文
目次

1. はじめに

このページでは、CLI (コマンドラインインターフェース) を用いて Spresense SDK のインストール、セットアップならびに簡単なサンプルアプリケーション Hello, World! の作成について解説しています。Spresense SDK の基本的な使い方を学ぶことができます。

2. 開発ツールのセットアップ

Spresense SDK はLinux/Windows/macOSで開発を行うことができます。
ユーザーが使用する環境に応じて以下のセットアップを行ってください。

サポートされているオペレーティングシステム

  • Linux (64bit)

    • Ubuntu 16.04以降

  • Windows (64bit)

    • 8.1/10

  • macOS

    • High Sierra (10.13)以降

32bit版 OS には対応していません。

2.1. Linux向けセットアップ

  1. シリアル通信の設定

    以下のコマンドを実行し、使用するユーザーを dialout グループに追加します。

    sudo usermod -a -G dialout <user-name>
    

    コマンドを実行した後、再起動してください。再起動するまで設定は有効になりません。

  2. ビルドに必要なツールをインストールします。ターミナルを起動し、以下のコマンドを実行します。

    wget https://raw.githubusercontent.com/sonydevworld/spresense/master/install-tools.sh
    bash install-tools.sh
    

    wget や install-tools.sh をプロキシ環境下で実行する場合は、事前にお使いのプロキシサーバーを設定してください。

    export http_proxy=http://プロキシーサーバー名:ポート番号
    export https_proxy=http://プロキシーサーバー名:ポート番号
    

    SDKv2.3リリースにて、GNU Arm Embedded Toolchain (コンパイラ) のバージョンを更新しています。

    SDK version GNU Arm Toolchain version

    SDKv2.3以降

    gcc-arm-none-eabi-9-2019-q4-major

    SDKv2.2以前

    gcc-arm-none-eabi-7-2018-q2-update

    コンパイラの更新を含めて再インストールを行う場合は、最新の install-tools.sh を取得し -r オプションを付与して install-tools.sh を実行してください。

    bash install-tools.sh -r
    

    既にインストール済みのコンパイラバージョンを確認するには、source ~/spresenseenv/setup を実行した後に arm-none-eabi-gcc -v を実行してください。最終行にバージョン情報が表示されます。

    arm-none-eabi-gcc -v
    (snip)
    gcc version 9.2.1 20191025 (release) [ARM/arm-9-branch revision 277599] (GNU Tools for Arm Embedded Processors 9-2019-q4-major)
    

    インストールしたツールを使用可能にするために、以下のコマンドを実行します。

    source ~/spresenseenv/setup
    

    このコマンドは、ターミナルを開くごとに実行する必要があります。このコマンドを省略したい場合は、ホームディレクトリ以下の .bashrc に上記コマンドを追加してください。

    ツールチェーンはホームディレクトリ以下の spresenseenv/usr/bin にインストールされます。
  3. Spresense SDK リポジトリからソースコードをダウンロードします。

    git clone --recursive https://github.com/sonydevworld/spresense.git
    
    既に git clone 済みの spresense.git リポジトリを更新し、指定バージョンに更新する場合は 指定バージョンのSDKを取得する方法 をご参照ください。

2.2. Windows向けセットアップ

  1. 下記のサイトからMSYS2のインストーラをダウンロードし、インストールします。

  2. ビルドに必要なツールをインストールします。スタートメニューにある MSYS2 MSYS を起動し、以下のコマンドを実行します。

    一緒にインストールされる MSYS2 MinGW 64-bit など他のターミナルを使用するとエラーが発生し正しくビルドできません。
    curl -L https://raw.githubusercontent.com/sonydevworld/spresense/master/install-tools.sh > install-tools.sh
    bash install-tools.sh
    

    curl や install-tools.sh をプロキシ環境下で実行する場合は、事前にお使いのプロキシサーバーを設定してください。

    export http_proxy=http://プロキシーサーバー名:ポート番号
    export https_proxy=http://プロキシーサーバー名:ポート番号
    

    SDKv2.3リリースにて、GNU Arm Embedded Toolchain (コンパイラ) のバージョンを更新しています。

    SDK version GNU Arm Toolchain version

    SDKv2.3以降

    gcc-arm-none-eabi-9-2019-q4-major

    SDKv2.2以前

    gcc-arm-none-eabi-7-2018-q2-update

    コンパイラの更新を含めて再インストールを行う場合は、最新の install-tools.sh を取得し -r オプションを付与して install-tools.sh を実行してください。

    bash install-tools.sh -r
    

    既にインストール済みのコンパイラバージョンを確認するには、source ~/spresenseenv/setup を実行した後に arm-none-eabi-gcc -v を実行してください。最終行にバージョン情報が表示されます。

    arm-none-eabi-gcc -v
    (snip)
    gcc version 9.2.1 20191025 (release) [ARM/arm-9-branch revision 277599] (GNU Tools for Arm Embedded Processors 9-2019-q4-major)
    

    インストールしたツールを使用可能にするために、以下のコマンドを実行します。

    source ~/spresenseenv/setup
    

    このコマンドは、ターミナルを開くごとに実行する必要があります。このコマンドを省略したい場合は、ホームディレクトリ以下の .bashrc に上記コマンドを追加してください。

    ツールチェーンは /opt/spresenseenv/usr/bin にインストールされます。
  3. Spresense SDK リポジトリからソースコードをダウンロードします。

    git clone --recursive https://github.com/sonydevworld/spresense.git
    
    既に git clone 済みの spresense.git リポジトリを更新し、指定バージョンに更新する場合は 指定バージョンのSDKを取得する方法 をご参照ください。
  4. シリアルドライバのインストール

    シリアルドライバのインストールは、Spresense ボードをPCに接続する前に行ってください。

    Spresense ボードをUSBシリアルで接続するために、ドライバをインストールする必要があります。下記リンクよりドライバをダウンロードし、インストールしてください。

2.3. macOS向けセットアップ

  1. Apple社が提供している開発ツールをインストールします。 ターミナルを起動し、以下のコマンドを実行します。

    xcode-select --install
    
  2. 以下のサイトからPython3のインストーラをダウンロードし、インストールします。

  3. wgetをインストールします。(一部のNuttXアプリケーション・ツールをビルドする際に必要になります)

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
    brew install wget
    
  4. ビルドに必要なツールをインストールします。ターミナルを起動し、以下のコマンドを実行します。

    curl -L https://raw.githubusercontent.com/sonydevworld/spresense/master/install-tools.sh > install-tools.sh
    bash install-tools.sh
    

    curl や install-tools.sh をプロキシ環境下で実行する場合は、事前にお使いのプロキシサーバーを設定してください。

    export http_proxy=http://プロキシーサーバー名:ポート番号
    export https_proxy=http://プロキシーサーバー名:ポート番号
    

    SDKv2.3リリースにて、GNU Arm Embedded Toolchain (コンパイラ) のバージョンを更新しています。

    SDK version GNU Arm Toolchain version

    SDKv2.3以降

    gcc-arm-none-eabi-9-2019-q4-major

    SDKv2.2以前

    gcc-arm-none-eabi-7-2018-q2-update

    コンパイラの更新を含めて再インストールを行う場合は、最新の install-tools.sh を取得し -r オプションを付与して install-tools.sh を実行してください。

    bash install-tools.sh -r
    

    既にインストール済みのコンパイラバージョンを確認するには、source ~/spresenseenv/setup を実行した後に arm-none-eabi-gcc -v を実行してください。最終行にバージョン情報が表示されます。

    arm-none-eabi-gcc -v
    (snip)
    gcc version 9.2.1 20191025 (release) [ARM/arm-9-branch revision 277599] (GNU Tools for Arm Embedded Processors 9-2019-q4-major)
    

    インストールしたツールを使用可能にするために、以下のコマンドを実行します。

    source ~/spresenseenv/setup
    

    このコマンドは、ターミナルを開くごとに実行する必要があります。このコマンドを省略したい場合は、ホームディレクトリ以下の .bash_profile に上記コマンドを追加してください。

    ツールチェーンはホームディレクトリ以下の spresenseenv/usr/bin にインストールされます。
  5. ターミナルで以下のコマンドを実行し、Spresense SDK リポジトリからソースコードをダウンロードします。

    git clone --recursive https://github.com/sonydevworld/spresense.git
    
    既に git clone 済みの spresense.git リポジトリを更新し、指定バージョンに更新する場合は 指定バージョンのSDKを取得する方法 をご参照ください。
  6. シリアルドライバのインストール

    シリアルドライバのインストールは、Spresense ボードをPCに接続する前に行ってください。

    Spresense ボードをUSBシリアルで接続するために、ドライバをインストールする必要があります。下記リンクよりドライバをダウンロードし、インストールしてください。

    High Sierra (10.13)以降のmacOSにこのドライバをインストールする場合、インストール中にセキュリティに関する警告が表示されます。 「システム環境設定 > セキュリティ」 メニューを開き、「一般」にある「開発元"Silicon Laboratories Inc"のシステムソフトウェアの読み込みがブロックされました。」と表示されている右にある「許可」ボタンをクリックしてください。この操作が行われない場合、シリアルで接続することができません。

2.4. USB シリアルポートの確認方法

Spresense メインボードと PC を USB で接続します。

spresense musb connect
図 1. メインボードへのUSBの接続

2.4.1. Linux 上でのシリアルポートの確認方法

  1. ターミナルを開きます。

  2. 次のコマンドを入力してください。

    dmesg | grep "cp21.*attached"
    [12220.625979] usb 1-1: cp210x converter now attached to ttyUSB0
    
  3. 上記の例では、 ポート名は /dev/ttyUSB0 になります。

2.4.2. Windows 上でのシリアルポートの確認方法

  1. デバイスマネージャー を開きます。

  2. Silicon Labs CP210x USB to UART Bridge のCOMポートの番号を確認します。

    tutorial arduino windows device manager find port
    図 2. デバイスマネージャーでCOMポートを確認
  3. 上図の例では、ポート名は COM9 になります。

2.4.3. macOS 上でのシリアルポートの確認方法

  1. ターミナルを開きます。

  2. 次のコマンドを入力してください。

    ls /dev/{tty,cu}.*
    /dev/cu.SLAB_USBtoUART  /dev/tty.SLAB_USBtoUART
    
  3. 上記の例では、ポート名は /dev/cu.SLAB_USBtoUART になります。

3. サンプルアプリケーション "Hello, World!" の実行手順

SDKv1.xの旧方法はこちら

"Hello, World!" サンプルアプリケーションのビルドから実行までの一連の流れを説明します。
コンフィグレーション方法やビルド方法の詳細については以降の章を参照してください。

3.1. コンフィグレーション手順

ダウンロードした spresense/sdk フォルダに移動し、Kernel および SDK のコンフィギュレーションを行います

  1. sdk ディレクトリへ移動します。

    cd spresense/sdk
    
  2. SDKのコンフィギュレーションを行います。

    今回は hello というExampleアプリケーションをビルドするので examples/hello を指定します。

    tools/config.py examples/hello
    
WARNING: New loader vX.Y.Z is required, please download and install. のようなメッセージが表示された場合は、適切なブートローダーをインストールする必要があります。 ブートローダーのインストール を参照し、ブートローダーをインストールしてください。

3.2. ビルド手順

  1. SDK のビルドを行います。

    make
    

SDKv2.3以降、-j オプションによるパラレル(並列)ビルドが可能です。

make -j

sdk フォルダに nuttx.spk というバイナリイメージ作成されます。このバイナリイメージは Spresense で実行可能なアプリケーションであり、Spresense メインボードにアップロードして実行することができます。

3.3. 書き込み手順

tools/flash.sh を用いて、ビルドしたバイナリイメージ nuttx.spk を Spresense ボードに書き込みます。

  1. Spresense メインボードと PC を USB ケーブルで接続します。

  2. tools/flash.sh スクリプトを使用して書き込みを行います。

    -c オプションで指定する <port> は USB シリアルポートの確認方法 を参照してください。

    Linux 環境でのコマンド例

    tools/flash.sh -c /dev/ttyUSB0 nuttx.spk
    >>> Install files ...
    install -b 115200
    Install nuttx.spk
    |0%-----------------------------50%------------------------------100%|
    ######################################################################
    
    252480 bytes loaded.
    Package validation is OK.
    Saving package to "nuttx"
    updater# sync
    updater# Restarting the board ...
    reboot
    

    Windows 環境でのコマンド例

    tools/flash.sh -c COM9 nuttx.spk
    >>> Install files ...
    install -b 115200
    Install nuttx.spk
    |0%-----------------------------50%------------------------------100%|
    ######################################################################
    
    252480 bytes loaded.
    Package validation is OK.
    Saving package to "nuttx"
    updater# sync
    updater# Restarting the board ...
    reboot
    

    macOS 環境でのコマンド例

    tools/flash.sh -c /dev/cu.SLAB_USBtoUART nuttx.spk
    >>> Install files ...
    install -b 115200
    Install nuttx.spk
    |0%-----------------------------50%------------------------------100%|
    ######################################################################
    
    252480 bytes loaded.
    Package validation is OK.
    Saving package to "nuttx"
    updater# sync
    updater# Restarting the board ...
    reboot
    
  3. 書き込みが完了すると、ボードは自動的にリブートし書き込まれたイメージを実行します。

WARNING: New loader vX.Y.Z is required, please download and install. のようなメッセージが表示された場合は、適切なブートローダーをインストールする必要があります。 ブートローダーのインストール を参照し、ブートローダーをインストールしてください。

3.4. シリアルターミナル上での動作確認

ここではシリアルターミナルを用いて、実行されているプログラムの動作を確認します。

Linux/macOS 環境の場合、 screenminicom などのシリアルターミナルソフトを、 Windows 環境の場合は、 Tera Term などのシリアル通信ソフトを使用してください。

シリアル通信設定は以下の通りです。

表 1. シリアル通信設定

ボーレート

115200

データ

8 bit

パリティ

none

ストップ

1 bit

フロー制御

none

シリアルターミナルの使用方法に関する詳細は、それぞれのマニュアルなどを参照してください。

ここでは screen コマンドを使用する際の例を挙げます。Linuxの場合は、以下のコマンドで screen コマンドをインストールしてください。

sudo apt install screen
  1. 次のコマンドでシリアルターミナルを開きます。

    screen /dev/ttyUSB0 115200
    

    以下のようにNSHプロンプトが表示されればSpresense メインボードは正しく起動しています。

    NuttShell (NSH)
    nsh>
  2. hello コマンドを実行し Hello, World! と表示されれば完了です。

    NuttShell (NSH)
    nsh> hello
    Hello, World!!
    nsh>
    screen を終了させるには Ctrl+a の後に k を押すと、Really kill this window [y/n] と表示されるので、y を押すと切断&終了できます。

4. ビルド方法

この章では、ビルド方法の詳細について説明します。

SDKv1.xの旧方法はこちら

4.1. コンフィギュレーション

NuttXカーネルおよび Spresense SDK は、様々な状況に対応できるよう、ユーザーの目的にあったコンフィギュレーションを行うことが可能です。

コンフィギュレーションは、 tools/config.py を使用して行います。また tools/mkdefconfig.py を使用してユーザーが設定した内容を保存しておくことができます。

tools/config.py および tools/mkdefconfig.py は、内部でLinuxでも使用されているKconfigビルドシステムを使用します。開発ツールのセットアップ を参照して、Kconfigツールをインストールしてください。

Usage of tools/config.py
cd spresense/sdk
tools/config.py -h
usage: config.py [-h] [-k] [-l] [-m] [-q] [-g] [-d DIR] [-v]
                 [-i [config [config ...]]]
                 [<config name> [<config name> ...]]

Configuration tool

positional arguments:
  <config name>         configuration name

optional arguments:
  -h, --help            show this help message and exit
  -k, --kernel          DEPRECATED
  -l, --list            list default configurations. show kernel defconfigs
                        with --kernel.
  -m, --menuconfig      run config in "menuconfig"
  -q, --qconfig         run config in "qconfig"
  -g, --gconfig         run config in "gconfig"
  -d DIR, --dir DIR     change configs directory
  -v, --verbose         verbose messages
  -i [config [config ...]], --info [config [config ...]]
                        show configuration information
Usage of tools/mkdefconfig.py
cd spresense/sdk
tools/mkdefconfig.py -h
usage: mkdefconfig.py [-h] [-k] [-d DIR] [-y] [--all] [--verbose]
                      <config name>

Make default config from current config

positional arguments:
  <config name>      configuration name

optional arguments:
  -h, --help         show this help message and exit
  -k                 DEPRECATED
  -d DIR, --dir DIR  change configs directory
  -y                 overwrite existing defconfig
  --all              DEPRECATED
  --verbose, -v      verbose messages

tools/config.py ツールは、 menuconfig などのフロントエンドおよび定義済みコンフィギュレーション(後述)のロードなどを行います。

tools/config.py tools/mkdefconfig.py はディレクトリ構造に依存しているため、必ず sdk ディレクトリ以下で実行してください。

4.1.1. menuconfig, qconfig, gconfig

設定を変更したい場合は、 tools/config.py の以下のオプションを指定し、設定画面を呼び出します。

表 2. 設定画面呼び出しオプション

オプション

-m または --menuconfig

ncursesライブラリを用いた、CUIメニュー選択

-q または --qconfig

Qtライブラリを使用したGUIメニュー選択

-g または --gconfig

gtkライブラリを使用したGUIメニュー選択

上記のメニュー選択方式は kconfig-frontend の機能に依存しています。kconfig-frontend をビルドする際のオプションによっては使用できない場合がありますが、いずれの方式でも機能は同等です。

4.1.2. 定義済みコンフィギュレーション(defconfig)

定義済みコンフィギュレーション(defconfig)は、ある機能を使用したい場合に必要な設定の組み合わせを事前に定義したものです。defconfigファイルは spresense/sdk/configs ディレクトリ以下に保存されています。defconfigを使用したい場合は、 tools/config.py ツールの引数にdefconfig名を指定します。defconfig名には、 -l オプションで表示されるdefconfigを指定できます。

定義済みdefconfigのリストは次のようにして確認できます。

tools/config.py --list
(SDK 定義済みコンフィグレーションリストの表示)

定義済みコンフィギュレーションの表示にタブ補完機能を使用することができます。

source tools/build-env.sh
tools/config.py
(Tab キーを押すと一覧表示されます)

defconfigは同時に複数指定することができます。defconfigを複数指定した場合は、指定されたdefconfigの組み合わせとなります。

tools/config.py device/sdcard feature/wifi
tools/config.py にコンフィグ名を指定した場合は、以前の設定が消えて、指定されたdefconfigが新たにセットされます。

defconfigの内容がわからない場合は、-i または --info オプションをを使用することで、指定されたdefconfigの情報が表示されます。

./tools/config.py -i device/sdcard
=== device/sdcard ===
[Description]
This configuration contains required options to use SD card slot.

[Differences]
+CXD56_SDIO=y

4.1.3. 設定の保存

ユーザーが変更した設定は保存しておくことが可能です。以下のコマンドで現在のSDKの設定を <config name> として保存します。

tools/mkdefconfig.py <config name>

保存した設定は tools/config.py に指定することができるようになります。

<config name> に指定した名前が既に存在する場合は、上書きするかどうかの確認が表示されます。

tools/config.pytools/mkdefconfig.py は、 sdk/configs 以下にあるdefconfigを対象に適用/保存を行います。もしユーザーが別のディレクトリでコンフィギュレーションを管理したい場合は、 -d または --dir オプションで保存先を変更することができます。

tools/mkdefconfig.py -d ../path/to/configs <config name>

別のディレクトリに保存したdefconfigを使用する場合は以下のようにします。

tools/config.py -d ../path/to/configs <config name>

ディレクトリの変更は、 -k オプションと組み合わせても使用可能です。

4.2. ビルド

ビルドを行う場合は、以下のように入力します。ビルドを行う前に、コンフィギュレーションを行っておく必要があります。

tools/config.py default
tools/config.py -m
(設定の変更)
make

SDKv2.3以降、-j オプションによるパラレル(並列)ビルドが可能です。

make -j

ビルドが成功すると sdk ディレクトリ以下に nuttx ファイルと nuttx.spk ファイルができます。

nuttx

ELF形式の実行ファイルです。デバッガでロードする場合などで使用します。

nuttx.spk

実機に書き込むためにパッケージングされた独自形式のファイルです。

5. ボードへの書き込み方法

この章ではブートローダ及びビルドしたソフトウェアイメージを Spresense ボードに書き込む方法について説明します。

5.1. Spresense メインボードへのブートローダーの書き込み

ブートローダーのインストール を参照してください。

5.2. Spresense メインボードへのイメージの書き込み

tools/flash.sh を用いて、ビルドしたイメージ nuttx.spk を Spresense ボードに書き込みます。

Usage of tools/flash.sh
./tools/flash.sh -h
  Usage:
       ./tools/flash.sh [-c <UART Port> -b <UART Baudrate>] <(e)spk file> [<(e)spk file> ...]

  Mandatory argument:
       (e)spk file path

  Optional arguments:
       -c: Serial port (default: /dev/ttyUSB0)
       -b: Serial baudrate (default: 115200)
       -e: Extract loader archive
       -l: Flash loader
       -r: Remove nuttx(Main Core SPK) file from spresense board
       -w: Worker load mode
       -h: Show help (This message)

<Serial port> に指定するシリアルポートは USB シリアルポートの確認方法 を参照し、環境に合わせて変更してください。

  1. Spresense メインボードと PC を USB ケーブルで接続します。

  2. 次のコマンドで nuttx.spk を Spresense へ書き込みます。

    Linux 環境でのコマンド例

    tools/flash.sh -c /dev/ttyUSB0 nuttx.spk
    

    Windows 環境でのコマンド例

    tools/flash.sh -c COM9 nuttx.spk
    

    macOS 環境でのコマンド例

    tools/flash.sh -c /dev/cu.SLAB_USBtoUART nuttx.spk
    
  3. 書き込みが完了すると、ボードは自動的にリブートし書き込まれたイメージを起動します。

-b オプションで baudrate を指定して高速に書き込みを行うことができます。
baudrate には任意の値を指定することができますが、推奨値としては、
1152000, 1000000, 921600, 576000, 500000, 460800, 230400, 115200
のいずれかを指定してください。

tools/flash.sh -c /dev/ttyUSB0 -b 1000000 nuttx.spk

高速化しすぎるとPC 環境に依存して書き込み時に通信エラーが発生することがあります。 もし、エラーが発生した場合は、USB を抜き差しした後に、baudrate 値を下げて試してください。

6. ユーザーアプリの追加方法

SDKv1.xの旧方法はこちら

ユーザーが新しいアプリを作成する場合は、以下の方法があります。

6.1. examplesに追加する

もっとも簡単な方法は、sdk/apps/examples/hello をテンプレートとして使用することです。 sdk/apps/examples/hello をディレクトリごと examples 以下にコピーし、MakefileMake.defsKconfighello_main.c の中にある hello の文字列をすべて任意の文字列に置き換えてください。hello_main.c のファイル名も任意のファイル名に変更してください。(アプリ追加例参照)

すべての文字列を置き換えたら、sdk ディレクトリで一旦 make clean をして、tools/config.py でコンフィグメニューを表示します。 追加した項目が表示されるので、それを有効にします。

cd sdk
make clean
tools/config.py -m
kconfigメニュー
Examples  --->
  [ ] My first app example (NEW)
Kconfig ファイルを追加または削除した場合は、sdk ディレクトリで make clean を実行することで、コンフィグメニューが更新されます。

有効にしたらSDKをビルドします。

make

SDKv2.3以降、-j オプションによるパラレル(並列)ビルドが可能です。

make -j

作成された nuttx.spk をインストールし、再起動すれば追加したアプリがコマンドとして実行可能になります。

6.1.1. アプリ追加例

Kconfig
config EXAMPLES_MYFIRSTAPP
	tristate "My first app example"
	default n
	---help---
		Enable the my first app example

if EXAMPLES_MYFIRSTAPP

config EXAMPLES_MYFIRSTAPP_PROGNAME
	string "Program name"
	default "myfirstapp"
	---help---
		This is the name of the program that will be use when the NSH ELF
		program is installed.

config EXAMPLES_MYFIRSTAPP_PRIORITY
	int "My firstapp task priority"
	default 100

config EXAMPLES_MYFIRSTAPP_STACKSIZE
	int "My firstapp stack size"
	default 2048

endif

Kconfigファイル内の config <symbol> で定義したシンボルは、Makefile内で CONFIG_<symbol> という変数で参照可能です。

Kconfig ファイルに定義するオプションシンボルはSDKで一意である必要があります。シンボルが重複した場合、コンフィギュレーションツール実行時に警告が表示されます。
Makefile
-include $(TOPDIR)/Make.defs

PROGNAME  = $(CONFIG_EXAMPLES_MYFIRSTAPP_PROGNAME)
PRIORITY  = $(CONFIG_EXAMPLES_MYFIRSTAPP_PRIORITY)
STACKSIZE = $(CONFIG_EXAMPLES_MYFIRSTAPP_STACKSIZE)
MODULE    = $(CONFIG_EXAMPLES_MYFIRSTAPP)

MAINSRC = myfirstapp_main.c

include $(APPDIR)/Application.mk
PROGNAME

この変数に設定されている文字列がコマンド名になります

PRIORITY

コマンドタスクの優先度を設定します

STACKSIZE

コマンドタスクのスタックサイズを設定します

MODULE

モジュール(単一のELFファイル)としてビルドするかどうかを指定します

上記のPROGNAME、PRIORITYおよびSTACKSIZEのいずれかが設定されていない場合は、コマンドになりません。

Make.defs
ifneq ($(CONFIG_EXAMPLES_MYFIRSTAPP),)
CONFIGURED_APPS += myfirstapp
endif
CONFIGURED_APPS

この変数に設定されているディレクトリがビルド対象になります

6.2. 別ディレクトリに追加する

ユーザーがリポジトリの外でアプリを管理したい場合は、別のディレクトリを作成し、それをビルド対象に追加することができます。 別ディレクトリをビルド対象に加えるには以下のようにします。

  1. 任意のディレクトリをsdkと同じディレクトリに作成

  2. examples ディレクトリから、MakefileMake.defs および .sdksubdirs をコピー

  3. 上述のexamplesに追加すると同じ手順で、新規に作成したディレクトリ内に任意のアプリケーションを追加

  4. sdk ディレクトリで make

6.2.1. 別ディレクトリ追加例

ディレクトリを myapps 、アプリケーションを myfirstapp とした場合の例

作成後のファイル構成
|-- sdk
|-- examples
|-- myapps
    |-- .sdksubdirs
    |-- Make.defs
    |-- Makefile
    `-- myfirstapp
        |-- Kconfig
        |-- Make.defs
        |-- Makefile
        `-- myfirstapp_main.c
myapps/Makefile
MENUDESC = "My Apps"

include $(SDKDIR)/tools/Sdk.mk
MENUDESC

コンフィギュレーションメニューに表示される文字列

6.3. ツールを使用する

前述のexamplesに追加する手順及び別ディレクトリに追加する手順は、下記ヘルパーツールを使用して簡単に行うことができます。

アプリ追加ツール
tools/mkcmd.py -h
usage: mkcmd.py [-h] [-d BASEDIR] [-v] <app name> [desc]

Create a new application

positional arguments:
  <app name>            New application name
  desc                  Menu description

optional arguments:
  -h, --help            show this help message and exit
  -d BASEDIR, --basedir BASEDIR
                        Base directory to create new application
  -v, --verbose         Verbose messages

This tool create a new application at examples directory.
You can use '-d' option to change application directory, it is a same level
of sdk and examples.
ディレクトリ追加ツール
tools/mkapppsdir.py -h
usage: mkappsdir.py [-h] [-s] [-v] <dir name> [desc]

Create a new application directory at the outside of sdk repository

This tool must be run on sdk directory.

positional arguments:
  <dir name>     New application directory name
  desc           Menu description

optional arguments:
  -h, --help     show this help message and exit
  -s, --spresense_home  using spresense home
  -v, --verbose  verbose messages
上記ツールは、 sdk ディレクトリで実行してください。

6.3.1. 使用例

examplesにアプリ myfirstapp を追加する
cd spresense/sdk
tools/mkcmd.py myfirstapp "My first app example"
新規ディレクトリ myapps を作成し、そこにアプリ myfirstapp を追加する
cd spresense/sdk
tools/mkappsdir.py myapps "My Apps"
tools/mkcmd.py -d myapps myfirstapp "My first app example"

7. ブートローダーのインストール

Spresense メインボードを正しく動作させるためにはバージョンに合わせたブートローダーのインストールが必要です。

  • Spresense ボードの出荷状態ではブートローダーはインストールされていません。

  • Spresenseのブートローダーを利用するためにはEnd User License Agreementの同意が必要です。

適切なバージョンのブートローダーがインストールされていない場合、spresense/sdk ディレクトリの下で、 tools/config.py 及び tools/flash.sh ツールを実行したときに次のような WARNING が表示されます。
Install command: に書かれた内容に従ってインストールを行います。

WARNING: New loader vX.Y.Z is required, please download and install.
         Download URL   : <<お使いのSpresense SDK用に適切なブートローダーのダウンロードURLが表示されます>>
         Install command:
                          1. Extract loader archive into host PC.
                             ./tools/flash.sh -e <download zip file>
                          2. Flash loader into Board.
                             ./tools/flash.sh -l <<展開されたブートローダのパスが表示されます>> -c <port>
  1. ZIP ファイルのダウンロード

    tools/config.py あるいは tools/flash.sh を実行した時に表示されるWARNINGメッセージ中の Download URL に記載されているリンクを開き ZIP ファイルをダウンロードします。

  2. ZIP ファイルを展開

    下記コマンドを実行してダウンロードした ZIP ファイルを展開します。

    ./tools/flash.sh -e <<ダウンロードしたzipファイル>>
    
  3. バイナリのSpresense メインボードへのロード

    Spresense メインボードと PC を USB ケーブルで接続した後、下記コマンドを実行します。
    -c オプションで指定する <port> は USB シリアルポートの確認方法 を参考にお使いの環境に合わせて変更してください。 以下に、Linux / Windows / macOS 環境での実行コマンド例を示します。

    以下はWARNINGに記載されているInstall commandの2. が ./tools/flash.sh -l /home/user/spresense/firmware/spresense -c <port> の場合の例です。

    Linux 環境でのコマンド例

    ./tools/flash.sh -l /home/user/spresense/firmware/spresense -c /dev/ttyUSB0
    

    Windows 環境でのコマンド例

    ./tools/flash.sh -l /home/user/spresense/firmware/spresense -c COM9
    

    macOS 環境でのコマンド例

    ./tools/flash.sh -l /home/user/spresense/firmware/spresense -c /dev/cu.SLAB_USBtoUART
    

8. Spresense コマンドスクリプト(β版)

Spresense SDKでは、頻繁に使用するコマンドを簡易化するスクリプト tools/build-env.sh を用意しています。 このスクリプトを実行することで以下の機能が追加されます。

  1. Spresense SDKディレクトリ以外の場所へのアプリケーションの登録

  2. Spresenseコマンドの対応

  3. ./tools/config.py 使用時のTAB補完

実行方法

source tools/build-env.sh
本スクリプトは、ターミナルの環境変数を設定します。ターミナルを切り替えた場合は再度上記の実行方法を実施してください。

8.1. Spresense SDKディレクトリ以外の場所へのアプリケーションの登録

Spresense SDKでは任意の場所にアプリケーションを追加することができます。

sdk user application
図 3. Spresense SDKとアプリケーションルートの関係

上図のように、Spresense SDKと独立して アプリケーションルート にSDKのアプリケーションを作成することができます。 同じ方法で作成したアプリケーションを アプリケーションルート にコピーすることでアプリケーションを取り込むこともできます。

アプリケーションルートの登録及びアプリケーションの作成については、次のコマンドを利用します。

  • spr-create-approot

  • spr-set-approot

  • spr-create-app

コマンドの詳細は Spresenseコマンド を参照ください。

8.2. Spresenseコマンド

コマンド名 機能

spr-config

SDKのビルドに関するコンフィギュレーションを行うためのコマンドです。 ./tools/config.py と同一の機能を備えます。

spr-make

SDKをビルドするコマンドです。基本的には make と同一の機能を備えますが、ユーザアプリケーションがある場所からも実行できるコマンドになります。

spr-create-approot

Spresense SDKのアプリケーション群を保存するためのディレクトリ(アプリケーションルート)を作成するコマンドです。作成されたディレクトリ内に複数のアプリケーションを作成し管理することができます。

spr-set-approot

作成されているアプリケーションルートを設定するためのコマンドです。このコマンドは spr-create-approot を実行してすでにアプリケーションルートが作成されている必要があります。

spr-create-app

アプリケーションルートにSDKアプリケーションのスケルトンを作成するためのコマンドです。

spr-go-sdk

Spresense SDKへ移動するためのコマンドです。

spr-go-approot

現在設定されているアプリケーションルートへ移動するためのコマンドです。

8.3. spr-config

spr-config ではSDKのビルドに必要なコンフィギュレーションを行えます。機能は tools/config.py と同一です。また TAB補完 にも対応しており、以下のようにコマンドを入力することでコンフィギュレーションのキー入力を補助できます。

spr-config exam<TABキー>
spr-config examples/he<TABキー>
spr-config examples/hello

また、この機能を応用することで以下のように利用できるコンフィギュレーションを一覧として確認することができます。

spr-config <TABキー><TABキー>
board/collet                        examples/hello
board/corvo                         examples/helloxx
board/spresense                     examples/jpeg_decode
default                             examples/lcdrw
device/accelerometer                examples/light
device/adc                          examples/lte_awsiot
device/bcm20706                     examples/lte_http_get
device/camera                       examples/lte_lwm2m
device/charger                      examples/lte_mqtt
device/colorsensor                  examples/lte_tls
device/lcd                          examples/lte_websocket
device/lightsensor                  examples/mag
device/magnetometer                 examples/nx
device/pressure                     examples/nxhello

8.4. spr-make

Spresense SDKのビルドコマンド make と同等の機能を持つコマンドです。 spresense/sdk 以外の場所からもこのコマンドでビルドを実行することができます。サブコマンド buildkernel などにも対応しています。

spr-config --kernel release
spr-config examples/hello
spr-make buildkernel
spr-make

8.5. spr-create-approot

アプリケーションルート として使用するディレクトリを作成(設定)するコマンドです。 SDKでのビルドに必要なファイルもこのコマンドによって作成されます。

/home/user/myapps に作成する場合

spr-create-approot /home/user/myapps
Creating application directory into /home/user/myapps

上記コマンドを実行すると以下のようにディレクトリとビルドに必要なファイルが作成されます。

tree /home/user/myapps
/home/user/myapps
├── Application.mk
├── LibTarget.mk
├── Make.defs
└── Makefile

0 directories, 4 files

このコマンドにより作成されたディレクトリの中にアプリケーションを登録することができます。

設定した アプリケーションルート はターミナル切り替え時、再度 source ./tools/build-env.sh を実行することで復帰します。

8.6. spr-set-approot

アプリケーションルート として使用するディレクトリを切り替えるコマンドです。 切り替えるディレクトリは事前に spr-create-approot コマンドで作成されている必要があります。

/home/user/myapps に切り替える場合

spr-set-approot /home/user/myapps

8.7. spr-create-app

新しい空のアプリケーションを作成するコマンドです。 アプリケーションは spr-create-approot または spr-set-approot によって選択したアプリケーションルートに作成されます。

myapp という名前で作成する場合

spr-create-app myapp
New 'myapp' app successfully created at '/home/user/myapps/myapp'.

上記コマンドを実行すると以下のようにディレクトリとビルドに必要なファイルが作成されます。

tree /home/user/myapps/myapp
/home/user/myapps/myapp
├── configs
│   └── default-defconfig
├── Kconfig
├── Make.defs
├── Makefile
└── myapp_main.c

1 directory, 5 files

また、アプリケーションは <アプリケーション名>_main.c にプログラムを記述することによって更新ができます。 このコマンドによってプログラムファイルは以下のように作成され、 myapp_main(int argc, char *argv[]) 関数内にプログラムを記載することができます。

cat /home/user/myapps/myapp/myapp_main.c

#include <sdk/config.h>
#include <stdio.h>

#ifdef CONFIG_BUILD_KERNEL
int main(int argc, FAR char *argv[])
#else
int myapp_main(int argc, char *argv[])
#endif
{
  return 0;
}

また、作成されたアプリケーションは ./tools/config.pyspr-config によって myapp/myapp/default として選択することができます。

spr-config <TAB>
...
examples/audio_recorder_pre  examples/mag                 myapp/myapp/default
examples/audio_through       examples/nx
examples/ble_central         examples/nxhello

8.8. spr-go-sdk

Spresense SDKに入るためのコマンドです。 Spresense SDKリポジトリを更新したり、ツールを使用する際に利用します。

8.9. spr-go-approot

設定したアプリケーションルートへ入るためのコマンドです。

9. 制限事項

9.1. 使用するフォルダーによっては Spresense SDK をお使いいただけません

Spresense SDK では、ビルドシステムの制約によりスペースを含むファイル名およびフォルダー名を使用することはできません。

ファイル名あるいはフォルダー名のパスにスペースが入っている場合は、コンフィグレーションやビルドが正しく行えません。パスにスペースの含まない場所にSpresense SDKをダウンロードし、お使いください。

10. 付録

10.1. 指定バージョンのSDKを取得する方法

Spresense SDK スタートガイド (CLI 版)章では、SDKを git clone を用いて、一からダウンロードする方法を解説いたしました。 ここでは、すでに git clone にてダウンロード済みのSDKリポジトリに対して、指定のバージョンに置き換える方法を解説いたします。

10.1.1. リポジトリ内のクリーン

指定バージョンのSDKに置き換える場合は、置き換える前にリポジトリ内をクリーンする必要があります。以下の手順で状態を確認し、リポジトリをクリーンしてください。

10.1.1.1. ビルド成果物のクリーン

以下のコマンドで make した際に生成したファイルを削除します。

make distclean
10.1.1.2. リポジトリ修正内容のクリーン

以下のコマンドでCommitしていないリポジトリの編集内容を確認します。

git status

リポジトリに編集しているファイルがある場合は、下記のように modifiedUntracked files として表示されます。

On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   examples/accel/accel_main.c

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	examples/accel/README

no changes added to commit (use "git add" and/or "git commit -a")

このような場合は、編集内容をCommitするか、下記コマンドで一時退避を行ってください。

git stash
git stash で一旦退避させた編集内容は git stash pop にて呼び戻すことができます。

10.1.2. リポジトリ管理情報の更新

以下の方法でリポジトリの管理情報を更新します。管理情報はリポジトリディレクトリ内の .git に含まれ、この作業でこの中の情報のみが更新されます。

例:/home/user/spresense にリポジトリをcloneした場合

cd /home/user/spresense
git fetch origin
origin はリモートリポジトリ名で、 git clone <URL> で指定した <URL> に紐付いています。

10.1.3. 指定バージョンでリポジトリをチェックアウト

例:v2.0.2 でチェックアウトする場合

git checkout v2.0.2
git submodule init
git submodule update
リリースバージョンを指定する場合は上記の例の通りバージョン番号でチェックアウトします。ブランチを指定する場合は、 origin/masterorigin/develop のようにブランチ名を指定しチェックアウトしてください。
チェックアウトすると、前のバージョンで編集しCommitした内容が消えてしまいます。Commitした内容を保持しつつ、指定のバージョンを取得するためには git merge コマンドを利用して、Commitをマージしてください。

10.1.4. チェックアウト後に Untracked files: が残っている場合

SDK v1.5.1 → v2.0.2 、 v2.0.2 → v1.5.1 などメジャーバージョンを変更してチェックアウトした場合は、以下のように Untracked files: が残る場合があります。

HEAD detached at v2.0.2
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	externals/nnabla-c-runtime/

nothing added to commit but untracked files present (use "git add" to track)

その場合は、手動で対象ディレクトリを削除してください。

10.2. v1.5以前のバージョンのSDKをビルドする方法

SDK v1.5以前のビルド方法を以下に示します。

10.2.1. サンプルアプリケーション "Hello, World!" の実行手順 (旧バージョン1.X)

"Hello, World!" サンプルアプリケーションのビルドから実行までの一連の流れを説明します。
コンフィグレーション方法やビルド方法の詳細については以降の章を参照してください。

10.2.1.1. コンフィグレーション手順

ダウンロードした spresense/sdk フォルダに移動し、Kernel および SDK のコンフィギュレーションを行います

  1. sdk ディレクトリへ移動します。

    cd spresense/sdk
    
  2. SDKのコンフィギュレーションを行います。

    今回は hello というExampleアプリケーションをビルドするので examples/hello を指定します。

    tools/config.py examples/hello
    
10.2.1.2. ビルド手順
  1. SDK のビルドを行います。

    make
    

sdk フォルダに nuttx.spk というバイナリイメージ作成されます。このバイナリイメージは Spresense で実行可能なアプリケーションであり、Spresense メインボードにアップロードして実行することができます。

10.2.1.3. 書き込み手順

tools/flash.sh を用いて、ビルドしたバイナリイメージ nuttx.spk を Spresense ボードに書き込みます。

  1. Spresense メインボードと PC を USB ケーブルで接続します。

  2. tools/flash.sh スクリプトを使用して書き込みを行います。

    -c オプションで指定する <port> は USB シリアルポートの確認方法 を参照してください。

    Linux 環境でのコマンド例

    tools/flash.sh -c /dev/ttyUSB0 nuttx.spk
    >>> Install files ...
    install -b 115200
    Install nuttx.spk
    |0%-----------------------------50%------------------------------100%|
    ######################################################################
    
    252480 bytes loaded.
    Package validation is OK.
    Saving package to "nuttx"
    updater# sync
    updater# Restarting the board ...
    reboot
    

    Windows 環境でのコマンド例

    tools/flash.sh -c COM9 nuttx.spk
    >>> Install files ...
    install -b 115200
    Install nuttx.spk
    |0%-----------------------------50%------------------------------100%|
    ######################################################################
    
    252480 bytes loaded.
    Package validation is OK.
    Saving package to "nuttx"
    updater# sync
    updater# Restarting the board ...
    reboot
    

    macOS 環境でのコマンド例

    tools/flash.sh -c /dev/cu.SLAB_USBtoUART nuttx.spk
    >>> Install files ...
    install -b 115200
    Install nuttx.spk
    |0%-----------------------------50%------------------------------100%|
    ######################################################################
    
    252480 bytes loaded.
    Package validation is OK.
    Saving package to "nuttx"
    updater# sync
    updater# Restarting the board ...
    reboot
    
  3. 書き込みが完了すると、ボードは自動的にリブートし書き込まれたイメージを実行します。

10.2.1.4. シリアルターミナル上での動作確認

ここではシリアルターミナルを用いて、実行されているプログラムの動作を確認します。

Linux/macOS 環境の場合、 screenminicom などのシリアルターミナルソフトを、 Windows 環境の場合は、 Tera Term などのシリアル通信ソフトを使用してください。

シリアル通信設定は以下の通りです。

表 3. シリアル通信設定

ボーレート

115200

データ

8 bit

パリティ

none

ストップ

1 bit

フロー制御

none

シリアルターミナルの使用方法に関する詳細は、それぞれのマニュアルなどを参照してください。

ここでは screen コマンドを使用する際の例を挙げます。Linuxの場合は、以下のコマンドで screen コマンドをインストールしてください。

sudo apt install screen
  1. 次のコマンドでシリアルターミナルを開きます。

    screen /dev/ttyUSB0 115200
    

    以下のようにNSHプロンプトが表示されればSpresense メインボードは正しく起動しています。

    NuttShell (NSH)
    nsh>
  2. hello コマンドを実行し Hello, World! と表示されれば完了です。

    NuttShell (NSH)
    nsh> hello
    Hello, World!!
    nsh>
    screen を終了させるには Ctrl+a の後に k を押すと、Really kill this window [y/n] と表示されるので、y を押すと切断&終了できます。

10.2.2. ビルド方法 (旧バージョン1.X)

この章では、ビルド方法の詳細について説明します。

10.2.2.1. コンフィギュレーション

NuttXカーネルおよび Spresense SDK は、様々な状況に対応できるよう、ユーザーの目的にあったコンフィギュレーションを行うことが可能です。

コンフィギュレーションは、Linuxでも使用されているKconfigビルドシステムを使用します。開発ツールのセットアップ を参照して、コンフィギュレーションツールをインストールしてください。

コンフィギュレーションは、NuttXカーネルとSDKのコンフィギュレーションに分かれています。Spresense SDKでは、それらのコンフィギュレーションを行うためのツール tools/config.py tools/mkdefconfig.py を提供しています。

Usage of tools/config.py
cd spresense/sdk
tools/config.py -h
usage: config.py [-h] [-k] [-l] [-m] [-q] [-g] [-d DIR] [-v]
                 [<config name> [<config name> ...]]

Configuration tool

positional arguments:
  <config name>      configuration name

optional arguments:
  -h, --help         show this help message and exit
  -k, --kernel       kernel config
  -l, --list         list default configurations. show kernel defconfigs with
                     --kernel.
  -m, --menuconfig   run config in "menuconfig"
  -q, --qconfig      run config in "qconfig"
  -g, --gconfig      run config in "gconfig"
  -d DIR, --dir DIR  change configs directory
  -v, --verbose      verbose messages
Usage of tools/mkdefconfig.py
cd spresense/sdk
tools/mkdefconfig.py -h
usage: mkdefconfig.py [-h] [-k] [-d DIR] [--all] [--verbose] <config name>

Make default config from current config

positional arguments:
  <config name>      configuration name

optional arguments:
  -h, --help         show this help message and exit
  -k                 save kernel configuration
  -d DIR, --dir DIR  change configs directory
  --all              Save SDK and kernel configuration with same name
  --verbose, -v      verbose messages

tools/config.py ツールは、 menuconfig などのフロントエンドおよび定義済みコンフィギュレーション(後述)のロードなどを行います。

このツールは、NuttXカーネルおよび Spresense SDK の設定を行うことができますが、どちらの設定を行うかどうかは -k または --kernel オプションによって切り替えます。 -k オプションが指定されていた場合はNuttXカーネルの設定、指定されていない場合はSDKの設定を変更します。例えば、カーネルのコンフィギュレーションを変更したい場合は、以下のようにします。

e.g.
cd spresense/sdk
tools/config.py -k -m
tools/config.py tools/mkdefconfig.py はディレクトリ構造に依存しているため、必ず sdk ディレクトリ以下で実行してください。
menuconfig, qconfig, gconfig

設定を変更したい場合は、 tools/config.py の以下のオプションを指定し、設定画面を呼び出します。

表 4. 設定画面呼び出しオプション

オプション

-m または --menuconfig

ncursesライブラリを用いた、CUIメニュー選択

-q または --qconfig

Qtライブラリを使用したGUIメニュー選択

-g または --gconfig

gtkライブラリを使用したGUIメニュー選択

上記のメニュー選択方式は kconfig-frontend の機能に依存しています。kconfig-frontend をビルドする際のオプションによっては使用できない場合がありますが、いずれの方式でも機能は同等です。

定義済みコンフィギュレーション(defconfig)

定義済みコンフィギュレーション(defconfig)は、ある機能を使用したい場合に必要な設定の組み合わせを事前に定義したものです。defconfigファイルは spresense/sdk/configs ディレクトリ以下に保存されています。defconfigを使用したい場合は、 tools/config.py ツールの引数にdefconfig名を指定します。defconfig名には、 -l オプションで表示されるdefconfigを指定できます。

定義済みdefconfigのリストは次のようにして確認できます。

tools/config.py --kernel --list
(NuttX kernel 定義済みコンフィグレーションリストの表示)
tools/config.py --list
(SDK 定義済みコンフィグレーションリストの表示)

定義済みコンフィギュレーションの表示にタブ補完機能を使用することができます。

source tools/build-env.sh
tools/config.py
(Tab キーを押すと一覧表示されます)

定義済みコンフィギュレーションを指定する場合は次のようにして行うことができます。

tools/config.py --kernel release
tools/config.py board/spresense

defconfigは同時に複数指定することができます。defconfigを複数指定した場合は、指定されたdefconfigの組み合わせとなります。

tools/config.py board/spresense device/sdcard
tools/config.py にコンフィグ名を指定した場合は、以前の設定が消えて、指定されたdefconfigが新たにセットされます。
設定の保存

ユーザーが変更した設定は保存しておくことが可能です。以下のコマンドで現在のSDKの設定を <config name> として保存します。

tools/mkdefconfig.py <config name>

上記の例では、SDKの設定のみ保存され、NuttXカーネルの設定は保存されません。カーネルの設定を保存したい場合は、 -k オプションまたは --all オプションを使用します。 --all オプションを指定した場合は、SDKとカーネルの両方の現在の設定が指定された名前で保存されます。

tools/mkdefconfig.py -k <config name>

保存した設定は tools/config.py に指定することができるようになります。

<config name> に指定した名前が既に存在する場合は、上書きするかどうかの確認が表示されます。

tools/config.pytools/mkdefconfig.py は、 sdk/configs 以下にあるdefconfigを対象に適用/保存を行います。もしユーザーが別のディレクトリでコンフィギュレーションを管理したい場合は、 -d または --dir オプションで保存先を変更することができます。

tools/mkdefconfig.py -d ../path/to/configs <config name>

別のディレクトリに保存したdefconfigを使用する場合は以下のようにします。

tools/config.py -d ../path/to/configs <config name>

ディレクトリの変更は、 -k オプションと組み合わせても使用可能です。

10.2.2.2. ビルド

ビルドは、コンフィギュレーションと同様にNuttXカーネルとSDKに分かれています。それぞれビルドする必要があります。どちらの場合も、 sdk ディレクトリ以下で行います。

diag e747f32f27b233a12281e5df1ced4ba4
図 4. ビルドワークフロー
NuttXカーネルのビルド

NuttXカーネルのビルドを行う場合は、以下のように入力します。ビルドを行う前に、カーネルのコンフィギュレーションを行っておく必要があります。

cd spresense/sdk
tools/config.py -k release
tools/config.py -k -m
(設定の変更)
make buildkernel

カーネルのコンフィギュレーションを省略したい場合は、以下のようにすることもできます。

cd spresense/sdk
make buildkernel KERNCONF=release
NuttXカーネルの設定変更およびソースの修正を行っていない場合は、再度ビルドする必要はありません。
SDKのビルド

SDKのビルドを行う場合は、以下のように入力します。カーネルの場合と同様、設定は make コマンドの前に行っておく必要があります。

tools/config.py default
tools/config.py -m
(設定の変更)
make

ビルドが成功すると sdk ディレクトリ以下に nuttx ファイルと nuttx.spk ファイルができます。

nuttx

ELF形式の実行ファイルです。デバッガでロードする場合などで使用します。

nuttx.spk

実機に書き込むためにパッケージングされた独自形式のファイルです。

10.2.3. ユーザーアプリの追加方法 (旧バージョン1.X)

ユーザーが新しいアプリを作成する場合は、以下の方法があります。

10.2.3.1. examplesに追加する

もっとも簡単な方法は、hello をテンプレートとして使用することです。 hello をディレクトリごと examples 以下にコピーし、MakefileMake.defsKconfighello_main.c の中にある hello の文字列をすべて任意の文字列に置き換えてください。hello_main.c のファイル名も任意のファイル名に変更してください。(アプリ追加例参照)

すべての文字列を置き換えたら、sdk ディレクトリで一旦 make clean をして、tools/config.py でコンフィグメニューを表示します。 追加した項目が表示されるので、それを有効にします。

cd sdk
make clean
tools/config.py -m
kconfigメニュー
Examples  --->
  [ ] My first app example (NEW)
Kconfig ファイルを追加または削除した場合は、sdk ディレクトリで make clean を実行することで、コンフィグメニューが更新されます。

有効にしたらSDKをビルドします。

make

作成された nuttx.spk をインストールし、再起動すれば追加したアプリがコマンドとして実行可能になります。

アプリ追加例
Kconfig
config EXAMPLES_MYFIRSTAPP
	bool "My first app example"
	default n
	---help---
		Enable the my first app example

if EXAMPLES_MYFIRSTAPP

config EXAMPLES_MYFIRSTAPP_PROGNAME
	string "Program name"
	default "myfirstapp"
	depends on BUILD_KERNEL
	---help---
		This is the name of the program that will be use when the NSH ELF
		program is installed.

config EXAMPLES_MYFIRSTAPP_PRIORITY
	int "My firstapp task priority"
	default 100

config EXAMPLES_MYFIRSTAPP_STACKSIZE
	int "My firstapp stack size"
	default 2048

endif

Kconfigファイル内の config <symbol> で定義したシンボルは、Makefile内で CONFIG_<symbol> という変数で参照可能です。

Kconfig ファイルに定義するオプションシンボルはSDKで一意である必要があります。シンボルが重複した場合、コンフィギュレーションツール実行時に警告が表示されます。
Makefile
-include $(TOPDIR)/Make.defs
-include $(SDKDIR)/Make.defs

# My first app built-in application info

CONFIG_EXAMPLES_MYFIRSTAPP_PRIORITY ?= SCHED_PRIORITY_DEFAULT
CONFIG_EXAMPLES_MYFIRSTAPP_STACKSIZE ?= 2048

APPNAME = myfirstapp
PRIORITY = $(CONFIG_EXAMPLES_MYFIRSTAPP_PRIORITY)
STACKSIZE = $(CONFIG_EXAMPLES_MYFIRSTAPP_STACKSIZE)

# My first app Example

ASRCS =
CSRCS =
MAINSRC = myfirstapp_main.c

CONFIG_EXAMPLES_MYFIRSTAPP_PROGNAME ?= myfirstapp$(EXEEXT)
PROGNAME = $(CONFIG_EXAMPLES_MYFIRSTAPP_PROGNAME)

include $(APPDIR)/Application.mk
APPNAME

この変数に設定されている文字列がコマンド名になります

PRIORITY

コマンドタスクの優先度を設定します

STACKSIZE

コマンドタスクのスタックサイズを設定します

上記のAPPNAME、PRIORITYおよびSTACKSIZEのいずれかが設定されていない場合は、コマンドになりません。

Make.defs
ifeq ($(CONFIG_EXAMPLES_MYFIRSTAPP),y)
CONFIGURED_APPS += myfirstapp
endif
CONFIGURED_APPS

この変数に設定されているディレクトリがビルド対象になります

10.2.3.2. 別ディレクトリに追加する

ユーザーがリポジトリの外でアプリを管理したい場合は、別のディレクトリを作成し、それをビルド対象に追加することができます。 別ディレクトリをビルド対象に加えるには以下のようにします。

  1. 任意のディレクトリをsdkと同じディレクトリに作成

  2. examples ディレクトリから、LibTarget.mkMakefileMake.defs および Application.mk をコピー

  3. LibTarget.mk 内のアーカイブのパスを変更

  4. Application.mk 内のアーカイブのパスを変更

  5. Makefile 内の BIN 変数のファイル名を LibTarget.mk で変更したファイル名と同じファイル名に変更

  6. 上述のexamplesに追加すると同じ手順で、新規に作成したディレクトリ内に任意のアプリケーションを追加

  7. sdk ディレクトリで make

別ディレクトリ追加例

ディレクトリを myapps 、アプリケーションを myfirstapp とした場合の例

作成後のファイル構成
|-- sdk
|-- examples
|-- myapps
    |-- Application.mk
    |-- LibTarget.mk
    |-- Make.defs
    |-- Makefile
    `-- myfirstapp
        |-- Kconfig
        |-- Make.defs
        |-- Makefile
        `-- myfirstapp_main.c
myapps/LibTarget.mk
# ディレクトリをexamplesからmyappsに変更
# アーカイブ名をlibexamplesからlibmyappsに変更

$(SDKDIR)$(DELIM)..$(DELIM)myapps$(DELIM)libmyapps$(LIBEXT): context
	$(Q) $(MAKE) -C $(dir $@) TOPDIR="$(TOPDIR)" SDKDIR="$(SDKDIR)" $(notdir $@)

lib$(DELIM)libmyapps$(LIBEXT): $(SDKDIR)$(DELIM)..$(DELIM)myapps$(DELIM)libmyapps$(LIBEXT)
	$(Q) install $< $@

EXTLIBS += lib$(DELIM)libmyapps$(LIBEXT)
DELIM

パスデリミタ(Windowsの場合は \ 、Linuxの場合は /

LIBEXT

ライブラリファイル拡張子( .a

myapps/Makefile
MENUDESC = "My Apps"

BIN = libmyapps$(LIBEXT)  # libexamplesをlibmyappsに変更

include $(SDKDIR)/Makefile.ext
MENUDESC

コンフィギュレーションメニューに表示される文字列

myapps/Application.mk (一部)
ifeq ($(WINTOOL),y)
  BIN = "${shell cygpath -w $(APPDIR)$(DELIM)libmyapps$(LIBEXT)}" # libexamplesをlibmyappsに変更
  INSTALL_DIR = "${shell cygpath -w $(BIN_DIR)}"
else
  BIN = $(APPDIR)$(DELIM)libmyapps$(LIBEXT) # libexamplesをlibmyappsに変更
  INSTALL_DIR = $(BIN_DIR)
endif

ROOTDEPPATH = --dep-path .

VPATH =

all: .built
.PHONY: clean preconfig depend distclean
.PRECIOUS: $(APPDIR)/libmyapps$(LIBEXT)    # libexamplesをlibmyappsに変更
10.2.3.3. ツールを使用する

前述のexamplesに追加する手順及び別ディレクトリに追加する手順は、下記ヘルパーツールを使用して簡単に行うことができます。

アプリ追加ツール
tools/mkcmd.py -h
usage: mkcmd.py [-h] [-d BASEDIR] [-v] <app name> [desc]

Create a new application

positional arguments:
  <app name>            New application name
  desc                  Menu description

optional arguments:
  -h, --help            show this help message and exit
  -d BASEDIR, --basedir BASEDIR
                        Base directory to create new application
  -v, --verbose         Verbose messages

This tool create a new application at examples directory.
You can use '-d' option to change application directory, it is a same level
of sdk and examples.
ディレクトリ追加ツール
tools/mkapppsdir.py -h
usage: mkappsdir.py [-h] [-s] [-v] <dir name> [desc]

Create a new application directory at the outside of sdk repository

This tool must be run on sdk directory.

positional arguments:
  <dir name>     New application directory name
  desc           Menu description

optional arguments:
  -h, --help     show this help message and exit
  -s, --spresense_home  using spresense home
  -v, --verbose  verbose messages
上記ツールは、 sdk ディレクトリで実行してください。
使用例
examplesにアプリ myfirstapp を追加する
cd spresense/sdk
tools/mkcmd.py myfirstapp "My first app example"
新規ディレクトリ myapps を作成し、そこにアプリ myfirstapp を追加する
cd spresense/sdk
tools/mkappsdir.py myapps "My Apps"
tools/mkcmd.py -d myapps myfirstapp "My first app example"