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 可能会导致使用该代码库时出现问题。
我们正在使用 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 可能会导致使用该代码库时出现问题。