FreeRTOS 队列

← 返回 FreeRTOS | ← 主页


OSAL源码

文件作用
osal_queue.h公开接口
osal_internal_queue.hWrapper与适配层接口
osal_queue.c参数检查与封装
os_impl_queue.cFreeRTOS实现

1. 定义队列深度

Config/rtos_config.h

#define CFG_QUEUE_SENSOR_DEPTH 8U

2. 添加队列配置

App/app_init/user_task_config/user_task_reso_config.h

typedef enum
{
    QUEUE_IDX_SENSOR = 0,
    QUEUE_IDX_MAX
} user_queue_idx_t;
 
typedef struct
{
    size_t depth;
    size_t item_size;
    osal_queue_handle_t handle;
} user_queue_config_t;
user_queue_config_t user_queues[QUEUE_IDX_MAX] =
{
    {CFG_QUEUE_SENSOR_DEPTH, sizeof(sensor_data_t), NULL},
};

3. 创建队列

App/app_init/user_task_config/user_task_reso_config.c

osal_queue_create(user_queues[QUEUE_IDX_SENSOR].depth,
                  user_queues[QUEUE_IDX_SENSOR].item_size,
                  &user_queues[QUEUE_IDX_SENSOR].handle);

4. 发送与接收

要使用的地方

osal_queue_send(user_queues[QUEUE_IDX_SENSOR].handle,
                &sensor_data, 0U);
 
osal_queue_receive(user_queues[QUEUE_IDX_SENSOR].handle,
                   &sensor_data, OSAL_WAIT_FOREVER);

查看但不移除队首数据使用 osal_queue_peek();获取当前消息数使用 osal_queue_messages_waiting()。

5. 删除

要删除的地方

osal_queue_delete(user_queues[QUEUE_IDX_SENSOR].handle);
user_queues[QUEUE_IDX_SENSOR].handle = NULL;