2026年7月9日木曜日

esp32はplatformIOでコンパイル激速 cf rp2040 freertos using SMP

 https://qiita.com/nextfp/items/f54b216212f08280d4e0を参考にplatformIOをつかう

ちなみにsingle coreのesp8266はarduinoIDEでそこそこ早い。。。

https://lang-ship.com/blog/?s=ESP32%E3%81%AEFreeRTOS%E5%85%A5%E9%96%80#google_vignette 

esp32 reeRTOS tutorial index

Arduino IDEで本当におすすめなのは?
>
> RP2040でArduino IDEを使うなら、Arduino-Pico + FreeRTOS SMPが最も導入しやすく、マルチコア性能も活かしやすい構成です。
>
> もし「Arduino IDEでそのままコンパイルできる、RP2040用FreeRTOSマルチコアの完全なサンプル(LED点滅とSerial出力を2コアで同時実行)」をご希望であれば、そのまま動作するプロジェクト一式をご用意できます。
>
> まずはCORE1,CORE2でLEDブリンク
>
> RP2040では、コア名は Core0 と Core1 です(Core2はありません)。
>
> まずはArduino IDEで、Core0とCore1がそれぞれ別のLEDを点滅する最も簡単なサンプルを紹介します。
>
> Arduino-Pico(Earle Philhowerコア)のマルチコア機能を使う例
>
> この方法はFreeRTOSを使わず、まずマルチコア動作を確認するためのサンプルです。
>
> // Core0: LED_BUILTIN
> // Core1: GP15
>
> const int LED0 = LED_BUILTIN;
> const int LED1 = 15;
>
> //-------------------------
> // Core1で実行される
> //-------------------------
> void setup1() {
>   pinMode(LED1, OUTPUT);
> }
>
> void loop1() {
>   digitalWrite(LED1, HIGH);
>   delay(200);
>   digitalWrite(LED1, LOW);
>   delay(200);
> }
>
> //-------------------------
> // Core0で実行される
> //-------------------------
> void setup() {
>   pinMode(LED0, OUTPUT);
> }
>
> void loop() {
>   digitalWrite(LED0, HIGH);
>   delay(1000);
>   digitalWrite(LED0, LOW);
>   delay(1000);
> }
>
> 動作
>
> Core0
>
> LED_BUILTIN:1秒周期で点滅
>
> Core1
>
> GP15:0.2秒周期で点滅
>
> このプログラムでは、2つのコアが独立して動作していることが確認できます。
>
> ________________________________
>
> 配線
>
> 外付けLEDを使う場合は、
>
> GP15 ---- 330Ω ---->|---- GND
>
> のように接続してください。
>
> ________________________________
>
> 次のステップ(FreeRTOS)
>
> マルチコア動作が確認できたら、次はFreeRTOS SMPを使って、
>
> LED1タスク
> LED2タスク
>
> を作成し、それぞれをCore0・Core1に割り当てる例に進むのがおすすめです。
>
> 確認したいこと
>
> お使いのボードは
>
> Raspberry Pi Pico
> Raspberry Pi Pico W
> Raspberry Pi Pico 2
> Raspberry Pi Pico 2 W
>
> のどれでしょうか?
>
> Arduino IDEでは、Arduino-Pico を使用していますか?(Arduino Mbedコアでは手順が異なります。)
>
> マルチコア動作が確認できたら、次はFreeRTOS SMPを使って、 LED1タスク LED2タスク を作成し、それぞれをCore0・Core1に割り当てる例
>
> はい。RP2040でFreeRTOS SMPを使い、2つのLEDタスクをそれぞれCore0とCore1で動かす例を示します。
>
> 前提
>
> ボード:Raspberry Pi Pico / Pico W(RP2040)
> Arduino IDE
> Arduino-Pico
> FreeRTOSライブラリが有効
>
> サンプル
>
> #include <Arduino.h>
> #include <FreeRTOS.h>
> #include <task.h>
>
> #define LED0 LED_BUILTIN
> #define LED1 15
>
> TaskHandle_t task0Handle;
> TaskHandle_t task1Handle;
>
> void task0(void *pvParameters)
> {
>     pinMode(LED0, OUTPUT);
>
>     while (1) {
>         digitalWrite(LED0, !digitalRead(LED0));
>         vTaskDelay(pdMS_TO_TICKS(1000));
>     }
> }
>
> void task1(void *pvParameters)
> {
>     pinMode(LED1, OUTPUT);
>
>     while (1) {
>         digitalWrite(LED1, !digitalRead(LED1));
>         vTaskDelay(pdMS_TO_TICKS(250));
>     }
> }
>
> void setup()
> {
>     Serial.begin(115200);
>
>     xTaskCreate(
>         task0,
>         "LED0",
>         256,
>         NULL,
>         1,
>         &task0Handle);
>
>     xTaskCreate(
>         task1,
>         "LED1",
>         256,
>         NULL,
>         1,
>         &task1Handle);
>
>     // Core0に固定
>     vTaskCoreAffinitySet(task0Handle, (1 << 0));
>
>     // Core1に固定
>     vTaskCoreAffinitySet(task1Handle, (1 << 1));
> }
>
> void loop()
> {
>     // FreeRTOSが動作するので空
> }
>
> 動作
>
> Core0
>
> LED_BUILTIN:1秒周期で点滅
>
> Core1
>
> GP15:250ms周期で点滅
>
> これで2つのタスクが異なるコアで実行されます。
>
> ________________________________
>
> もし vTaskCoreAffinitySet() が見つからない場合
>
> 実は、Arduino-Picoに含まれるFreeRTOSのバージョンによっては、このAPIがありません。
>
> その場合は別の方法でコアを指定する必要があります。
>
> 確認したいこと
>
> Arduino IDEで使用している
>
> Arduino-Picoコアのバージョン(例:5.2.0など
>
> を教えてください。
>
> また、**「スケッチ → ライブラリをインクルード」**に FreeRTOS は表示されていますか?
>
> その情報が分かれば、お使いの環境に合った確実にコンパイルできるサンプルをお示しします。
>
> で実行できます。
> > [1, 2]
> > ________________________________
> > FreeRTOS SMPの基本設定
> > FreeRTOSの標準機能としてSMPがサポートされています。マルチコアを有効にするためには、プロジェクト内の
> > FreeRTOSConfig.h で以下の設定を変更します。 [1]
> > 
> >
> > #define configNUMBER_OF_CORES 2
> >
> > コードは注意してご使用ください。
> > これにより、OSが両方のコアを認識し、優先度の高いタスクから順に空いているコアへ割り当てて実行するようになります。 [1]
> > タスクの実行コアを固定する方法(コア・アフィニティ)
> > 特定のタスクを必ず「Core0」または「Core1」で動かしたい場合は、タスク・アフィニティ(Task Affinity)を設定します。
> > FreeRTOSが用意している vTaskCoreAffinitySet API関数を使用します。 [1, 2]
> > c
> >
> > TaskHandle_t xTaskHandle;
> >
> > // タスクを生成
> > xTaskCreate(vTaskCode, "TaskName", STACK_SIZE, NULL, PRIORITY, &xTaskHandle);
> >
> > // Core1(インデックス 1)にタスクを固定する
> > vTaskCoreAffinitySet(xTaskHandle, (1 << 1));
> >
> > コードは注意してご使用ください。
> >
> > (1 << 0): Core0に固定
> > (1 << 1): Core1に固定
> > (1 << 0) | (1 << 1): どちらのコアでも実行可能(デフォルト)
> >
> > 開発時の注意点
> >
> > 排他制御の徹底
> > マルチコア環境では、2つのタスクが同時に動くため、グローバル変数の読み書きや周辺回路(I2CやSPIなど)へのアクセスが衝突する可能性があります。必ず
> > Mutex(ミューテックス) や セマフォ を使用してリソースを保護してください。 [1, 2, 3]
> > デッドロックの回避
> > RP2040でFreeRTOSを使用する際、メモリ管理方式(heap_3など)によってはSDKのメモリ管理とOSのロック機構が衝突しデッドロックを引き起こす場合があります。heap_4
> > または heap_5 の利用が推奨されます。 [1, 2, 3]
> >
> > 実装例と詳細情報
> > 詳細な実装方法やキュー(Queue)を用いたタスク間の通信方法については、以下の資料や記事が参考になります。 [1, 2]
> >
> > 複数タスクの実行とコアの割り当てについては、Qiita - RP2040マルチコア #FreeRTOS で解説されています。
> > マルチコアOSの挙動や仕組みの概要は、オープンソースカンファレンスの資料 が分かりやすいです。
> > タスク実行の基本的な概念やスケジューラについては、note - Raspberry Pi Picoのマルチコア機能をつかう を確認してみましょう。

0 件のコメント:

コメントを投稿