Мінімальний приклад черги завдань FreeRTOS

Так створюється і використовується черга завдань у 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("Мій тип завдання: %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 /* час очікування */);
}

Дивіться схожі статті за категоріями: C/C++ Вбудовані системи FreeRTOS PlatformIO