FreeRTOS -- 队列
0. 前言
队列是一种数据结构,可以保存固定大小的数据没在创建队列时,队列长度和大小就确定下来了
1. 队列
意义
原理
-
新数据被发送到队列尾部,从头部取出数据
-
新数据被发送到队列头部,从头部取出数据
xQueueSendToBack()
发送数据
xQueueReceive()
读取数据
运行过程中存在的情况
-
放数据速度快于取数据速度
结果,消息队列出现存放满的情况
消息存放函数
xQueueSend()
支持超时等待用户可以设置超时等待,直到有空间可以存放消息或者设置的超时时间溢出
队列可以有多个写入者,因此一个队列可能会被阻塞多个任务,以等待完成发送操作
这种情况下,当队列空间可用时,优先级最高的任务会被解除阻塞,从而向队列写数据
如果被阻塞的任务具有相同的优先级,那么等待时间最长的任务将被解除阻塞
-
放数据速度慢于取数据速度
结果,消息队列出现为空的情况
消息获取函数
xQueueReceive
支持超时等待用户可以设置超时等待,任务保持在阻塞状态,以等待队列中可用数据或者设置的超时时间溢出
如果多个任务都处于阻塞状态等待数据,那么一旦数据准备完毕,
优先级最高的任务先获得数据
优先级相同,等待时间最长的任务先获得数据
2. 队列函数
创建队列
QueueHandle_t xQueueCreate(uxQueueLength,uxItemSize)
申请内存
pxNewQueue = (Queue_t*)pvPortMalloc(sizeof(Queue_t) + xQueueSizeInBytes);