狠狠撸

狠狠撸Share a Scribd company logo
いまどきの組込みOSの
ZephyrRTOSと
OpenThreadを
Arduino環境で遊んでみる
あすもの研 5月度 MEETUP
富士通コンピューターテクノロジーズ 常田 裕士
最近の組み込みOS事情
qFreeRTOS
? Anazonが買収(2017年)
?ThreadX RTOS
? 惭颈肠谤辞蝉辞蹿迟が买収(2019年)
Zephyr-RTOS
q元々WindRiver社のプロジェクトだったが、オープンソース化
q現在はLinux Foundationが開発を進めている
? Nordic Semiconductorが積極的にコミット
q4月に最新版のv1.14.0がリリース
Zephyr-RTOSの特徴
q全体的にLinux風味の組み込みOS
qprintk()など、Linuxのカーネル見たことある人なら、
ナントナクソレッポイのが見える。
qいろんなハードに対応するため、Linuxで実績のあるmenuconfigを移植している
?現在150種類以上のボードに対応
q FreeRTOSと比べると、「大きなOS」
q FreeRTOSは敢えてタスクの実行関係だけに絞っていて、他はオプション
q ZephyrRTOSはドライバから何から、「色々入っている」
?menuconfig, DeviceTree導入の帰結で、要らないものを外してコンパイルできるから。
OpenThread
?Google傘下のNestが作ったIoT向け通信規格のThreadのオープンソース版
?IEEE802.15.4, 6LoWPAN, COAPなどのオープン標準の上に作られている。
?Threadの仕様はThread Groupで作っている。
? 仕様書は登録すれば無料で読める。ただし情報公開に制限あり。
? 認証には金がかかる(Bluetoothなんかと同じ)
?各種の組み込みOSに埋め込んで使える。
? 現在ZephyrRTOSとFreeRTOSに対応が入っている。
Google Next Hub Maxに搭載!
2019年夏、アメリカ、イギリス、オーストラリアで発売予定
ZephyrRTOSをArduino環境から使う
?https://github.com/soburi/arduino-on-zephyr
?実体としては、ZephyrRTOS組み込んだArduino互換実装
?Arduinoからコンパイルできるようにするために、あの手この手で動かしている。
main()が動けばいいじゃない!
// cores/arduino/main.cpp
int main(void)
{
init();
initVariant();
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
?Arduinoのメインの処理はこれだけ。
?Init(), initVariant()は初期化処理。必要なければ何もし
なくてもよい。
?serialEventRunも設定しなければ何もしない。
?setup(), loop()は自分で書いている。
? 実は何もしなくてよい。
Lチカ
? pinMode(), digitalWrite(), delay()は作る必要がある
? だいたい似たような関数がZephyrRTOSにある
? delay()
? ZephyrRTOSではk_sleep()が全く同じ機能。
? digitalWrite()
? gpio_pin_write()が同じ機能。ピンの番号だけ変換。
? pinMode()
? gpio_pin_configure()が同じ機能
? attachIntterupt()もpinの設定を変えるけど?
? Arduinoだと、attachInterrupt()はレジスタ見てピン状態を確認してる
? ZephyrRTOSだと、ピンの状態調べられない?!
? いい感じに実装する
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
コンパイルする
?最近のArduino(1.8以降)はarduino-builderのコマンドを経由
して、コンパイラを動かしている
?Arduinoのhardware以下のフォルダにあるplatform.txtを読
み取って、コンパイルのコマンドを決めている。
?Arduinoの.inoファイルはコンパイル時にC++のソースに変換
される。
ArduinoIDE
arduino-builder.exe
gcc
ZephyrRTOSのコンパイル
?ZephyrRTOSではCMakeとninjaでビルドシステムが作られて
いる。
?コンパイラの設定はZephyrRTOS側で持っている
CMake
ninja
gcc
黒魔術
?arduino-builderからコンパイラが起動されるので、platform.txtを書き
換えて、コンパイラの部分を乗っ取る
?コンパイルのコマンドを引っ掻き集めて、CMakeのファイルを作る。
?あとはZephyrRTOSのビルドの仕組みでビルドする。
?arduino-builderのpreprocessの処理が酷い
?使われているライブラリを探す処理をpreprocessでやっている
?インストールされているライブラリのディレクトリをひとつずつ
include対象にして、総当たりでコンパイルエラーが発生しない
設定を探す。
ArduinoIDE
arduion-builder.exe
独自コマンド
CMake
Ninja
gcc
独自ライブラリを作る
?今回はZephyrRTOSに組み込まれているOpenThreadを使いたいので、ライブラリを作成した
?基本的には、「関数を呼ぶだけ」
?https://www.arduino.cc/en/Reference/APIStyleGuide
? Arduinoのライブラリの作成ガイド
? Don’t assume knowledge of pointers.
? ArduinoのAPI設計の根幹
? Computer Science的な原則と敵対することになる。
? Abstract禁止!
? これを守ると、ライブラリの使用感がArduinoっぽくなる。
通信
?自作のOpenThread APIを使って、RaspberryPiと UDP echoで単純な通信ができた。
?通信自体は従来のArduinoのUDPライブラリと同じ。ノウハウがそのまま使える。
NRF52840
(Arduino化)
RaspberryPI
(Linux)
OpenThread
モジュール
echo
echo
nRF52840
?国内で入手できるモジュールもようやく増えてきた
?https://www.sparkfun.com/products/15025 千石電商で売ってる
?https://www.switch-science.com/catalog/5400/ SwitchScienceで売ってる
?https://makezine.com/2019/05/17/arduino-unveils-new-nano-family-of-boards/
?5/17に発表された Arduino Nano33 にも搭載予定
まとめ
?ZephyrRTOS/OpenThreadはGoogle Nest Hub Maxが流行ると、面白くなるかも。
?arduinoのAPIの設計はクセがある。
?arduino-builderの闇は深い。
?nRF52840のボードが出てきたので、OpenThreadで遊ぶ環境が作りやすくなった。
?OpenThreadを触ってるやつがいない。

More Related Content

いまどきの組込みOSの? ZephyrRTOSと? OpenThreadを? Arduino環境で遊んでみる