下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

内核
最新资讯
简化任何设备的身份验证云连接。
利用 CoAP 设计节能型云连接 IoT 解决方案。
11.0.0 版 FreeRTOS 内核简介:
FreeRTOS 路线图和代码贡献流程。
使用 FreeRTOS 实现 OPC-UA over TSN。

FreeRTOS 二进制信号量
[任务间通信和同步]

[另请参阅阻塞多个 RTOS 对象]

FreeRTOS 教程书籍 提供更多信息,包括队列、二进制信号量量、互斥锁、计数信号量、 递归信号量,以及包含在配套的示例项目中的简单示例。

FreeRTOS 二进制信号量

二进制信号量用于互斥和同步目的。

二进制信号量和互斥锁极为相似,但存在一些细微差别:互斥锁包括优先继承机制,而二进制信号量则不然 。这使得二进制信号器成为实现同步(任务之间或任务与中断之间) 的更好选择,而互斥锁则是实现简单互斥的更好选择。 关于互斥锁如何被用作互斥机制的描述 同样适用于二进制信号量。 本小节将仅对使用二进制信号量实现同步进行描述。

信号量 API 函数允许指定阻塞时间。 阻塞时间表示当一个任务试图“获取”信号量时, 如果信号不是立即可用,那么该任务进入阻塞状态的最大 “tick” 数。 如果 多个任务在同一个信号量上阻塞,那么具有最高优先级的任务将在下次信号量可用时最先解除阻塞 。

可将二进制信号量视为仅能容纳一个项目的队列。 因此,队列只能为空或满(因此称为二进制)。 使用队列的任务和中断 不在乎队列容纳的是什么——它们只想知道队列是空的还是满的。 可以 利用该机制来同步(例如)任务和中断。

考虑一个任务被用来 为一台外围设备提供服务的情况。 轮询外围设备将会耗费 CPU 资源,阻止执行其他任务。 因此 最好将大部分任务时间耗在阻塞状态(允许其他任务执行)中, 并且仅在实际上确有需要时再执行。 可以通过使用二进制信号量来实现,方法是“获取”信号量时使任务阻塞。 然后, 为外设写一个中断例程,当外设需要服务时,就“给”信号量。 任务 总是“接收”信号量(从队列中读取信号以使队列变空),但从不“给出”信号量。 中断总是“给出”信号量(写入 队列使其变满) ,但从不接收信号量。 xSemaphoreGiveFromISR() 文档页面上提供的源代码 可使这一点更清晰。 另请参阅 RTOS 任务通知 ,在某些情况下, 它可以作为二进制信号量的更快、更轻的替代品。

任务优先级可确保外围设备及时获得服务,进而有效生成“延迟中断”方案。(注意 FreeRTOS 还具有内置的延迟中断机制)。 另一种替代方法 是使用队列代替信号量。 完成此操作后,中断例程可以捕获外围设备事件的关联数据, 并通过队列将数据发送到任务。 队列数据可用时,任务将取消阻塞,从队列中检索数据, 然后执行必要的数据处理。 此第二种方案要求中断尽可能短,在一个任务中进行所有后置处理。

信号量相关 API 函数的列表,请参阅用户文档的信号量/互斥锁章节 。 请搜索 FreeRTOS/Demo/Common/Minimal 目录下的文件,您将会看到它们的多个用法示例。 请注意,中断仅可使用以“FromISR”结尾的 API 函数。


使用信号量同步任务与中断。 中断只“给出” 信号量,而任务只“接收”信号量。





Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.