ESP32のFreeRTOS入門 その1 FreeRTOSとは?

概要

ESP32を深く触っていくと、FreeRTOSにいきつきます。しかしながら情報が少ないので調べてみました。Arduino IDE環境でのFreeRTOSについてを対象とします。

FreeRTOSとは?

RTOS(Real Time Operating System)はリアルタイムOSで、組み込み系によく使わえているOSです。特徴としては、リアルタイムとついているので、厳密な時間管理ができます。リアルタイムでないOSというと、LinuxやWindowsなどのOSがありますが、重い処理をするとパソコンが固まることがあると思います。リアルタイムOSは複雑なことはできませんが、処理が途切れることなく実行できるようなOSになります。

FreeRTOSはRTOSの一種で、Freeとついているので無料で使えるものになります。FreeRTOS以外にも無料で使えるものや、有料のRTOSなどがあります。

FreeRTOSは現在Amazonが権利を保持しており、オープンソースとして公開されています。ESP32以外にも複数の環境をサポートしています。

FreeRTOSの情報

書籍

上記をみて貰えればわかるのですが、ほとんどありません。英語であれば多少でているのですが、この分野はもう日本語書籍は手に入らないのかもしれませんね。

RTOS関連は何冊かありますが、CPUの作り方とかOSの作り方系の本の方が多いですね。

特に組み込み系はノウハウが仕事に直結するので、あまり書籍がでない分野です。大学の先生とかでもESP32を使ってプロダクトを作っていても、OSそのものを研究している人はあまりいないのかもしれません。

公式ドキュメント

上記に「Mastering the FreeRTOS Real Time Kernel – a Hands On Tutorial Guide」と「FreeRTOS V10.0.0 Reference Manual」があります。

ただし英文なので、いつかは目を通したいですが、最初の一歩にはおすすめしません。

Amazonドキュメント

AmazonでもFreeRTOSの情報を提供しています。ただしAmazonのFreeRTOSは2つの意味があるので注意してください。1つ目はOSとしてのFreeRTOSでカーネルと表現されています。2つ目はAWSのサービスとしてのFreeRTOSで、単にFreeRTOS書いてある場合にはこちらになります。

Amazon FreeRTOSはIoTデバイスとして、AWS上にセンサーなどの情報をアップしたりするサービスです。「Amazon FreeRTOS ユーザーガイド」はAWSのサービスを使うためのガイドなので気をつけてください。

上記の「FreeRTOSカーネル開発者ガイド」を見る必要があります。このページがどこからリンクされているのだろう?

この資料はPDFでもダウンロードが可能ですし、日本語資料だとこれ以上のものはいまはないとは思います。

進め方

基本的にはESP32のFreeRTOS入門なので、素のFreeRTOSではなく、ESP32向けに改造されているFreeRTOSについての解説になります。

そのため、ソースコードなどは「espressif/arduino-esp32」か「espressif/esp-idf」のものを参照します。

関数などもFreeRTOSを直接呼び出す必要がない場合には、Arduino側の関数を呼び出します。

Arduino core for the ESP32の基礎知識

Arduino IDEで開発するESP32環境は、ベースとしてESP-IDF(Espressif IoT Development Framework)があります。

このESP-IDFはFreeRTOSが組み込まれており、ESP32のハードウエアへのAPIなども提供されています。Arduino coreでは、ESP-IDFをさらにラップしてArduinoと同じ関数群を実装しています。

そのため、Arduinoの提供していないようなESP32独自の機能については、ESP-IDFのAPIを直接呼び出す必要がでてきます。

ESP32のハードウエア構成

ブロックダイアグラム

よく見るですが、なかなか理解しにくい図です。機能の一覧なので、必要になったところで見ていけばよいと思います。

真ん中の「Core and memory」のところが重要で「2(or 1) x Xtensa」という記述があります。これがCPUの数で、通常は2ですが、1つしかないESP32もあります。ESP32-SOLO-1とかESP32-S2はシングルコアで、それ以外は2つあるジュアルコアになります。

シングルコアのESP32はまだ少数派ですので、一般的なデュアルコアのESP32を対象としたいきます。

System Reset

もう一つをのせておきます。ざっくりとESP32全体をSystemと呼び、CoreとRTCに機能がわかれています。

Core側に基本的な機能が実装されており、コプロセッサー的な役割でRTCがあります。RTC側に関してはULPプログラムをする時以外にはあまり意識しなくても問題ありません。

メモリマップ

こちらのも重要ですが、必要になってから学べばよいと思います。

System Structure

Core側のですが、CPUコアが2つあって、メモリや周辺機器を共有しているとのことですが、ここで見てもらいたいのはCPUコアの名前です。

番号コア名
Core0PRO_CPU
Core1APP_CPU

上記のような対応になっています。2つのコアのうち、最初のコアをPRO_CPUと呼び、次のコアをAPP_CPUと呼びます。

コアは0からカウントするので上記の表の対応になります。Arduinoでは基本的にはCoreの番号で管理していて、データシートやESP-IDFのドキュメントではコア名で記述されています。

#define PRO_CPU_NUM (0)
#define APP_CPU_NUM (1)

ソースを検索したところsoc.hにて定義されています。しかしArduinoの場合にはこの定義ではなく、直接0とか1を指定している場合が多いようです。

コアの役割

2つのコアはどのような用途につかっても構わないのですが、標準的な使い方はコアの名前の通りで、Core0のPRO_CPUはバックグラウンド系の処理、Core1のAPP_CPUはアプリのメイン処理を動かすことが多いようです。

Arduinoの場合にはsetup()やloop()関数はCore1のAPP_CPUで動いており、無線関係の処理はCore0のPRO_CPUで動いています。

まとめ

概要だけで終わってしまいましたが、次回はArduinoのmain関数まわりからタスクの説明をしたいと思います。

続編

2件のコメント

    1. 月曜に予約投稿しています
      次回はタスクです
      その次は水曜日あたりにマルチタスクの予定です

コメントする

メールアドレスが公開されることはありません。

管理者承認後にページに追加されます。公開されたくない相談はその旨本文に記載するかTwitterなどでDM投げてください。またスパム対策として、日本語が含まれない投稿は無視されますのでご注意ください。