FreeRTOS中的任务之间会通信以实现某些功能,通信功能是基于队列实现的。队列可以保存有限个确定长度(称为深度)的数据的单元,通常队列作为FIFO使用
队列可以被多个任务写入(经常)和读出(少见),
任务读取队列超时,任务保持阻塞,等待队列有效数据的出现。多个任务处于阻塞等待队列有效数据时,只有最高优先级任务被解除阻塞。
任务写入队列超时,则不再写入。和读取一样,多个任务阻塞等待写入队列,只有最高优先级任务会被准许写入。
1.如何创建一个队列
xQueueCreate() API
函数队列由声明为xQueueHandle 的变量进行引用。xQueueCreate()用于创建一个队列,并返回一个xQueueHandle 句柄以便于对其创建的队列进行引用。
FreeRTOS创建队列从堆空间中分配空间,堆内存不够时返回NULL。
xQueueSendToBack() 与 xQueueSendToFront() API 函数
xQueueSendToBack()用于将数据发送到队列
尾;而xQueueSendToFront()用于将数据发送到队列首。
xQueueReceive()与xQueuePeek() API 函数
xQueueReceive()用于从队列中接收(读取)数据单元。接收到的单元同时会从队列中删除。
xQueuePeek()也是从从队列中接收数据单元,不同的是并不从队列中删出接收到的单元。xQueuePeek()从队列首接收到数据后,不会修改队列中的数据,也不会改变数据在队列中的存储序顺。
uxQueueMessagesWaiting() API 函数
uxQueueMessagesWaiting()用于查询队列中当前有效数据单元个数。
可以用队列传递复合数据类型
一个简单的方式就是结构体,
2.队列如何管理其数据
写一般有较高优先级,写满队列之后,写入任务进入阻塞态,而后最低优先级读任务开始,读出队列数据之后,队列清空。写任务检测到队列清空,又开始写入。
3.如何向队列发送数据
正常发送
4.如何从队列接收数据
正常接收
5.队列阻塞是什么意思
暂时让CPU进行优先级更高的任务
6.往队列发送和从队列接收时,任务优先级会有什么样的影响
发送给队列的优先级一般比接受队列信息的优先级更高。
7.如果工作于大型主数据单元
最好用队列来传递数据的指针,而不是完整的数据。
指针指向的内存空间必须有效。及时释放。
原文:https://www.cnblogs.com/easterncabbage/p/13442940.html