Так створюється і використовується черга завдань у 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
Якщо ця стаття допомогла вам, будь ласка, подумайте про те, щоб купити мені каву або зробити пожертву через PayPal на підтримку досліджень та публікації нових статей на TechOverflow