リネオブログ

Zephyrブログ 第四回 「Zephyr アプリに挑戦(前編)」

2026 年 08 月 07 日   ソリューション統括部

はじめに

Zephyr OS とは ? について解説するブログの第四回目です。

今回は Zephyr アプリに挑戦します。
何かボタンを押すごとに LED を点灯・消灯するアプリを書いてみようと思います。

「Zephyr アプリに挑戦」は全三回を予定しています。中編は 9 月中旬頃の公開予定です。
これまでの Zephyr ブログを読んでいない方は 「Zephyrブログ 第一回 はじめての Zephyr(前編)」から読んでいただけると、より理解が深まります。

目次

アプリディレクトリ

Zephyr のアプリを作るためにはアプリディレクトリが必要です。

アプリディレクトリとは次のようなファイルから構成されたディレクトリのことです
https://docs.zephyrproject.org/latest/develop/application/index.html#overview)。

  • CMakeLists.txt :
    このディレクトリをアプリディレクトリと定義する。
  • app.overlay :
    デバイスツリーオーバーレイ。あれば、アプリに固有*のデバイスツリーノードを定義する。
  • prj.conf :
    Kconfig フラグメント。アプリに固有*の Kconfig コンフィグ設定を定義する。
  • src ディレクトリ :
    ソースディレクトリ。src/main.c などソースファイルを配置する。ディレクトリ名は任意だが、通常 src とする。
  • boards ディレクトリ :
    あれば、ボードに固有のデバイスツリーオーバーレイファイルや Kconfig フラグメントファイルを配置する。
  • socs ディレクトリ :
    あれば、SoC に固有のデバイスツリーオーバーレイファイルや Kconfig フラグメントファイルを配置する。

*ここでアプリに固有とは、「ターゲットボードなどによらず、そのアプリにとって必要なもの」という意味です。

この中で一番大事なのは CMakeLists.txt です。それから prj.conf も重要です。prj.conf はなくても構築する方法がありますが、通常は用意しておくファイルです。そのほかは必要に応じて、という理解でよさそうです。
また、ここに挙げたものがアプリディレクトリの構成要素のすべてではなく、ほかにもまだあるようです。

上に挙げた項目のうち、CMakeLists.txt と src ディレクトリ以外は、アプリコンフィグディレクトリに配置することになっています。ただし、アプリコンフィグディレクトリはとくに指定しない限り、アプリディレクトリと同一となります。というのもアプリコンフィグディレクトリは、変数 APPLICATION_CONFIG_DIR で指定するのですが、この変数の値は、cmake コマンド行に引数 -DAPPLICATION_CONFIG_DIR=<path> として渡すか、CMakeLists.txt で定義しない限り、アプリディレクトリのパスが自動的に設定されるからです(https://docs.zephyrproject.org/latest/develop/application/index.html#application-configuration-directory)。

アプリディレクトリの配置

アプリディレクトリ自身をどこに配置するかについて、3 つのオプションがあります(https://docs.zephyrproject.org/latest/develop/application/index.html#application-types 参照)。

  • リポジトリ型 :
    zephyr ソースツリー内にアプリディレクトリを配置するタイプです。
    LCD に表示してみる」の回で構築した LVGL デモアプリは zephyr ソースツリー内にあるので、このタイプに該当します。
    通称 Zephyr リポジトリアプリ といいます。
  • 作業空間型 :
    west 作業空間の配下で zephyr ソースツリーの外に配置するタイプです。
    通称 Zephyr 作業空間アプリいいます。
  • 独立型 :
    上の二つのいずれでもない場所に配置します。 通称 Zephyr 独立型アプリ といいます。

本記事では、作業空間型でアプリディレクトリを作成することにします。

アプリの雛型 example-application

Zephyr 構築システムには、アプリを書き起こすにあたって参考となる雛型が用意されています。

example-applicationといいます(以下、見本アプリと呼ぶ)。一から書き起こすことも、もちろん可能でしょうが、通常はこれをベースにするのだと思われます。本記事でもこれを使用してみることにします。

見本アプリは次のようなことをするアプリです。

  • LED を一定周期で点滅させ、センサ(ボタン)からの入力があるたびに点滅周期を短くしていく。

より正確な処理は以下です。

  1. LED が消灯状態で開始する。
  2. センサから入力があると、周期 2000 msec で LED が点滅を始める。
  3. 以後、センサから入力があるたびに周期が 200 msec ずつ短くなる。
  4. 周期が 0 になると消灯する。
  5. 2. へ戻る。

当初作成することを想定していたアプリが見本アプリに動作が似ているため、計画を変更してこの見本アプリを MIMXRT1170-EVKB ボードで走らせることにしました。

example-application リポジトリのトップディレクトリには次のようなディレクトリがあって、app が見本アプリのアプリディレクトリです。以下に example-application 配下の一部を挙げました。

example-application 配下の一部

drivers ディレクトリには見本アプリが使用するドライバが定義されています。dts ディレクトリにはそのドライバのためのデバイスツリーバインディング(デバイスツリーノードの型を定義するファイルのこと)があります。boards ディレクトリと zephyr ディレクトリについてはこのあと述べます。

west.yml は west のマニフェストファイルです。west 作業空間は複数の git リポジトリから成りますが、それを管理するのがマニフェストファイルです。west 作業空間はいずれかのリポジトリからマニフェストファイルを選択します。

これを提供したリポジトリはマニフェストリポジトリと呼ばれます。west 作業空間には必ず唯一つのマニフェストリポジトリが存在します。どのリポジトリも有効な内容のマニフェストファイルがあればマニフェストリポジトリになれます
https://docs.zephyrproject.org/latest/develop/west/basics.html#workspace-concepts の "manifest repository" の項参照)。

はじめての Zephyr」と「LCD に表示してみる」の回で使用していた west 作業空間 ~/zephyrproject のマニフェストリポジトリは zephyr リポジトリでした。しかし example-application のように、マニフェストファイルがあれば、それ以外のリポジトリがマニフェストリポジトリになることが可能です。

これによって、west 作業空間のリポジトリの構成を独自に制御することができるわけです。Zephyr は、どれがマニフェストリポジトリとなるかによって、3 タイプの west 作業空間を定義しています
https://docs.zephyrproject.org/latest/develop/west/workspaces.html#topologies-supported 参照)。

  • T1 : star トポロジ: zephyr がマニフェストリポジトリ
  • T2 : star トポロジ: アプリがマニフェストリポジトリ
  • T3 : forest トポロジ: 独立(freestanding)マニフェストリポジトリ

T1: star トポロジは標準的なトポロジです。~/zephyrproject はこれでした。
T2: star トポロジはアプリがマニフェストリポジトリになるトポロジです。example-application リポジトリをマニフェストリポジトリにすれば、このタイプになります。
T3: forest トポロジは、複数のアプリを一つの west 作業空間に配置するようなトポロジです。「独立」と称するのは、マニフェストファイル専用のリポジトリをとくに用意することから来ているようです。

本記事では T1: star トポロジのまま見本アプリを構築することを目指すことにします。
なお、example-application リポジトリをマニフェストリポジトリとする west 作業空間を作成するには、次のようにします。

$ cd ~
$ . ~/zephyrproject/.venv/bin/activate
$ west init -m https://github.com/zephyrproject-rtos/example-application --mr main my-workspace
$ cd my-workspace
$ west update

見本アプリ構築

T1: star トポロジを使用し、作業空間型でアプリディレクトリを作成することにしましたので、まずは example-application リポジトリをこれまで使用してきた west 作業空間 ~/zephyrproject 配下にクローンします。
ディレクトリ名は
https://docs.zephyrproject.org/latest/develop/application/index.html#zephyr-workspace-application に倣い、applications としました。

$ cd ~/zephyrproject
$ git clone https://github.com/zephyrproject-rtos/example-application applications

何はともあれ、見本アプリをコンパイルしてみることにします。
applications/app ディレクトリが見本アプリのアプリディレクトリです。構築ディレクトリは applications ディレクトリ配下としましょう。

$ cd ~/zephyrproject/applications
$ west build -b mimxrt1170_evk/mimxrt1176/cm7 app

エラーが発生しました。

/home/hoge/zephyrproject/applications/app/prj.conf:7: warning: attempt to assign the value 'y' to the undefined symbol BLINK

error: Aborting due to Kconfig warnings

CMake Error at /home/hoge/zephyrproject/zephyr/cmake/modules/kconfig.cmake:409 (message):
  command failed with return code: 1

Kconfig の警告が原因でアボートしたといっているので、その前に出ている "the undefined symbol BLINK" がエラーの原因のようです。

見ると applications/app/prj.conf ファイルが CONFIG_BLINK=y としています。これは、探してみると、ファイル applications/drivers/blink/Kconfig で定義されていました。つまり、見本アプリは applications/drivers/blink ドライバを使用しているが、構築システムはそれを見付けることができない、という意味になるようです。

では、新たに追加されているドライバを構築システムに教えるにはどうしたらいいのでしょうか?

見本アプリ構築のまとめ

  1. 今まで使用してきた west 作業空間 ~/zephyrproject を使用する。その配下に見本アプリをクローンする。ここで、ディレクトリ名は applications とした。
  2. $ cd ~/zephyrproject
    $ git clone https://github.com/zephyrproject-rtos/example-application applications
    
  3. python 仮想環境を活性化した上で、下記コマンドを実行し、見本アプリを構築する。
  4. $ cd ~/zephyrproject/applications
    $ west build -b mimxrt1170_evk/mimxrt1176/cm7 app
    
Yocto Project 公式実践講座 9 月 ~ 11 月 開催分 受講お申込み受付中!
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+ West 2026 出展レポート
EdgeTech+ West 2026 出展レポート

2026 年 08 月 05 日 イベントレポート

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

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

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

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

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

2025 年 04 月 01 日 リクルート

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

2023 年 05 月 30 日 リクルート

信州リネオ便り
松本市のアジサイ寺散策(法船寺・弘長寺)
松本市のアジサイ寺散策(法船寺・弘長寺)

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

新たな信州土産を入手しました
新たな信州土産を入手しました

2026 年 05 月 25 日 信州リネオ便り

旧制松本高等学校を歩く
旧制松本高等学校を歩く

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

ソリューション統括部
Zephyrブログ 第四回 「Zephyr アプリに挑戦(前編)」
Zephyrブログ 第四回 「Zephyr アプリに挑戦(前編)」

2026 年 08 月 07 日 ソリューション統括部

Zephyrブログ 第三回 「LCD に表示してみる」
Zephyrブログ 第三回 「LCD に表示してみる」

2026 年 05 月 26 日 ソリューション統括部

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

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

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

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

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

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

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

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