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