【问题标题】:What is the difference between IRQ Handler and Callback function?IRQ Handler 和 Callback 函数有什么区别?
【发布时间】:2020-06-18 02:49:19
【问题描述】:

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

HAL_TIM_Base_Start_IT(&htim5);

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

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

【问题讨论】:

  • 标题中的问题是通用的,而正文是指特定情况。您实际上需要回答哪些问题?
  • “调用 TIM5_IRQHandler”是什么意思?您不应该“调用”中断处理程序。中断向量表应设置为指向中断处理程序,以便在中断发生时运行中断处理程序。在 STM32Cube 系统中,通用中断处理程序调用回调函数。您可以选择使用特定于应用程序的东西来实现回调函数。

标签: embedded interrupt stm32f4


【解决方案1】:

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

HAL_TIM_PeriodElapsedCallback() 具有“弱链接”,这意味着定义了一个无操作默认值,您可以通过定义自己的实现来覆盖它。

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

在绝对确定性行为和最短中断时间至关重要的情况下,您可能希望避免使用这种“为舒适而构建”的基础设施并直接处理定时器中断。一般来说,这也会带来更好的设计(更低的耦合/更大的内聚)。

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

【讨论】:

  • 所以我们应该直接调用TIM5_IRQHandler()而不是调用PeriodElapsedCallBack()?或者我们应该实现我们的计时器功能以更好地利用解决方案?
  • @TürkerBerkeYıldırım 这将是一个如此偏离主题的意见问题。我的回答旨在至少提出一个明智的意见。我想说,如果您致力于使用 HAL 的解决方案,阻力最小的路径就是以预期的方式使用它。就我个人而言,我认为整个 ST Cube/HAL 是一个设计糟糕且不匹配的英国媒体报道软件集合,旨在将您锁定在 ST 的部件中,并要求您使用比您原本需要的更大、更快、更昂贵的部件。但这只是一种意见。
  • 我明白了,先生,我们理解您的回答。非常感谢 :) 另外,我认为我们应该学习实现我们的 Timer 驱动程序。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-08-21
    • 2015-07-26
    • 2019-10-29
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多