M5StickC Plus + FreeRTOSでLチカ
そろそろリアルなハードウェア上でFreeRTOSを動かしてみたくなったので、M5StickC Plusをポチった。M5StickC PlusにはXtensa LX6コアベースでWiFiやBLEがワンチップ化されたESP32マイコン(Espressif ESP32-PICO-D4)が搭載されている。標準の開発環境はArduinoかUIFlowだけど、FreeRTOS上に実装されているので、ArduinoのプログラムからFreeRTOS APIを直接叩くことができるのだ。もう少し詳しく書くと、Arduino CoreはEspressifのESP IDF(IoT Development Framework)を使って実装されている。また、実はこのマイコンはデュアルコアなんだけど、FreeRTOSがどのように対応しているのかは、興味があるところ。
ひとまず開発者ページにしたがってArduino IDE(開発環境)をセットアップする。基本的にドキュメントにしたがって進めていけばよいのだが、M1 Macで動かす場合はリンク先のCP2104ドライバが古いことに注意。バージョン6.0.1をインストールしておけば問題ない。古いドライバはkext形式だったので、低セキュリティモードで起動する必要があるのだろうかとか、カーネル拡張もRosetta 2で変換できるのかとかいろいろ悩んで時間を浪費してしまった。
閑話休題。Arduino IDEでM5StickC Plus用のサンプルプログラムをビルドしてみる。と、しょっぱなからエラー。
Traceback (most recent call last):
File "/Users/oraccha/Library/Arduino15/packages/m5stack/tools/esptool_py/3.0.0/esptool.py", line 39, in <module>
import serial
ImportError: No module named serial
exit status 1
どうみてもPythonっぽいエラー。ここを参考にシステムデフォルトのPython 2.7にpyserialパッケージをインストールする。
% sudo pip3 install --target /Library/Python/2.7/site-packages pyserial
お、動いた!
では、早速Lチカを書いてみる。
#include <M5StickCPlus.h>
void testTask(void *pvParameters) {
while (1) {
digitalWrite(10, HIGH);
delay(1000);
digitalWrite(10, LOW);
delay(1000);
}
}
void setup() {
Serial.begin(115200);
M5.begin();
pinMode(10, OUTPUT);
M5.Lcd.setCursor(10,50);
M5.Lcd.print("Hello, world!\n");
xTaskCreatePinnedToCore(testTask, "testTask1", 8192, NULL, 1, NULL, 0);
}
void loop() {
// put your main code here, to run repeatedly:
}
setup関数とloop関数は、Arduinoでおなじみの関数。xTaskCreatePinnedToCore関数はESP32用に拡張されたもので、引数が一つ追加されている。最後の引数はタスクを実行するコア番号を指定する。コア0はプロトコルコア、コア1はアプリケーションコアと呼ばれる。setup関数とloop関数はコア1で実行されるので、FreeRTOSのタスクはコア0で動かす必要がある。
さて、冒頭の疑問に戻るが、FreeRTOSのSMP拡張(ESP-IDF FreeRTOSと呼ぶのかな)は、FreeRTOSからフォークしたもののようだ。本家のFreeRTOSはSMPに対応していない。ということで、本日はここまで。