tl;dr
VSCode + PlatformIO というモダンな開発環境で Zephyr RTOSを使った micro:bit の開発を試してみました。Linux 上での操作で説明します。
いきさつ
VSCode + platformio が良いらしいということを聞いてひとつ試してみるかと思いました。手元にmicro:bitがあったのですが、framework が Arduino
, Mbed
, Zephyr RTOS
の3択。Zephyr? なにそれ? 聞いたことない、ということで、せっかくだから俺はこのZephyrを選ぶぜ、と思った次第です。
VSCode
拡張機能にPlatformIOを追加すれば準備完了です。VSCodeじゃないところでPlatformIOを (aptやbrewなどで) 入れていると衝突するようなので注意しましょう。(ぼくは最初これでハマりました。)
udev の設定 (Linux)
以下の2行を適当なファイル名で/etc/udev/rules.d/
に入れておきます。
KERNEL=="ttyACM[0-9]*",MODE="0666"
ATTRS{product}=="*CMSIS-DAP*", MODE="660", GROUP="plugdev", TAG+="uaccess"
ファイルを作ったらsystemctl restart udev.service
あるいは再起動などして有効化してください。
プロジェクトの作成
VSCodeの左に縦に並んでいるアイコンのPlatformIOを選択して、QUICK ACCESS
> PIO Home
> Open
> + New Project
と進みます。
適当なプロジェクト名を入力し、Board を BBC micro:bit
、FrameworkをZephyr RTOS
として Finish。これだけです。簡単!
プロジェクトの設定
今回はデフォルトではビルドされない Displayインタフェース を使おうと思うので設定ファイルを一つ作ります。PlatformIO
> QUICK ACCESS
> PIO Home
> Open
> Open Project
から今作ったプロジェクトを開きます。左にツリー表示が現れるので、プロジェクト名
> zephyr
を展開します。たぶん CMakeLists.txt
だけがあると思いますが、それと同じ階層に prj.conf
というファイルを新規作成します。内容は以下の通りです。
CONFIG_DISPLAY=y
CONFIG_MICROBIT_DISPLAY=y
main.c の編集
src
に入っている main.c
を開いて編集します。こんな感じでどうぞ。
#include <zephyr.h>
#include <sys/printk.h>
#include <display/mb_display.h>
void main(void)
{
struct mb_image patterns[] = {
MB_IMAGE(
{0, 0, 0, 0, 0},
{1, 1, 0, 1, 1},
{0, 0, 0, 0, 0},
{1, 0, 0, 0, 1},
{0, 1, 1, 1, 0},
),
};
struct mb_display *dpy = mb_display_get();
mb_display_image(dpy, MB_DISPLAY_MODE_DEFAULT, SYS_FOREVER_MS, patterns, 1);
while (1) {
printk("hello, world %s\n", CONFIG_BOARD);
}
}
build & upload
VSCode 最下部にチェックマークがあると思います。これをクリックすればビルドできます。あるいは PlatformIO
をクリックして現れる PROJECT TASKS
の Build
をクリックしても同じです。その際、最下部左側のアイコンの並びの最後の方にプロジェクト名が出ていますが、これが今作業したい対象のプロジェクトです。そうでない場合は、ここをクリックすると選択できます。
この図だと右端のDefault (mbdemo)
の部分です。
なんかUIが非常に分かりづらいのですが、ぼくはVSCodeもpioもほぼ初めてなので何かもっと素直な方法があったら教えてください。
無事ビルドが終わったら micro:bit を差し込んでチェックマークの隣りの矢印(→)をクリックします。これで書き込み完了です!micro:bitに表示が現れます。(本記事の冒頭の写真)
シリアル出力も確認
コードの最後の無限ループでprintk
しています。これはシリアルに吐いているはずなので確認してみましょう。Linux の場合はこんな感じです。上述の udev が効いていれば sudo 不要のはずです。
$ stty -F /dev/ttyACM0 raw 115200
$ cat /dev/ttyACM0
おわりに
これでいちおうPlatformIOの開発手順が把握できたし、Zephyr経験者になることもできました。RTOS要素ゼロですけど。
micro:bit はmbed OSのclassicな方しか対応していなかったと思うので、より本格的なRTOSが使いたい場合はZephyrが役に立つかも知れません。ぼくは…たぶんもう使うことはないだろうな。