Arduino IDEでESP32のマルチコアが動きましたのでマルチコア間の情報伝達のためのキュー(Queue)を試してみました。
→ Arduino IDEでESP32のマルチコア機能を試してみた
コア間のデータのやりとりに Raspberry Pi Pico (rp2040)では専用のFIFO(First In First Out)がありましたがESP32ではキュー(Queue)を作成して使います。
これができれば,今PICOで動いているマルチコアのプログラムが表示出力ポートのコントロール部を書き換えればESP32にも移せるという算段です(^^)。
HUB75(E)RGB LEDパネルを表示するプログラムの構想は下図です。
![](https://stat.ameba.jp/user_images/20230309/16/pta55/67/4c/j/o0874050915253155627.jpg?caw=800)
それではと,ESP32でキュー(Queue)を使い,APP_CPU(Core1)からPRO_CPU(Core0)にバイトデータを送り,下位2bitでLEDの点灯をコントロールしてみました。
画像バッファの切替の指令は届けられそうですね(^^)。
![](https://stat.ameba.jp/user_images/20230309/16/pta55/60/93/j/o2232073615253155628.jpg?caw=800)
上の画像の動きのプログラムです。
キューに関して追加した事は
3行目:キューのハンドル名をグローバル領域で宣言
11行目:setup()内でキューをハンドル名で作成 (データバッファ1, 1byte単位)
17行目:core1のタスクloop()からキューにデータを送る (待機時間 0ms)
25行目:core0のタスク"task1"でキューにデータが来ているかをチェック
26行目:データが来ていたら読み取り(待機時間 0ms)
です。
![](https://stat.ameba.jp/user_images/20230309/16/pta55/84/f3/j/o0838083915253155625.jpg?caw=800)
以上,キューが何とか使えましたが,私なりに感じているのは結構物理アドレスで動いているなぁです。
キューのハンドル名は
QueueHandle_t xQueue_1;
をグローバル領域で宣言しているので固定アドレスです。
上のプログラムでキューに送るデータの変数qvSはloop()のスコープ内で宣言し
byte qvS=0;
送る時は &変数名 として,送る値が入っている(その場(スコープ)で与えられた)アドレスをキューに伝えています。
xQueueSend( xQueue_1, &qvS, 0 );
キューを受け取る変数も同じで
"task1"のスコープ内で宣言して
byte gvR=0;
受け取る時は &変数名 として,値を入れるアドレスをキューに伝えています。
xQueueReceive( xQueue_1, &qvR, 0);
ま,自分なりに考えてみれば,マルチコアでマルチスレッドなどの時にいろんなスコープの内にある変数の場所をその名前からデータの送り元や送り先として割り出すのは到底無理な話のようにも思いますから,当然と言えば当然の事なんでしょうね。
お世話になった,分かりやすい解説のWebページです
・ESP32でマルチスレッド:キューを送る(Qiita)
→ Arduino IDEでESP32のマルチコア機能を試してみた
コア間のデータのやりとりに Raspberry Pi Pico (rp2040)では専用のFIFO(First In First Out)がありましたがESP32ではキュー(Queue)を作成して使います。
これができれば,今PICOで動いているマルチコアのプログラムが表示出力ポートのコントロール部を書き換えればESP32にも移せるという算段です(^^)。
HUB75(E)RGB LEDパネルを表示するプログラムの構想は下図です。
![](https://stat.ameba.jp/user_images/20230309/16/pta55/67/4c/j/o0874050915253155627.jpg?caw=800)
それではと,ESP32でキュー(Queue)を使い,APP_CPU(Core1)からPRO_CPU(Core0)にバイトデータを送り,下位2bitでLEDの点灯をコントロールしてみました。
画像バッファの切替の指令は届けられそうですね(^^)。
![](https://stat.ameba.jp/user_images/20230309/16/pta55/60/93/j/o2232073615253155628.jpg?caw=800)
上の画像の動きのプログラムです。
キューに関して追加した事は
3行目:キューのハンドル名をグローバル領域で宣言
11行目:setup()内でキューをハンドル名で作成 (データバッファ1, 1byte単位)
17行目:core1のタスクloop()からキューにデータを送る (待機時間 0ms)
25行目:core0のタスク"task1"でキューにデータが来ているかをチェック
26行目:データが来ていたら読み取り(待機時間 0ms)
です。
![](https://stat.ameba.jp/user_images/20230309/16/pta55/84/f3/j/o0838083915253155625.jpg?caw=800)
以上,キューが何とか使えましたが,私なりに感じているのは結構物理アドレスで動いているなぁです。
キューのハンドル名は
QueueHandle_t xQueue_1;
をグローバル領域で宣言しているので固定アドレスです。
上のプログラムでキューに送るデータの変数qvSはloop()のスコープ内で宣言し
byte qvS=0;
送る時は &変数名 として,送る値が入っている(その場(スコープ)で与えられた)アドレスをキューに伝えています。
xQueueSend( xQueue_1, &qvS, 0 );
キューを受け取る変数も同じで
"task1"のスコープ内で宣言して
byte gvR=0;
受け取る時は &変数名 として,値を入れるアドレスをキューに伝えています。
xQueueReceive( xQueue_1, &qvR, 0);
ま,自分なりに考えてみれば,マルチコアでマルチスレッドなどの時にいろんなスコープの内にある変数の場所をその名前からデータの送り元や送り先として割り出すのは到底無理な話のようにも思いますから,当然と言えば当然の事なんでしょうね。
お世話になった,分かりやすい解説のWebページです
・ESP32でマルチスレッド:キューを送る(Qiita)