FreeRTOS api库函数之Queue Sets(队列集)

xQueueCreateSet()
QueueSetHandle_t xQueueCreateSet(const UBaseType_t uxEventQueueLength);

在FreeRTOSConfig.h中,必须将configUSE_QUEUE_SETS设置为1才能使xQueueCreateSet()API函数可用。
队列集提供了一种机制,允许RTOS任务同时阻止(挂起)来自多个RTOS队列或信号量的读取操作。请注意,使用队列集有更简单的替代方法。
必须先使用对xQueueCreateSet()的调用显式创建队列集,然后才能使用它。创建后,可以使用对xQueueAddToSet()的调用将标准FreeRTOS队列和信号量添加到集合中。然后使用xQueueSelectFromSet()来确定集合中包含的队列或信号量中的哪一个(如果有)处于队列读取或信号量获取操作成功的状态。
注意:
    将队列和信号量添加到队列集时,它们必须为空。添加诸如二进制信号量之类的对象时要特别小心,这些对象是使用已经可用的信号量创建的[如果使用vSemaphoreCreateBinary()宏创建信号量就是这种情况,但如果使用首选xSemaphoreCreateBinary()创建信号量则不是这种情况功能]。
    阻止包含互斥锁的队列集不会导致互斥锁持有者继承被阻止任务的优先级。
    添加到队列集的每个队列中的每个空间都需要额外的4个字节的RAM。因此,不应将具有高最大计数值的计数信号量添加到队列集。
    除非对xQueueSelectFromSet()的调用首先返回该set成员的句柄,否则不得对队列集的成员执行接收(在队列的情况下)或take(在信号量的情况下)操作。
参数:
    uxEventQueueLength 队列设置存储在集合中包含的队列和信号量上的事件。 uxEventQueueLength指定一次可以排队的最大事件数。
    为了绝对确定事件没有丢失,必须将uxEventQueueLength设置为添加到集合的队列长度的总和,其中二进制信号量和互斥量的长度为1,计数信号量的长度由其最大计数值设置。例如:
        如果队列集要保存长度为5的队列,另一个长度为12的队列和一个二进制信号量,则uxEventQueueLength应设置为(5 + 12 + 1)或18。
        如果队列集要保存三个二进制信号量,则uxEventQueueLength应设置为(1 + 1 + 1)或3。
        如果队列集要保存最大计数为5的计数信号量,以及最大计数为3的计数信号量,则uxEventQueueLength应设置为(5 + 3)或8。
返回:
    如果成功创建了队列集,则返回创建的队列集的句柄。否则返回NULL。

xQueueAddToSet()
BaseType_t xQueueAddToSet(QueueSetMemberHandle_t xQueueOrSemaphore,QueueSetHandle_t xQueueSet);

在FreeRTOSConfig.h中,必须将configUSE_QUEUE_SETS设置为1才能使xQueueAddToSet()API函数可用。
将RTOS队列或信号量添加到先前通过调用xQueueCreateSet()创建的队列集。
除非对xQueueSelectFromSet()的调用首先返回该set成员的句柄,否则不得对队列集的成员执行接收(在队列的情况下)或take(在信号量的情况下)操作。
参数:
    xQueueOrSemaphore 要添加到队列集的队列或信号量的句柄(强制转换为QueueSetMemberHandle_t类型)。
    xQueueSet 要添加队列或信号量的队列集的句柄。
返回:
    如果队列或信号量已成功添加到队列集,则返回pdPASS。如果队列无法成功添加到队列集,因为它已经是不同队列集的成员,则返回pdFAIL。

xQueueRemoveFromSet()
BaseType_t xQueueRemoveFromSet(QueueSetMemberHandle_t xQueueOrSemaphore,QueueSetHandle_t xQueueSet);

在FreeRTOSConfig.h中,必须将configUSE_QUEUE_SETS设置为1才能使xQueueRemoveFromSet()API函数可用。
从队列集中删除RTOS队列或信号量。
如果队列或信号量为空,则只能从队列集中删除RTOS队列或信号量。
参数:
     xQueueOrSemaphore 从队列集中删除的队列或信号量的句柄(强制转换为QueueSetMemberHandle_t类型)。
     xQueueSet 包含队列或信号量的队列集的句柄。
返回:
     如果从队列集中成功删除了队列或信号量,则返回pdPASS。 如果队列不在队列集中,或者队列(或信号量)不为空,则返回pdFAIL。

xQueueSelectFromSet()
QueueSetMemberHandle_t xQueueSelectFromSet(QueueSetHandle_t xQueueSet,const TickType_t xTicksToWait);

在FreeRTOSConfig.h中,必须将configUSE_QUEUE_SETS设置为1才能使xQueueSelectFromSet()API函数可用。
xQueueSelectFromSet()从队列成员中选择一个队列或信号量,该队列或信号量包含数据(在队列的情况下)或可用于(在信号量的情况下)。 xQueueSelectFromSet()有效地允许任务同时阻塞(挂起)队列集中所有队列和信号量的读操作。
笔记:
    使用队列集有更简单的替代方法。
    阻止包含互斥锁的队列集不会导致互斥锁持有者继承被阻止任务的优先级。
    除非对xQueueSelectFromSet()的调用首先返回该set成员的句柄,否则不得对队列集的成员执行接收(在队列的情况下)或take(在信号量的情况下)操作。
参数:
    xQueueSet 任务将(可能)阻止的队列集。
    xTicksToWait 调用任务将保持在阻塞状态(其他任务正在执行)的最长时间(以时钟周期为单位),以等待队列集的成员为成功的队列读取或信号量执行操作做好准备。
返回:
    xQueueSelectFromSet()将返回包含在包含数据的队列集中的队列句柄(强制转换为QueueSetMemberHandle_t类型),或者返回包含在可用队列集中的信号量句柄(强制转换为QueueSetMemberHandle_t类型),或者为NULL如果在指定的块时间到期之前没有这样的队列或信号量。

xQueueSelectFromSetFromISR()
QueueSetMemberHandle_t xQueueSelectFromSetFromISR(QueueSetHandle_t xQueueSet);

在FreeRTOSConfig.h中,必须将configUSE_QUEUE_SETS设置为1才能使xQueueSelectFromSetFromISR()API函数可用。
可以从中断服务例程(ISR)使用的xQueueSelectFromSet()版本。
参数:
     xQueueSet正在查询的队列集。 由于此功能旨在用于中断,因此无法阻止读取。
返回:
     xQueueSelectFromSetFromISR()将返回包含数据的队列集中包含的队列句柄(强制转换为QueueSetMemberHandle_t类型),或者返回包含在可用队列集中的信号量句柄(强制转换为QueueSetMemberHandle_t类型),或者为NULL 如果不存在这样的队列或信号量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值