[另请参阅阻塞多个 RTOS 对象]
FreeRTOS 教程书籍 提供更多信息,包括队列、二进制信号量量、互斥锁、计数信号量、 递归信号量,以及包含在配套的示例项目中的简单示例。
正如二进制信号量可以被认为是长度为 1 的队列那样,计数信号量也可以被认为是长度大于 1 的队列。 再次强调一下, 信号量的用户对存储在队列中的数据不感兴趣,他们只关心队列是否为空。
计数信号量通常用于两种情况:
在此使用方案中,每次事件发生时,事件处理程序将“给出”一个信号量(信号量计数值递增) ,并且 处理程序任务每次处理事件(信号量计数值递减)时“获取”一个信号量。因此,计数值是 已发生的事件数与已处理的事件数之间的差值。在这种情况下, 创建信号量时计数值可以为零。
在此使用情景中,计数值表示可用资源的数量。要获得对资源的控制权,任务必须首先获取 一个信号量——同时递减信号量计数值。当计数值达到零时,表示没有空闲资源可用。当任务使用完资源时, “返还”一个信号量——同时递增信号量计数值。在这种情况下, 创建信号量时计数值可以等于最大计数值。
信号量相关 API 函数的列表,请参阅用户文档的信号量/互斥锁章节 。 请搜索 FreeRTOS/Demo/Common/Minimal 目录下的文件,您将会看到它们的多个用法示例。 请注意,中断只能使用以 "FromISR" 结尾的 API 函数。