バッファリングしたい
#include <Arduino.h>
QueueHandle_t xQueue;
xQueue = xQueueCreate(
10, // キューの要素数
sizeof(int) // 1要素のサイズ
)
FreeRTOS Queueライブラリで、FIFOバッファーを利用できます。
このライブラリはArduinoライブラリ(Arduino.h)に含まれているため、
追加のインクルードは不要です。
キューを作成したい(xQueueCreate)
static QueueHandle_t xQueue;
void setup() {
xQueue = xQueueCreate(10, sieof(int));
}
QueueHandle_tでQueueオブジェクトのポインターを作成し、xQueueCreateでキュー用の配列をメモリ上に確保します。
QueueHandle_tは
キューを操作するためのハンドルです。
キュー用メモリは、一度だけ作って使い回すのが基本なので、
static(またはstaticグローバル)に定義して、setup関数で初期化するの標準的な設計です。
注釈
xQueueCreateは内部でmallocして動的にメモリを確保します。
メモリ制限がシビアで、完全にユーザー制御したい場合は
xQueueCreateStaticを使います。
キューから受け取りたい(xQueueReceive)
int rx;
(xQueueReceive(xQueue, &rx, portMAX_DELAY)
xQueueReceive関数でキューからデータを受け取ることができます。
キューは基本的にFIFOバッファーとなっているため、
バッファーの先頭のデータが取り出されます。
void loop() {
int rx;
// キューにデータがあれば1つ取り出す
// 非ブロッキング処理: 即時取り出しを指定。空ならばスキップ
if (xQueueReceive(xQueue, &rx, 0) == pdPASS) {
// キューから取り出したデータを処理
Serial.println(rx);
}
//
doMainStuff();
}
キューに送りたい(xQueueSend)
int value = 123;
xQueueSend(xQueue, &value, portMAX_DELAY);
xQueueSend関数でキューにデータを追加できます。
キューは基本的にFIFOバッファーとなっているため、
バッファーの末尾にデータが追加されます。
バッファーが一杯のときの対応は[どう設定するか調べる]
割り込みしたい(xQueueSendFromISR)
xQueueSendFromISR(xQueue, &value);
xQueueSendFromISR関数で、割り込み(ISR)からキューにデータを追加できます。
命名規則
FreeRTOSのライブラリは、名前の先頭に
x / v / ux / pv などのプリフィクスが付いた
FreeRTOS固有の形式
(型プリフィクス付きのPascalCase)
です。
prefix |
戻り値の型 |
例 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|