皆さん、ESP-WROOM-02 をお使いでしょうか。ESP-WROOM-02 を使う場合、Arduino IDEを使うのが、簡単かとおもいます。簡単なのは良いのですが、色々と開発を行う面で不都合がでてきます。
この記事では、esp-open-rtos というリアルタイムOSをオススメする理由を書きたいと思います。
リアルタイムOSの必要性
リアルタイムOSというのは、リアルタイム性のある組み込みOSです。が、ここではそのリアルタイム性には特に注目しません。
Arduino の開発をしていて不便なのは、、色々とありますが、スレッドが無いことでは無いでしょうか。それは、MPUの制限なので、どうしようもないのですが、複雑なことをすると、コードの管理が難しくなる場合が有ります。
例えば、LEDを点滅するとします。
1つだと、、
void loop() {
digitalWrite(13, 1);
delay(500);
digitalWrite(13, 0);
delay(500);
}
まぁ、OKなのですが、2つを別の周期で点灯させると??
void loop() {
digitalWrite(13, 1);
digitalWrite(11, 1);
delay(250);
digitalWrite(11, 0);
delay(250);
digitalWrite(11, 1);
digitalWrite(13, 0);
delay(250);
digitalWrite(11, 0);
delay(250);
}
などとなり、訳分からなくなります。もちろん、うまく書く方法もありますが、まぁ、こういった複雑性は、いつか問題になります。
いっぽう、esp-open-rtos を使うと
#include "espressif/esp_common.h"
#include "FreeRTOS.h"
#include "task.h"
#include "esp8266.h"
void blinkenTask1(void *pvParameters)
{
gpio_enable(gpio, GPIO_OUTPUT);
while(1) {
gpio_write(13, 1);
vTaskDelay(500 / portTICK_RATE_MS);
gpio_write(13, 0);
vTaskDelay(500 / portTICK_RATE_MS);
}
}
void blinkenTask2(void *pvParameters)
{
gpio_enable(gpio, GPIO_OUTPUT);
while(1) {
gpio_write(11, 1);
vTaskDelay(250 / portTICK_RATE_MS);
gpio_write(11, 0);
vTaskDelay(250 / portTICK_RATE_MS);
}
}
void user_init(void)
{
xTaskCreate(blinkenTask1, (signed char *)"blinkenTask1", 256, NULL, 2, NULL);
xTaskCreate(blinkenTask2, (signed char *)"blinkenTask2", 256, NULL, 2, NULL);
}
と分けて書くことができます。
通常の GNU C 環境である事
Arduino IDEは、導入は簡単ですが、Make など、ビルドスクリプトを使う事が出来ません。そのため、一部のライブラリの導入のハードルは高くなっています。
一方、esp-open-rtos は、一般的な、Gnu C / Make のビルド環境で開発できます。そのため、既存のCのライブラリの取り込みが簡単です。
esp-open-rtos のソースを見ていると、移植の仕方も見当が付くかと思います。
特に、 mbedtlsの部分が分かりやすいです。