FreeRTOS -- 队列

0. 前言

队列是一种数据结构,可以保存固定大小的数据没在创建队列时,队列长度和大小就确定下来了

1. 队列

意义

原理

  • 新数据被发送到队列尾部,从头部取出数据

  • 新数据被发送到队列头部,从头部取出数据

xQueueSendToBack() 发送数据
xQueueReceive() 读取数据

运行过程中存在的情况

  • 放数据速度快于取数据速度

    结果,消息队列出现存放满的情况

    消息存放函数 xQueueSend() 支持超时等待

    用户可以设置超时等待,直到有空间可以存放消息或者设置的超时时间溢出

    队列可以有多个写入者,因此一个队列可能会被阻塞多个任务,以等待完成发送操作

    这种情况下,当队列空间可用时,优先级最高的任务会被解除阻塞,从而向队列写数据

    如果被阻塞的任务具有相同的优先级,那么等待时间最长的任务将被解除阻塞

  • 放数据速度慢于取数据速度

    结果,消息队列出现为空的情况

    消息获取函数 xQueueReceive 支持超时等待

    用户可以设置超时等待,任务保持在阻塞状态,以等待队列中可用数据或者设置的超时时间溢出

    如果多个任务都处于阻塞状态等待数据,那么一旦数据准备完毕,

    优先级最高的任务先获得数据

    优先级相同,等待时间最长的任务先获得数据

2. 队列函数

创建队列
QueueHandle_t xQueueCreate(uxQueueLength,uxItemSize)

申请内存
pxNewQueue = (Queue_t*)pvPortMalloc(sizeof(Queue_t) + xQueueSizeInBytes);

posted @ 2022-08-09 18:53  伯宁君  阅读(565)  评论(0编辑  收藏  举报