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

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

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

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

www.mikan-tech.net

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

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

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

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

準備するもの

開発用のマシンを用意します。WindowsやMacでももちろんOKですが、ここではUbuntu 20.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 20.04ならこれで良いのですが、古いバージョンのUbuntuの場合、CMakeが古くてビルドできない場合があります。

$ cmake --version

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

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

$ wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | sudo apt-key add -
$ sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ bionic main'
$ 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 v2.5.0 ~/zephyrproject
$ cd ~/zephyrproject
$ west update

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

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

なお、最初のwest init--mr v2.5.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としてまとめられていて、インストーラで簡単にインストールできます。

Nios II1、ARC2、SPARC3みたいな聞いたことないアーキテクチャのコンパイラなんて使わないのでインストールしたくない😡という人は、インストーラを使わずに手動で必要なものだけインストールもできます。

なおインストーラが使えるのはUbuntuのみで、Windows、Macでは手動でツールチェーンをインストールする必要があります。

手動でのやり方はこちらの公式マニュアルにあります。

ここでは、Ubuntuでインストーラを使ってらくらくインストールします。

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

$ cd ~
$ wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.12.3/zephyr-sdk-0.12.4-x86_64-linux-setup.run

実行権限をつけて、インストーラを実行します。

$ chmod +x zephyr-sdk-0.12.4-x86_64-linux-setup.run
$ ./zephyr-sdk-0.12.4-x86_64-linux-setup.run -- -d /opt/zephyr-sdk-0.12.4

この例では、/opt/zephyr-sdk-0.12.4にインストールしました。

自分のホームディレクトリにインストールする場合は、最後のコマンドのオプションを-d ~/zephyr-sdk-0.12.4にするとよいでしょう。

なお、Zephyr OSのビルドシステムが自動で認識するディレクトリのパターンは決まっています。 基本的にはこの2つか、公式マニュアルに出ているパターンのいずれかを使うのがオススメです。

それ以外の場所にインストールしたい人は、ZEPHYR_SDK_INSTALL_DIRという環境変数にインストール先を指定する必要があります。

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

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

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

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

$ cd ~/zephyrproject/zephyr/samples/basic/blinky
$ tree
.
├── CMakeLists.txt
├── README.rst
├── prj.conf
├── 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を書き込んだら、こんな感じで動作します。

f:id:kimura_khs:20210411174602g:plain

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

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

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

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


  1. アルテラ(インテルが2015年に買収)のFPGAボード上に構成できる32bit CPUコアです。Zephyr OSではAltera MAX10を搭載したAltera MAX10 Rev C development kitがサポートされています。

  2. LSIの設計ツールを開発するシノプシスが出している32bit CPUコアです。Zephyr OSではシノプシスの評価ボードがいくつかサポートされているようです。

  3. サン・マイクロシステムズが開発したCPUコアです。富士通のスパコンとかに使われているイメージでしたが、Zephyr OSではLEON3というSPARC V8命令セットを実装したCPUがサポートされているみたいです。