So erstellst und verwendest du eine Task-Queue in FreeRTOS:
Globale Deklaration
Deklariere die Struktur eines Tasks (ich empfehle, einen Task-Typ enum class zu verwenden, um die Flexibilität zu behalten, mehrere Task-Typen zu nutzen):
freertos_i2c_task_structs.cpp
#include <freertos/queue.h>
enum class I2CTaskType : uint8_t {
MyTaskType = 0
};
struct I2CTask {
I2CTaskType type;
// Parameter
int16_t value;
};
static QueueHandle_t i2cTaskQueue;Initialisierungscode
Rufe dies einmal auf, bevor du es verwendest:
i2cTaskQueue = xQueueCreate(8 /* Anzahl der Queue-Slots */, sizeof(I2CTask));
freertos_i2c_queue_init.cpp
// Task-Queue erstellen
i2cTaskQueue = xQueueCreate(8 /* Anzahl der Queue-Slots */, sizeof(I2CTask));Im Thread, der die Queue verarbeitet
freertos_i2c_queue_receive.cpp
if (xQueueReceive(i2cTaskQueue, (void *)&task, portMAX_DELAY /* Unendlich auf neue Tasks warten */) == pdTRUE) {
if(task.type == I2CTaskType::MyTaskType) {
// TODO Task verarbeiten
Serial.printf("My task type: %d\r\n", task.value);
}
}Wie man einen Task zur Queue hinzufügt
freertos_i2c_add_task.cpp
void AddTask(int16_t val) {
I2CTask task;
task.type = I2CTaskType::MyTaskType;
task.value = val;
xQueueSend(i2cTaskQueue, (void*)&task, 10 / portTICK_PERIOD_MS /* timeout */);
}
Ähnliche Beiträge nach Kategorie:
C/C++ Embedded FreeRTOS PlatformIO
Wenn dieser Beitrag dir geholfen hat, erwäge, mir einen Kaffee zu spendieren oder per PayPal zu spenden, um die Recherche und Veröffentlichung neuer Beiträge auf TechOverflow zu unterstützen