みかんのゆるふわ技術ブログ

Raspberry PiやIoT関係のことを書き残していきます

Zephyr OSでマイコンファームウェアを作ってみよう~環境構築&サンプルビルド

2022/6/12 Zephyr OS v3.1ベースの説明にアップデートしました

前の記事で、IoTに向いたオープンソース組み込みOSを6種類も紹介しました。

www.mikan-tech.net

その中でも個人的にいちばんオススメのZephyr OSを使ってみましょう✊

いろんなマイコンや開発ボードに対応しているし、いろんなメーカーのセンサードライバや、IoT向け無線ネットワーク、超軽量ファイルシステムなど、便利な機能が盛りだくさんで便利です😊

ただ、開発環境がやや独特なところがあり、最初のハードルが高いかもしれません。でも、このブログを読めばできるようになるかも!?

まずは、開発環境のインストールからやってみましょう!

準備するもの

開発用のマシンを用意します。WindowsやMacでももちろんOKですが、ここではUbuntu 22.04 LTSマシンで説明します。

あとは何かマイコン開発ボードがあるといいでしょう。例えばSeeeduino XIAOあたりが安くて便利です。1個600円くらいで買えます。

USB-Cポート付きで、ここからファームウェアの書き込みもできるので、これ1つあればOKです😆

インストール

インストールは以下の公式の手順に従えば簡単にできます。

docs.zephyrproject.org

公式ページにはUbuntu以外のインストール方法も載っています。

必要なパッケージのインストール

まずは必要なパッケージをインストールしましょう。

$ sudo apt install --no-install-recommends git cmake ninja-build gperf \
      ccache dfu-util device-tree-compiler wget \
      python3-dev python3-pip python3-setuptools python3-tk python3-wheel xz-utils file \
      make gcc gcc-multilib g++-multilib libsdl2-dev

これで準備はOKです。Ubuntu 22.04ならこれで良いのですが、古いバージョンのUbuntuの場合、CMakeが古くてビルドできない場合があります。

$ cmake --version

で、バージョン情報を確認して、3.20.0以上ならOKです。

古いものが入っていた場合、CMakeの開発を主導しているKitware社のPPAから最新版を入れてください。

$ sudo apt remove cmake     # いったん古いcmakeを削除
$ wget https://apt.kitware.com/kitware-archive.sh
$ sudo bash kitware-archive.sh
$ sudo apt update
$ sudo apt install cmake

これで最新版のCMakeがインストールできます。

Zephyr OSのソースツリーインストール

続いて、Zephyr OSのソースツリーをインストールします。Zephyr OS開発では本体のソースツリーの他に、他のいろんなソースツリーを外部モジュールとして利用します。

Zephyr OS独自のコマンドラインツールwestを使うと、他のソースツリーも全自動で一気にダウンロードしてくれます。

westというツールの名前は、Zephyr OSの名前の由来となったギリシャ神話の神様ゼフィロス(Zephyros)が西(west)の風を司る神様であることに由来するそうです。

まずはwestをインストールしましょう。westはPythonでできたツールで、pipでインストールできます。

$ pip3 install --user -U west
$ echo 'export PATH=~/.local/bin:"$PATH"' >> ~/.bashrc
$ source ~/.bashrc

ユーザーディレクトリにインストールされるので、パスを通して使えるようにしています。

続いてwestでZephpyr OSと外部モジュールのソースツリーをインストールします。

公式マニュアルに従い、必要なソースツリー一式を~/zephyrprojectにインストールしてみましょう。 次のコマンドでインストールできます。

$ west init --mr v3.1.0 ~/zephyrproject
$ cd ~/zephyrproject
$ west update

最初のwest init~/zephyrprojectにGitHubからZephyr OS v3.1.0のリポジトリをダウンロードします。 続いてwest updateで残りの外部モジュールをダウンロードします。

どんな外部モジュールをダウンロードするかはZephyr OSのリポジトリトップのwest.ymlファイルに記載されています。

なお、最初のwest init--mr v3.1.0を省略すると、最新の開発版がダウンロードできます。

CMakeパッケージのエクスポート

Zephyr OSのビルドではCMakeがNinjaファイルを作成してビルドを行います。

ところでZephyr OSでは、Zephyr OSとは別の場所にアプリケーションのソースコードを置いてビルドできます。 アプリケーションだけを独立したGitリポジトリで管理できるなど、便利な機能です。

そのような外部プロジェクトのビルドができるように、Zephyr OSのCMakeボイラープレートを~/.cmake/package/Zephyrにインストールします。 これも、次のようにするとwestが全自動でやってくれます。便利ですね☺️

$ west zephyr-export

こうしておくと、Zephyr OSと関係ないディレクトリにアプリのソースコードを置いても、CMakeLists.txtfind_package(Zephyr)と書けば Zephyr OSのソースツリー中のプロジェクトディレクトリと同じように開発ができます。

Python依存ライブラリのインストール

Zephyr OSのビルドシステムでは、Pythonスクリプトを多用しています。

ビルドシステムはなかなか複雑なことをしていて私も全貌はよくわかっていませんが…😅

このビルドシステムで使うPythonのライブラリをpipでインストールします。

pip3 install --user -r ~/zephyrproject/zephyr/scripts/requirements.txt

これでZephyr OSソースツリーの準備は完了です。

ツールチェーン(Zephyr OS SDK)のインストール

ARM Cortex-MやRISC-VなどZephyr OSが対応する全てのアーキテクチャ用のコンパイラやQEMUなど、Zephyr OSのビルドに必要なツールチェーン一式をインストールします。

これら一式がZephyr SDKとしてまとめられていて、インストーラで簡単にインストールできます。 詳しい内容はこちらの公式マニュアルにあります。

まずはインストーラをダウンロードします。 記事執筆時点(2022/6)では0.14.2が最新のようです。

$ cd ~
$ wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.14.2/zephyr-sdk-0.14.2_linux-x86_64.tar.gz

サイズが1.4GBもありました。大きなファイルですし、正しくダウンロードできたかチェックサムを確認しておきましょう。

wget -O - https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.14.2/sha256.sum | shasum --check --ignore-missing

エラーが出なければ、展開してインストールしましょう。

$ tar xvf zephyr-sdk-0.14.2_linux-x86_64.tar.gz
$ cd zephyr-sdk-0.14.2
Zephyr SDK 0.14.2 Setup

** NOTE **
You only need to run this script once after extracting the Zephyr SDK
distribution bundle archive.

Install host tools [y/n]? y
Register Zephyr SDK CMake package [y/n]? y

質問が2つ出てきますが、両方ともyにしておきましょう。 こうすると、自分のホームディレクトリ以下の~/zephyr-sdk-0.14.2にクロスコンパイラ等がインストールされます。 PATHも通してくれますので、これで設定も終わりです。

ボードへのファームウェア書き込み用設定

続いて、Ubuntuマシンからマイコンのファームウェアを書き込みやすくできるよう、udevの設定をしておきましょう。

$ sudo cp ~/zephyr-sdk-0.14.2/sysroots/x86_64-pokysdk-linux/usr/share/openocd/contrib/60-openocd.rules /etc/udev/rules.d
$ sudo udevadm control --reload

これにより、多くのターゲット基板にsudoなしで書き込めるようになります。

お疲れ様でした! ここまでで、~/zephyrprojectにZephyr OSおよび外部モジュールのソースツリー、 ~/zephyr-sdk-0.12.4にコンパイラツールチェーンがインストールできました。 これでファームウェアをビルドする準備が完了です!

サンプルプロジェクトのビルド

Zephyr OSにはいろんなサンプルプロジェクトが付属しています。 まずは一番単純なサンプルプロジェクト、LEDがチカチカ点滅するだけのプロジェクトをビルドしてみましょう。

~/zephyrproject/zephyr/samples/basic/blinkyにプロジェクトがあります。 移動して中身を見てみましょう。

$ cd ~/zephyrproject/zephyr/samples/basic/blinky
$ tree
.
├── CMakeLists.txt
├── prj.conf
├── README.rst
├── sample.yaml
└── src
    └── main.c

treeコマンドは今いるフォルダの中身をツリー形式で表示してくれるコマンドです。無ければsudo apt install treeでインストールできます。

いくつかのファイルがありますが、これがZephyr OSのプロジェクトの一番単純な構成です。 中身の解説はこちらの記事でどうぞ!

www.mikan-tech.net

今回はひとまずファームウェアをビルドしてみましょう。

プロジェクトフォルダの中にいる状態で、次のコマンドを実行します。

$ west build -b seeeduino_xiao

これでカレントフォルダのプロジェクトをビルドします。-b seeeduino_xiaoでターゲットボードを指定します。 インストールが正しくできていれば、エラーなくビルドが完了するはずです。

ビルドしてできたファームウェアや中間ファイルは、全てbuildというフォルダが作られてその中に格納されます。 ファームウェアは、build/zephyr/zephyr.binというファイル名で保存してくれます。

これをSeeeduino XIAOに書き込むには、Seeduino XIAOを書き込みモードにしてマシンに接続し、

$ west flash

とするだけです。たぶん…。というのも、私はUbuntuをリモートの仮想マシンで動かしていてSeeeduino XIAOが繋げないので、この方法が使えないのです。 WindowsでWSL上で開発環境を構築した場合も、west flashは使えません。

なので、できたファームウェアを手動でSeeeduino XIAOの書き込みツールなどを使って書き込んであげる必要があります。 Seeeduino XIAOの扱い方についても、また記事を書きたいと思います。

ともあれ、ビルドしてできたzephyr.binを書き込んだら、こんな感じで動作します。

このように、簡単にSeeeduino XIAOのファームウェアがビルドできました。

Zephyr OSはマルチスレッド対応ですし、UART、I2C、SPIなど各種ドライバもあります。 また、Seeeduino XIAOの場合はUSB-UART機能を単体で実現できます。 シェルやファイルシステムなどの便利な機能も豊富です。

いろんな機能をブログで紹介していきたいと思います。

ぜひ高機能な組み込みOSを使って、趣味の電子工作の幅を広げてみてください。