队列是FreeRTOS主要的任务间通讯方式,包括二进制信号量、计数信号量、互斥量和递归互斥量都是使用队列来实现的。
先看一下,队列的数据结构
/* 队列结构体 */
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_t uxItemSize; /* 每个队列项的大小 */
volatile int8_t cRxLock; /* 锁定期间,从队列中接收队列项的次数 */
volatile int8_t cTxLock; /* 锁定期间,向队列中发送队列项的次数 */
#if ((configSUPPORT_STATIC_ALLOCATION == 1) && (configSUPPORT_DYNAMIC_ALLOCATION == 1))
uint8_t ucStaticallyAllocated;
#endif
#if (configUSE_QUEUE_SETS == 1)
struct QueueDefinition *pxQueueSetContainer;
#endif
#if (configUSE_T