FreeRTOS为中断提供了丰富的API(),旨在保持中断服务例程尽量的短小。此时不再在中断服务程序中进行中断的处理,而是告知任务,此时需要某个任务进行中断服务例程的后续处理任务了。缩减中断服务程序出于如下的考虑:
- 一旦进入中断服务程序,即使最高优先级的任务都不能被执行
- 中断服务程序会打乱一个任务的开始、执行时间点
- 一旦进入中断,新的低优先级的中断将不能被响应,过长的中断服务例程会增加这个风险
- 如果中断处理都放到中断中进行,软件处理人员需要注意单片机的片上资源可能同时被任务/中断服务程序访问,比如变量、外设、内存缓冲区等
- 一些FreeRTOS允许中断嵌套,过长的中断服务程序增加了复杂度降低了程序执行可预测性
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
鉴于我们将中断发生的事件推迟到任务中进行处理,此时需要有一个机制来实现中断与任务的同步。
当事件发生,中断服务程序发送一个二值信号来解除阻塞中的处理任务。这个二值信号可以认为是由长度为1的队列实现。由于这个队列长度为1,因此它要么是空要么是满的状态。当一个中断事件发生,中断写入二值信号量,退出中断,处于阻塞的中断延迟处理任务将二值信号量取出,执行中断延迟服务程序,并在结束后进入下一次阻塞,等待这个二值信号量。
+++++++++++++++++