モダンOSのお砂場(26) Zephyr RTOS、micro:bit v2でHello!

Joseph Halfmoon

前回、MbedオンラインコンパイラがサポートしているBBC micro:bitはv1.3だということに気づいてしまいました。v2は勿論、v1.5すら対象外。愕然。まあ、v1.3とv1.5の差に気をつければ生成オブジェクトはv1.5ハード上でも動作することは確かめましたが。しかし大っぴらにv1.5およびv2をサポートできるRTOSとしてZephyrの利用にトライ。micro:bit v2上でZephyrのサンプルプログラムを動かしてみました。

さて BBC mico:bit v2上で動作するZephyr利用のオブジェクトを生成するために使用する開発環境としては、以下を選択いたしました。

VSCode + PlatformIO

慣れている、という理由が一番です。でも、PlatformIOホント楽だし。結局 C/C++で micro:bit をプログラムする試みは、Arduino環境、そしてZephyr RTOS環境、ともにVSCode + PlatformIOでの試行となりました。

さて今回は、Zephyrのサンプルプログラムをビルドして、ちゃんとmicro:bit v2上で動作することを確かめるだけ、のつもりです。コードを書く気もなし。まずは、以下のPlatformIOのサイト内のページを見てみました。

Zephyr RTOS

なんと、Zephyr RTOS用のTutorialsの先頭にあるのは、Nordic nRF52-DKではないですか。nRF52シリーズは、すなわち、micro:bit v2のSoCです。Tutorialsで使われていたのは、残念ながら BBC micro:bit V2ではないボードでした。しかし、PlatformIOの中の Boards には以下のページが存在し、Frameworks欄には、Zephyr RTOSがちゃんと書かれています。

BBC micro:bit V2

こんなペースであれば、Project Exampleをインポートして設定ファイル、platformio.ini あたりを修正すれば動くんでないの?勝手な推測です。そこで nRF52用のExampleを開くと、zephyr-ble-beaconとかzephyr-blinkが存在します。この辺ビルドすれば良くね。飛んで火にいる夏の虫?

ZephyrExamplesしかし、そうは問屋が下しませなんだ。上記のExampleはBBC micro:bit V2用ではありませんでした。対象ボードが違うので、micro:bitのためにはビルド環境など自力で作ったうえにExampleのソースも変更せにゃならない、ようであります。

気を取り直してZephyr RTOSのサイト(こちらがご本家だな)側にもある BBC micro:bit V2の以下ページを開きました。

BBC MicroBit V2

後から泥縄でドキュメントを読むたび、いつもの事ながら驚きます。1行引用させていただきます。

Here is an example for the Hello World application.

つまり、blinkとかble-beaconとかのExamplesはそのままではmiro:bit v2上でビルドできないけれども、「古典的」なHello Wroldプログラムであれば、micro:bit v2の上でそのままビルドできる、ということです。「古典的な」Hello WorldプログラムのソースはPlatformIOがzephyrのために自動ダウンロードしたライブラリの以下のところに既に入ってました。

Your Install Path\.platformio\packages\framework-zephyr\samples\hello_world

PlatformIO上で、micro:bit V2用のZephyr RTOSのビルド環境を構築する場合は、以下のようにして(Project nameをちゃんと入力しないとダメですが)、main.cのソースの内容が空のプロジェクトを作成し、main.c を上記のHello Wroldのソースに差し替えればOKでした。

ProjWiz

もともとのサンプルは本当に printk()が1行だったですが、シリアルモニタで取りはぐれないようにループ化したので以下のように改造しました。これにより1.5秒毎にHello World!しつづけます。
PlatformIOINI
シリアルモニタで実行結果を観察するとこんな感じです。ちゃんと Hello World!してました。

mbv2_helloworldoutput

なお、k_sleep()関数で待ちを入れてますが、CLOCK_TICKの値などは以下の autoconf.h ファイル内で定義されているようでした。毎秒32k回のtickです。1tick≒31μsのようです。なお、micro:bit用のライブラリのオブジェクトファイルやヘッダファイルなどは buildパスの中に作成される bbcmicrobit_v2ディレクトリの中におさめられていました。CONFIG_mbv2

とりあえず、ビルドできてオブジェクトも実行可能であることは確認できました。しかし、今回のソースはprintkとかk_sleepとかOSカーネル(Linux風のお名前)用の関数を直接呼んでいて Zephyr のお行儀のよいアプリとは言えませぬな。まずは「デバイスツリー」あたりから勉強してちゃんとIOなど扱えるようにならないと。また次回ですかね。

モダンOSのお砂場(25) MbedとMicroBit、threadとfiber に戻る