【文件属性】:
文件名称:计数信号量-金蝶云·苍穹混合云部署手册_v1.0
文件大小:2.37MB
文件格式:PDF
更新时间:2021-06-24 04:26:29
FreeRTOS 内核 MCU IOT 嵌入式
3.3 计数信号量
例 12 演示了一个二值信号量被用于让任务和中断进行同步。整个执行流程可以描
述为:
1. 中断产生。
2. 中断服务例程启动,给出信号量以使延迟处理任务解除阻塞。
3. 当中断服务例程退出时,延迟处理任务得到执行。延迟处理任务做的第一件事便是
获取信号量。
4. 延迟处理任务完成中断事件处理后,试图再次获取信号量——如果此时信号量无效,
任务将切入阻塞待等待事件发生。
在中断以相对较慢的频率发生的情况下,上面描述的流程是足够而完美的。如果在
延迟处理任务完成上一个中断事件的处理之前,新的中断事件又发生了,等效于将新的
事件锁存在二值信号量中,使得延迟处理任务在处理完上一个事件之后,立即就可以处
理新的事件。也就是说,延迟处理任务在两次事件处理之间,不会有进入阻塞态的机会,
因为信号量中锁存有一个事件,所以当 xSempaphoreTake()调用时,信号量立即有效。
这种情形将在图 30 中进行展现。
在图 30 中可以看到,一个二值信号量 多只可以锁存一个中断事件。在锁存的事
件还未被处理之前,如果还有中断事件发生,那么后续发生的中断事件将会丢失。如果
用计数信号量代替二值信号量,那么,这种丢中断的情形将可以避免。
就如同我们可以把二值信号量看作是只有一个数据单元的队列一样,计数信号量可
以看作是深度大于 1 的队列。任务其实对队列中存储的具体数据并不感兴趣——其只关
心队列是空还是非空。
计数信号量每次被给出(Given),其队列中的另一个空间将会被使用。队列中的有
效数据单元个数就是信号量的”计数(Count)”值。