任务通信过程中,如果消息类型不同,使用一条队列来实现则有些麻烦。
FreeRTOS 提供队列集合,用于对多个队列以及信号量进行“监听”,只要其中不管哪一个有消息到来,都可以让任务退出阻塞状态。这就类似于linux网络编程时的select(IO复用)。
先看一下队列结构体
多了一个pxQueueSetContainer成员变量,队列所属队列集。
在插入队列项的时候,用于查找队列所属的队列集并通知正在监听该队列集的任务。
/* 队列结构体 */
typedef struct QueueDefinition
{
int8_t *pcHead; /* 队列存储区头部,即第一个队列项 */
int8_t *pcWriteTo; /* 队列项插入指针 */
union
{
QueuePointers_t xQueue; /* 队列 */
SemaphoreData_t xSemaphore; /* 信号量 */
}u;
List_t xTasksWaitingToSend; /* 等待发送队列项而阻塞的任务列表 */
List_t xTasksWaitingToReceive; /* 等待接收队列项而阻塞的任务列表 */
volatile UBaseType_t uxMessagesWaiting; /* 已经插入队列项个数 */
UBaseType_t uxLength; /* 队列项存储区最多队列项个数 */
UBaseType_