15.队列集-2.相关API函数

在这里插入图片描述

1. 函数 xQueueCreateSet()

此函数用于创建队列集,该函数在 queue.c 文件中有定义,函数的原型如下所示:

QueueSetHandle_t xQueueCreateSet(const UBaseType_t uxEventQueueLength);

在这里插入图片描述

QueueSetHandle_t xQueueCreateSet(const UBaseType_t uxEventQueueLength)
{
 QueueSetHandle_t pxQueue;
 
 /* 创建一个队列作为队列集
 * 队列长度为队列集可容纳的队列数量
 * 队列项目的大小为队列控制块的大小
 * 队列的类型为队列集
 */
 pxQueue = xQueueGenericCreate( uxEventQueueLength,
 ( UBaseType_t ) sizeof( Queue_t * ),
 queueQUEUE_TYPE_SET );
 
 return pxQueue;
}

2. 函数 xQueueAddToSet()

此函数用于往队列集中添加队列,要注意的时,队列在被添加到队列集之前,队列中不能
有有效的消息,该函数在 queue.c 文件中有定义,函数的原型如下所示:

BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore,
 QueueSetHandle_t xQueueSet);

在这里插入图片描述
函数 xQueueAddToSet()的具体代码如下所示:

BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore,
QueueSetHandle_t xQueueSet)
{
 BaseType_t xReturn;
 
 /* 进入临界区 */
 taskENTER_CRITICAL();
 {
 if( ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer != NULL )
 {
 xReturn = pdFAIL;
 }
 /* 队列中要求没有有效消息 */
 else if( ( ( Queue_t * ) xQueueOrSemaphore )->uxMessagesWaiting !=
 ( UBaseType_t ) 0 )
 {
 xReturn = pdFAIL;
 }
 else
 {
 /* 将队列所在队列集设为队列集 */
 ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer =
 xQueueSet;
 xReturn = pdPASS;
 }
 }
 /* 退出临界区 */
 taskEXIT_CRITICAL();
 
 return xReturn;
}

3. 函数 xQueueRemoveFromSet()

此函数用于从队列集中移除队列,要注意的时,队列在从队列集移除之前,必须没有有效
的消息,该函数在 queue.c 文件中有定义,函数的原型如下所示:

BaseType_t xQueueRemoveFromSet(QueueSetMemberHandle_t xQueueOrSemaphore,
 QueueSetHandle_t xQueueSet);

在这里插入图片描述
在这里插入图片描述
函数 xQueueRemoveFromSet()的具体代码如下所示:

BaseType_t xQueueRemoveFromSet(QueueSetMemberHandle_t xQueueOrSemaphore,
 QueueSetHandle_t xQueueSet)
{
 BaseType_t xReturn;
 Queue_t * const pxQueueOrSemaphore = ( Queue_t * ) xQueueOrSemaphore;
 
 /* 队列需在队列集中,才能移除 */
 if( pxQueueOrSemaphore->pxQueueSetContainer != xQueueSet )
 {
 xReturn = pdFAIL;
 }
 /* 队列中没有有效消息时,才能移除 */
 else if( pxQueueOrSemaphore->uxMessagesWaiting != ( UBaseType_t ) 0 )
 {
 xReturn = pdFAIL;
 }
 else
 {
 /* 进入临界区 */
 taskENTER_CRITICAL();
 {
 /* 将队列所在队列集设为空 */
 pxQueueOrSemaphore->pxQueueSetContainer = NULL;
 }
 /* 退出临界区 */
 taskEXIT_CRITICAL();
 xReturn = pdPASS;
 }
 
 return xReturn;
}

4. 函数 xQueueSelectFromSet()

此函数用于在任务中获取队列集中有有效消息的队列,该函数在 queue.c 文件中有定义,函
数的原型如下所示:

QueueSetMemberHandle_t xQueueSelectFromSet(
 QueueSetHandle_t xQueueSet,
 TickType_t const xTicksToWait);

在这里插入图片描述
在这里插入图片描述
函数 xQueueSelectFromSet()的具体代码如下所示:

QueueSetMemberHandle_t xQueueSelectFromSet(
 QueueSetHandle_t xQueueSet,
 TickType_t const xTicksToWait)
{
 QueueSetMemberHandle_t xReturn = NULL;
 
 /* 读取队列集的消息
 * 读取到的消息,
 * 即为队列集中有空闲消息的队列
 */
 ( void ) xQueueReceive( ( QueueHandle_t ) xQueueSet,
 &xReturn,
 xTicksToWait);
 return xReturn;
}

5. 函数 xQueueSelectFromSetFromISR()

此函数用于在中断中获取队列集中有有效消息的队列,该函数在 queue.c 文件中有定义,函
数的原型如下所示:

QueueSetMemberHandle_t xQueueSelectFromSetFromISR(
 QueueSetHandle_t xQueueSet );

在这里插入图片描述

QueueSetMemberHandle_t xQueueSelectFromSetFromISR(
 QueueSetHandle_t xQueueSet )
{
 QueueSetMemberHandle_t xReturn = NULL;
 /* 在中断中读取队列集的消息
 * 读取到的消息,
 * 即为队列集中有空闲消息的队列
 */
 ( void ) xQueueReceiveFromISR( ( QueueHandle_t ) xQueueSet,
 &xReturn,
 NULL);
 return xReturn;
}
上一篇:状态模式(行为型)