Вот как вы создаёте и используете очередь задач в FreeRTOS:
Глобальное объявление
Объявите структуру задачи (я рекомендую использовать тип задачи enum class для сохранения гибкости использования нескольких типов задач:
freertos_i2c_task_structs.cpp
#include <freertos/queue.h>
enum class I2CTaskType : uint8_t {
MyTaskType = 0
};
struct I2CTask {
I2CTaskType type;
// Параметры
int16_t value;
};
static QueueHandle_t i2cTaskQueue;Код инициализации
Вызовите это один раз перед использованием:
i2cTaskQueue = xQueueCreate(8 /* Количество слотов очереди */, sizeof(I2CTask));
freertos_i2c_queue_init.cpp
// Создать очередь задач
i2cTaskQueue = xQueueCreate(8 /* Количество слотов очереди */, sizeof(I2CTask));В потоке, обрабатывающем очередь
freertos_i2c_queue_receive.cpp
if (xQueueReceive(i2cTaskQueue, (void *)&task, portMAX_DELAY /* Ждать бесконечно новые задачи */) == pdTRUE) {
if(task.type == I2CTaskType::MyTaskType) {
// TODO обработать задачу
Serial.printf("My task type: %d\r\n", task.value);
}
}Как добавить задачу в очередь
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 /* таймаут */);
}
Check out similar posts by category:
C/C++ Встраиваемые системы FreeRTOS PlatformIO
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow