标准 ISR 处理通常包括记录中断的原因,清除中断, 然后执行中断所需的任何处理, 所有这些都在 ISR 中进行。
延迟中断处理通常包括记录中断的原因, 并在 ISR 中清除中断, 但随后解除 RTOS 任务的阻塞, 因此中断所需的处理可以由解除阻塞的任务执行,而不是在 ISR 中执行。
如果中断处理被延迟的任务被分配了足够高的优先级, 那么 ISR 将直接返回到未被阻塞的任务 (中断将中断一个任务,但随后返回到另一个任务), 结果是中断所需的所有处理在时间上 被连续执行(没有间隙), 就像所有处理都在 ISR 本身中执行一样。 可以在下图中看到这一点, 所有中断处理都发生在时间 t2 和 t4 之间, 尽管部分处理是由一个任务执行的。
参照上述图片:
大多数嵌入式工程师会努力减少在 ISR 中花费的时间 (以尽量减少系统中的抖动,使其他相同或更低优先级的中断得以执行, 最大限度地提高中断响应性等等), 而将中断处理延迟到任务的技术提供了实现这一目标的方便方法 。 但是,首先解除阻塞, 然后切换到 RTOS 任务本身需要有限的时间,所以通常情况下, 只有当处理满足以下条件时,应用程序才能从延迟中断处理中受益:
集中式延时中断处理之所以被称为集中式延时中断处理, 是因为使用这种方法的每个中断都是在同一个 RTOS 守护进程任务的上下文中执行的 。 RTOS 守护进程任务由 FreeRTOS 创建, 也被称为定时服务 任务。
要将中断处理延迟到 RTOS 守护进程任务, 需在调用 xTimerPendFunctionCallFromISR() API 函数调用 API 函数时,传递一个指向中断处理函数的指针作为 xFunctionToPend 的参数。 请参阅 xTimerPendFunctionCallFromISR () 文档页面以获取有效示例 。
集中式延迟中断处理的优点包括最低限度的资源使用, 这是因为每个延迟中断处理程序均使用相同的任务。
集中式延迟中断处理的缺点包括:
应用程序控制延迟中断处理之所以被称为应用程序控制延迟中断处理, 是因为使用这种方法的每个中断都是在应用程序写入器创建的任务的上下文中执行的 。 请参阅 使用 RTOS 作为轻量级计数信号量 文档页面以获取有效示例。
应用程序控制延迟中断处理的优点包括:
应用控制延迟中断处理的缺点包括 更多的资源消耗,因为通常需要更多的任务。