FreeRTOS学习笔记(二) 队列管理

什么是队列

用于任务与任务之间, 中断与中断之间, 任务与中断中间通信的一种方式

队列本身也是一种FIFO的数据结构

使用起来也是如此, 通过xQueueSend()api函数将数据发送到队列中

可以选择是以拷贝的形式还是以指针的形式存放于队列中

将数据发送进队列的时候可以选择是发送到队首还是队尾

队列的读取总是从队首读取数据

为了处理多任务间通信的问题

可以用结构体来储存数据

结构体中标明该信息的来源及数据本身

还可以使用队列集(Queue Set)的方式

不过队列集相较于结构体更不直观且效率更差

因此官方更推荐在可选的情况下使用结构体的方式

说回队列集

队列集就是多个队列(或信号量)的集合

当处于队列集中的队列收到数据时, 该队列会将其句柄发送到队列集中, 此时队列集中就有数据了

通过xQueueSelectFromSet()函数传入队列集的句柄, 以此来返回队列集中存在的队列句柄

在实际使用时可以通过返回的句柄与现有的句柄进行比较

根据不同任务的数据选择不同的处理函数

还有一种叫做Mailbox的用法

在这里, Mailbox指的是队列长度为1的队列

Mailbox的意思是像邮一样只储存一个数据, 发送数据到该队列时直接覆写, 而不是等待被接收方读取并删除 对应api函数为xQueueOverwrite() 该函数只能用于队列长度为1的队列

接受时也不进行删除, 而是直接获得一份拷贝 相关api函数为xQueuePeek()

参考文档

Mastering-the-FreeRTOS-Real-Time-Kernel.v1.1.0 (Richard Barry -and- The FreeRTOS Team)