IRQ 处理程序和回调函数有什么区别?

What is the difference between IRQ Handler and Callback function?

我们正在使用 STM32F429I 并尝试通过不同的方式使用定时器(TIM2 和 TIM5)。 在我们启用定时器并调用之后的代码中;

HAL_TIM_Base_Start_IT(&htim5);

我们可以通过调用 TIM5_IRQHandler 函数来更新我们的变量。 我们注意到 HAL_TIM_PeriodElapsedCallback 函数完成了相同的过程。

所以我们的问题是:这两个函数有什么区别吗?

是的,它们之间存在差异。 TIM5_IRQHandler() 处理由 htim5 触发的所有中断。例如,对于这些不同的定时器事件,有诸如半完成、PWM 脉冲完成、定时器错误回调等回调。

在 STM32Cube 框架中,TIM5_IRQHandler() 调用 HAL_TIM_IRQHandler(),后者调用 HAL_TIM_PeriodElapsedCallback()(以及许多其他事件回调)。

HAL_TIM_PeriodElapsedCallback() 有 "weak-linkage",这意味着定义了一个什么都不做的默认值,您可以通过定义自己的实现来覆盖它。

以这种方式使用 HAL 的一个缺点是它增加了中断处理程序的开销,并且因为对所有计时器调用相同的 HAL_TIM_PeriodElapsedCallback(),所以需要额外的代码来确定哪个计时器调用了回调,如果你要处理多个计时器。当此类计时器用于完全不同的目的时,从 low-coupling/high-cohesion 的角度来看,这可能会导致设计不佳。

在绝对确定性行为和最小中断时间至关重要的情况下,您可能希望避免这种 "built-for-comfort" 基础结构并直接处理定时器中断。一般来说,这也会带来更好的设计(更低的 coupling/greater 内聚力)。

如果您广泛使用 STM32Cube 和 CMSIS 框架和中间件,那么绕过 HAL 可能会导致使用该代码库时出现问题。