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がどのように対応しているのかは、興味があるところ。

画像1

ひとまず開発者ページにしたがって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に対応していない。ということで、本日はここまで。

この記事が気に入ったらサポートをしてみませんか?