リネオブログ

Zephyrブログ 第二回 はじめての Zephyr(後編)

2026 年 04 月 14 日   ソリューション統括部

はじめに

本記事は、「Zephyrブログ 第一回 はじめての Zephyr(前編)」の後編となります。
後編では、Zephyr 環境の準備からはじまり、Zephyr 用アプリケーションの構築・実行を行った際の手順を紹介いたします。
前編の閲覧がまだの方はぜひ前編からご覧ください。

目次

MCUXpresso IDE のインストール

Zephyr は、MIMXRT1170-EVKB ボードの QSPI Flash に構築したイメージを書き込むとき、MCUXpresso IDE の中の LinkServer コマンドを使用します。
(/usr/local/LinkServer/LinkServer)
そこで、まずは MCUXpresso IDE をインストールします。

1. MCUXpresso IDE をダウンロードする。

https://mcuxpresso.nxp.com/ サイトの上の段にアイコンが並んでいます。
その中の "IDE" と書かれたアイコンをクリックすると MCUXpresso IDE のページに移動します。
そのページ内に DOWNLOADS のボタンがあるのでクリックしてください。

その後、「DOWNLOAD ボタン」 → 最新バージョンの「MCUXpresso IDE」を選択 → 「I Agree」を行っていくとインストーラの選択ページに行き着くので、mcuxpressoide-<version>.x86_64.deb.bin を選択してダウンロードしてください。
2026-02-17 時点では mcuxpressoide-25.6.136.x86_64.deb.bin となっていました。

MCUXpresso IDEのダウンロード画面

2. 開発ホストに libpython3.8, libncurses6, libncursesw6 パッケージをインストールする。

これらは MCUXpresso IDE が必要とするパッケージです。
libncurses6, libncursesw6 は通常の手順でインストールできますが、
libpython3.8 が標準では Ubuntu 24.04 にありません。
libpython3.8 のインストールは、次の手順で行ってください。

$ sudo apt install -y software-properties-common
$ sudo add-apt-repository -y ppa:deadsnakes/ppa
$ sudo apt update
$ sudo apt install -y libpython3.8
3. MCUXpresso IDE をインストールする。
$ chmod +x mcuxpressoide-25.6.136.x86_64.deb.bin
$ sudo ./mcuxpressoide-25.6.136.x86_64.deb.bin -- --acceptLicense

"-- --acceptLicense" オプションは、ライセンスの確認画面を表示せずにライセンスに同意するオプションです。内容を確認したいときは外してください。

4. /usr/local/LinkServer にパスを通す。

本節の最初に述べたように、
Zephyr は /usr/local/LinkServer ディレクトリ配下にある LinkServer を使用します。 パスを通しておく必要があります。
.bashrc:

export PATH=/usr/local/LinkServer:${PATH}

Zephyr 開発環境の準備

Zephyr の west 作業空間(west workspace)を作成します。本節は下記ページをベースにしています。

https://docs.zephyrproject.org/latest/develop/getting_started/index.html#get-zephyr-and-install-python-dependencies

なお、一度作成した west 作業空間は、以後 3. を実行するだけで使用できます。

1. 作業空間のためのディレクトリを作る。

ここでは上記ページに倣って、~/zephyrproject ディレクトリを作業空間とします。

$ cd ~
$ mkdir zephyrproject
2. python 仮想環境を作成する。
$ python3 -m venv ~/zephyrproject/.venv
3. 仮想環境を活性化する。
$ . ~/zephyrproject/.venv/bin/activate

deactivate を実行すれば、失活することができます。

4. west をインストールする。
$ pip install west
5. Zephyr の west 作業空間を作成する。
$ west init ~/zephyrproject

.west ディレクトリと zephyr ディレクトリの二つが作成されます。

zephyr 配下に Zephyr のローカルリポジトリが作成されます。

6. 外部コンポーネントのリポジトリを取得する。
$ cd ~/zephyrproject
$ west update

参考までに west update にかかった時間は 6,7 分ほどでした。

7. Zephyr CMake パッケージをエクスポートする。
$ west zephyr-export

これは CMake が Zephyr CMake パッケージを見つけられるようにする操作です。

Zephyr アプリは通常 CMakeLists.txt の先頭に find_package(Zephyr) を書いて Zephyr CMake パッケージの使用を宣言します。
これはつまり、CMake は Zephyr CMake パッケージがどこにあるのかに関する知識が必要ということになります。

この情報の登録を CMake はパッケージの「エクスポート」と呼んでいます。
west zephyr-export は Zephyr CMake パッケージをエクスポートします。
これはつまり、~/.cmake/packages/Zephyr ディレクトリを作って、その下に参照先を作成することを意味します。

8. Python 関連の依存パッケージをインストールする。
$ west packages pip -install
9. Zephyr SDK をインストールする。
$ cd ~/zephyrproject/zephyr
$ west sdk install

ここで ~/zephyr-sdk-0.17.4 ディレクトリが作成され、そこにサポートされている全アーキテクチャのSDK がインストールされます。このように、デフォルトではホームディレクトリの配下に作成されますが、--install-dir や --install-base を指定して変更することもできます。

クロス gcc のコマンド名は、たとえば arm-zephyr-eabi-gcc といった名前となっています。
オプションで指定すれば、必要なアーキテクチャの分だけインストールすることも可能なようです。

シリアルコンソールの設定

  1. ボードの USB-to-UART ブリッジ機能が有効かどうかを確認します。
    JP2 がオープンのとき有効です。デフォルトではオープンになっています。
  2. MIMXRT1170-EVKB ボードに付属の USB Type-A - Micro USB Type-B ケーブルを使って、ターゲットボードと開発ホストとのあいだをつなぎます。
    ボードには micro USB Type-B は一つしかないので迷わないと思いますが、J86 とラベルされているコネクタです。
  3. 開発ホストで使用するシリアル端末(minicom など)を次のように設定します。   
        
    • Speed: 115200
    •   
    • Data: 8 bits
    •   
    • Parity: None
    •   
    • Stop bits: 1
    •   
    • Flow control: None
    •    

    ボードの写真(出典:Courtesy of NXP) :

    i.MX RT1170 Evaluation Kit

アプリの構築

ここから、いよいよ「アプリ」の構築とターゲットへの配備を行っていきます。 Zephyr では、Zephyr RTOS 上で走るプログラムを「アプリケーション」と呼ぶようです。

→ たとえば

https://docs.zephyrproject.org/latest/samples/application_development/application_development.html#application-development

本記事では「アプリ」と呼ぶことにしました。

アプリの構築には west build コマンドを使用します。 このコマンドにはさまざまなオプションがあるようですが、基本的なコマンド行はつぎのようになります。

west build -b ボード名 ソースディレクトリ

ボード名 は "mimxrt1170_evk/mimxrt1176/cm7" になります。旧ボードの MIMXRT1170-EVK と新ボードの MIMXRT1170-EVKB とがありますが、そして今回使用しているのは EVKB のほうですが、この ボード名 で EVKB のイメージが構築されます。EVK のほうを構築したいときは "mimxrt1170_evk@A/mimxrt1176/cm7" とすればよいようです。

一方、EVKB を明示したときは "mimxrt1170_evk@B/mimxrt1176/cm7" とします。 まとめると

  • mimxrt1170_evk/mimxrt1176/cm7: EVKB ボード用
  • mimxrt1170_evk@A/mimxrt1176/cm7: EVK ボード用
  • mimxrt1170_evk@B/mimxrt1176/cm7: EVKB ボード用

こうしたボードの変異の存在は zephyr/boards/nxp/mimxrt1170_evk/board.yml が与えるようです。
このファイルには、A と B の二つのリビジョンがあることと、デフォルトが B であることが示されています。

Zephyrブログ

ボードの諸元は、第一義的にはデバイスツリーソース dts ファイルが与えるので(と思われるので)、west build に与えるボード名はそれを指定しているのだと思います。

Zephyr では dts は、構築時に参照しているそうですが(Linux は基本的にブート時のみ)、使用すべきドライバの選択にまで影響を及ぼすことはないようです(まだよく読んでいませんが、https://docs.zephyrproject.org/latest/build/dts/dt-vs-kconfig.html#dt-vs-kconfig 参照)。

なお、dtb もあって実行時にも参照している可能性もありますが、わかっていません。

ソースディレクトリ はアプリのソースがあるディレクトリを指定します。
ここでは samples/hello_world を指定することにします。

west build コマンドには、そのほか重要なオプションに -p があります。
p は pristine(初期状態)の頭文字です。

west build コマンドはデフォルトでカレントに build ディレクトリを作成してその下にオブジェクトファイルを作りますが、-p はその扱いに関するオプションです。
-p オプションは引数に次のいずれかを取り得えます。

  • auto: 初期状態の構築が必要かどうか、発見的方法を使って推測する。
  • always: デフォルト。常に初期状態に戻す
  • never: 差分構築になる。つまり必要なものだけコンパイルする。

-p だけを指定して引数を渡さないとき -p always の意味になります。
west コマンドは、「コンフィグ」を使ってさまざまなデフォルト動作を変更することができるようなのですが、-p オプションを指定しなかった場合も「コンフィグ値」が使用されます。

-p オプションに関する「コンフィグ」を行っていない場合で、かつ -p を指定していないときは、-p never の意味になります。
-p always では build ディレクトリを一旦削除するようなので、何かと安全でありたいときは -p always とするのがよさそうです。

また、次のようなシチュエーションでは -p always は実際に役に立ちます。
アプリを一度構築したあと、別のアプリを -p never の意味になるようなコマンド行で構築しようとすると、次のようなエラーになります。

$ west build -b mimxrt1170_evk/mimxrt1176/cm7 samples/subsys/shell/shell_module
ERROR: Build directory "/home/soka/zephyrproject/zephyr/build" is for application "/home/soka/zephyrproject/zephyr/samples/hello_world", but source directory "/home/soka/zephyrproject/zephyr/samples/subsys/shell/shell_module" was specified; please clean it, use --pristine, or use --build-dir to set another build directory
FATAL ERROR: refusing to proceed without --force due to above error

このようなとき、二つの構築イメージを保持しておく必要がないなら -p always の出番となります。ちなみに、この場合は -p auto でもうまくいきました。

つまるところ構築のコマンド行は、たとえば次のようになります。

$ cd ~/zephyrproject/zephyr
$ west build -p always -b mimxrt1170_evk/mimxrt1176/cm7 samples/hello_world

アプリの配備

構築したアプリの配備には west flash コマンドを使用します。MIMXRT1170-EVKB の場合、それは「シリアルダウンローダ・モードを使用して QSPI Flash」へ書き込むことを意味するようです。

以下、手順です。

  1. ボードと開発ホストマシンとを USB ケーブルで接続する。→ シリアルコンソールの設定

    開発ホストマシンには /dev/ttyACM0 が現れると思います。

  2. ボードの SW1 を 0001 に、SW2 を 0000000000 にセットし、ボードの電源を投入する。
    SW1 と SW2 の設定値は参考資料 1) 2.2 の表 6 にある SDP mode に従いました。
    SDP とは、参考資料 5) によると Serial Download Protocol の頭文字語で、ブートイメージをシリアル経由で RAM にダウンロードし、それを実行するブート形式とあります(§5.1.7.2)。
    残念ながら、確かな説明を公式文書から見つけることができなかったのですが、多分 QSPI Flash への書込みは、これを使って QSPI Flash に書き込むプログラムをプロセッサに送りこんで、行っているのだと思われます。
  3. west flash コマンドを使用して前節で構築したアプリイメージを QSPI Flash に書き込む。
    この時、/dev/ttyACM0 を minicom などで開いていると書込みに失敗するので、気を付けてください。

    (.venv) user:~/zephyrproject/zephyr$ west flash
    -- west flash: rebuilding
    ninja: no work to do.
    -- west flash: using runner linkserver
    RUNNER - gdb_port = 3333, semih port = 8888
    -- runners.linkserver: LinkServer: /usr/local/LinkServer/LinkServer, version v25.6.131
    INFO: Exact match for MIMXRT1176xxxxx:MIMXRT1170-EVKB found
    INFO: Selected device MIMXRT1176xxxxx:MIMXRT1170-EVKB
    INFO: Getting available probes
    INFO: Selecting probe by index
    INFO: Selected probe #1 0TS4YIN1R12CS (MCU-LINK on-board (r0E2) CMSIS-DAP V2.250)
    INFO: MCU-Link firmware update `check`: not supported on probe ([0TS4YIN1R12CS] [MCU-LINK on-board (r0E2) CMSIS-DAP V2.250]). Only probes running firmware V3.122 or later can be updated automatically
    

アプリの実行

  1. ボードの電源を切り、SW1 を 0010 に、SW2-3, SW2-6, SW2-7 を 000 にする。
    SW1-3=1, SW1-4=0 は、BOOT_MODE が「内部ブート」モードとなります。
    SW2-3=0, SW2-6=0, SW2-7=0 は、ブートデバイスとして QSPI Flash を使用する設定です。
  2. minicom などのシリアル端末を /dev/ttyACM0 に対して開き、ボードの電源を投入する。
    次のようなメッセージが端末に現れるはずです。

    *** Booting Zephyr OS build v4.3.0-6216-gac63d0e0a8de ***
    Hello World! mimxrt1170_evk@B/mimxrt1176/cm7
    

    Zephyrブログ アプリの実行

ELF セグメントと i.MX RT1170 メモリ領域

これまで明示して言及はしてきませんでしたが、MIMXRT1170-EVKB ボード用のアプリの構築では、標準では CONFIG_XIP が有効化されます。
これはコンパイルされた機械語命令列が「その場で実行」されることを前提とするコードになっていることを意味します。

MIMXRT1170-EVKB ボードには W25Q512NWEQ という 512 Mb の NOR Flash が QSPI 接続されて搭載されています。
SPI はシリアルバスで、それに接続される NOR Flash もポートアクセスですが、i.MX RT1170 プロセッサに搭載されている FlexSPI コントローラはそれをアドレッシング可能にしています。

この FlexSPI のようなデバイスがあることにとても驚いたのですが、Gemini によると、「近年の高性能マイコンにおいて非常に一般的」なのだそうです。

構築されたイメージファイルは zephyrproject/zephyr/build/zephyr 配下に置かれますが、そこにある zephyr.map を見てみると、.text セグメントは、参考資料 2) によると"FlexSPI1/FlexSPI1 cipher text" 領域 [0x3000_0000, 0x4000_0000] にあたる 0x300023b8 に配置されています。
また、.bss セグメントは、SEMC0(SDRAM が接続されていると思われるメモリコントローラ)領域 [0x8000_0000, 0x9000_0000] にあたる 0x80000088 になっています。

Zephyrブログ2

west コマンドのコンフィグ機能

本節は https://docs.zephyrproject.org/latest/develop/west/config.html#configuration をもとにしています。

west はコンフィグファイルを使用して「設定」を保存しておくことができます。 コンフィグファイルは三種類あります。この順で優先度が高くなります。

  • システム: /etc/westconfig 全ユーザに作用するコンフィグファイル。
  • グローバル: ~/.westconfig 当該ユーザに作用するコンフィグファイル。
  • ローカル: .west/config 現行 west 作業空間に作用するコンフィグファイル。

ちなみに、Zephyr の west 作業空間を最初に作ったときのローカルコンフィグファイルの内容は次のようになっています。

[manifest]
path = zephyr
file = west.yml

west コンフィグ値は west config コマンドを使って見たり変更したりできます。
上で述べた三つのレベルのうち、どのレベルのコンフィグ値を参照するかはオプション --system, --global, --local で指定します。いずれも指定しなければ --local の意味になります。

west ビルトインコマンドでサポートされているコンフィグは下記にあります。

https://docs.zephyrproject.org/latest/develop/west/config.html#built-in-configuration-options

Zephyr が追加している west 拡張コマンドのうち下記のものには、それぞれに追加のコンフィグがあります。

west build-p オプションに対応するコンフィグは build.pristine です。
次のようにすると -p オプションが指定されないとき -p always の意味になります。

west config build.pristine always

参考資料

  1. MIMXRT1170EVKBHUG.pdf :: MIMXRT1170-EVKB Board Hardware User Guide
  2. IMXRT1170RM.pdf :: i.MX RT1170 Processor Reference Manual
  3. Zephyr::MIMXRT1170-EVK
  4. Zephyr の始め方
  5. MCUXSPTUG_25.12.pdf :: Secure Provisioning Tool User Guide
    1. ※ 資料 1、2 および 5 については NXP サイトへのログインが必要となります。

Yocto Project 公式実践講座 6 月 ~ 8 月 開催分 受講お申込み受付中!
Vigiles サポート
Yocto Project よもやま話
Yocto よもやま話 第 19 回 「Yocto Project 5.3 Whinlatter」
Yocto よもやま話 第 19 回 「Yocto Project 5.3 Whinlatter」

2026 年 02 月 09 日 Yocto Project よもやま話

Yocto よもやま話 第 18 回 「Yocto Project 5.2 Walnascar」
Yocto よもやま話 第 18 回 「Yocto Project 5.2 Walnascar」

2026 年 02 月 09 日 Yocto Project よもやま話

Yocto よもやま話 第 17 回 「Yocto Project 5.1 Styhead」
Yocto よもやま話 第 17 回 「Yocto Project 5.1 Styhead」

2026 年 02 月 09 日 Yocto Project よもやま話

Linux 技術ネタ
RISC-Vについて学ぶ-後編
RISC-Vについて学ぶ-後編

2024 年 01 月 10 日 Linux 技術ネタ

RISC-Vについて学ぶ-前編
RISC-Vについて学ぶ-前編

2023 年 12 月 12 日 Linux 技術ネタ

イベントレポート
EdgeTech+ 2025 出展レポート
EdgeTech+ 2025 出展レポート

2025 年 12 月 01 日 イベントレポート

EdgeTech+ West 2025 出展レポート
EdgeTech+ West 2025 出展レポート

2025 年 08 月 08 日 イベントレポート

EdgeTech+ 2024 出展レポート
EdgeTech+ 2024 出展レポート

2024 年 12 月 06 日 イベントレポート

リクルート
新卒採用、絶賛募集中!
新卒採用、絶賛募集中!

2025 年 04 月 01 日 リクルート

新卒採用、絶賛募集中!
新卒採用、絶賛募集中!

2023 年 05 月 30 日 リクルート

信州リネオ便り
旧制松本高等学校を歩く
旧制松本高等学校を歩く

2026 年 04 月 09 日 信州リネオ便り

奈良井宿アイスキャンドル祭りに行ってきました
奈良井宿アイスキャンドル祭りに行ってきました

2026 年 02 月 09 日 信州リネオ便り

2026年 明けましておめでとうございます
2026年 明けましておめでとうございます

2026 年 01 月 06 日 信州リネオ便り

ソリューション統括部
Zephyrブログ 第二回 はじめての Zephyr(後編)
Zephyrブログ 第二回 はじめての Zephyr(後編)

2026 年 04 月 14 日 ソリューション統括部

Zephyrブログ 第一回 はじめての Zephyr(前編)
Zephyrブログ 第一回 はじめての Zephyr(前編)

2026 年 03 月 18 日 ソリューション統括部

シリコンバレー探検記 2019 ~番外編~
シリコンバレー探検記 2019 ~番外編~

2019 年 12 月 10 日 ソリューション統括部

マーケティング統括部
大成功決起大会!!(ET2019)
大成功決起大会!!(ET2019)

2019 年 12 月 13 日 マーケティング統括部

ESEC 2019 決起大会
ESEC 2019 決起大会

2019 年 04 月 25 日 マーケティング統括部

シリコンバレー探検記 その 2
シリコンバレー探検記 その 2

2018 年 12 月 18 日 マーケティング統括部