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;
}