みつきんのメモ

組み込みエンジニアです。Interface誌で「My オリジナルLinuxの作り方」連載中

Yocto Zephyrに独自のアプリケーションを追加してみる

はじめに

Yocto ProjectでビルドするZephyrに独自のアプリケーションを追加してみる。

環境構築

この環境をベースに作業する。

環境変数設定

bitbake関連のツールを使用するために環境変数の読み込みは行う。

$ source poky/oe-init-build-env build

レイヤの作成

ビルド対象への追加も行う。

$ bitbake-layers create-layer meta-zephyr-app
$ rm -rf ./meta-zephyr-app/recipes-example/example
$ mv meta-zephyr-app ../poky
$ bitbake-layers add-layer ../poky/meta-zephyr-app

自動生成されるexampleのレシピはディレクトリごと削除する。

ソースコードの作成

下記のようなディレクトリツリーを作成する。

my-app
├── CMakeLists.txt
├── prj.conf
└── src
    └── main.c

CMakeLists.txt

Zephyrのhello_worldを参考に作成。ライセンスもApache-2.0とした。

# SPDX-License-Identifier: Apache-2.0

cmake_minimum_required(VERSION 3.13.1)

find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(my-app)

target_sources(app PRIVATE src/main.c)

prj.conf

下記の一行だけ。

# nothing here

echoとかで適当に作成してよい。

$ echo '# nothing here' > prj.conf

src/main.c

プログラム本体。

これもhello_world.cを参考に作成(というか丸パクリ)した。

/*
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr.h>
#include <sys/printk.h>

void main(void)
{
    printk("Hello My Application World! %s\n", CONFIG_BOARD);
}

レシピの作成

既存のOSSなどWeb上にあるリポジトリソースコードアーカイブからレシピを作成する場合はrecipetoolが便利だが、 ローカルのソースツリーからレシピを作る機能はないため、手動で作成する必要がある。

my-app_0.1.bb

レシピはmeta-zephyr-app/recipes-example/my-appに配置されるようにする。

buildディレクトリで作業する場合下記のようにディレクトリを作成する。

$ mkdir -p ../poky/meta-zephyr-app/recipes/example/my-app

そして、その配下にmy-app_0.1.bbを下記の内容で作成する。

include recipes-kernel/zephyr-kernel/zephyr-sample.inc

SRC_URI += "file://my-app"

ZEPHYR_SRC_DIR = "${S}/../my-app"

自分のレイヤ以外のレイヤに存在するincファイルをincludeする場合、レイヤ直下からの相対パスを記述する必要がある。

下記のようにファイル名だけ記述した場合、includeされずにその行は無視されるので注意が必要となる。

include zephyr-sample.inc

ソースコードの配置

先ほど作成したmy-app以下のソースツリーをmeta-zephyr-app/recipes-example/my-app/filesに配置する。

my-appディレクトリがbuildディレクトリに作成していた場合下記のようにして移動する。

$ mkdir -p ../poky/meta-zephyr-app/recipes/example/my-app/files
$ mv ./my-app ../poky/meta-zephyr-app/recipes/example/my-app/files

最終的にmeta-zephyr-appは下記のようなツリーになる。

meta-zephyr-app/
├── COPYING.MIT
├── README
├── conf
│   └── layer.conf
└── recipes-example
    └── my-app
        ├── files
        │   └── my-app
        │       ├── CMakeLists.txt
        │       ├── prj.conf
        │       └── src
        │           └── main.c
        └── my-app_0.1.bb

ビルド

bitbakeを実行する。

$ bitbake my-app

recipes-kernel/zephyr-kernel/zephyr-sample.incが正しくインクルードできていれば、pokyではなくzephyrがビルドされる。

qemuで実行

$ runqemu qemux86 qemuparams="-serial mon:stdio"
(... snip ...)

*** Booting Zephyr OS build zephyr-v2.5.0  ***
Hello My Application World! qemu_cortex_m0

まとめ

意外と少ない手順でZephyrのアプリケーションを追加することができた。

YoctoでLinux以外のOSだったり、Cortext-M向けのバイナリをビルドするということにピンと来ていなかったが、意外と便利に使えるのかもしれない。