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 如果不存在这样的队列或信号量。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
移植FreeRTOS标准库函数到STM32F103C8T6可以按照以下步骤进行操作: 1. 首先,下载正点原子提供的FreeRTOS V9.0版的程序和HAL库函数FreeRTOS V10.4.6版的程序。 2. 打开战舰资料中的FreeRTOS例程,路径为【正点原子】战舰STM32F103开发板V4 资料盘(A盘)\4,程序源码\3,扩展例程\2,FreeRTOS例程\FreeRTOS实验例程2 FreeRTOS移植实验\Middlewares\FreeRTOS。 3. 将战舰STM32F103开发板V4 资料盘(A盘)\4,程序源码\3,扩展例程\2,FreeRTOS例程\FreeRTOS实验例程2 FreeRTOS移植实验\User文件夹中的freertos_demo.c、freertos_demo.h、FreeRTOSConfig.h这三个文件复制到你的工程的USER文件夹中。 4. 打开正点原子提供的HAL库函数FreeRTOS V10.4.6版的程序,将其中的FreeRTOS相关代码直接拷贝到你的标准库函数的工程中,替换原有的FreeRTOS相关代码。 通过以上步骤,你就可以将FreeRTOS V10.4.6版移植到标准库函数中,实现在STM32F103C8T6上使用FreeRTOS标准库函数的功能。请注意,移植过程中可能需要根据你的具体需求进行一些适配和修改。 #### 引用[.reference_title] - *1* *2* *3* [STM32系列单片机标准库移植FreeRTOS V10.4.6详解](https://blog.csdn.net/qq_20222919/article/details/128589414)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值