制造商提供的C代码中断设置

时间:2017-07-22 06:18:36

标签: c handler microcontroller interrupt isr

以下代码段来自制造商。我对他们想要做什么完全感到困惑。特别是与InterruptHandler有关。

请评论全局部分中的代码。这看起来不错吗?

此外,各种API都包含了我的观点。他们试图使用无效指针吗? ...很多问题,请主要评论他们如何建议timer2可以工作。

Kpi Name                 Jun     May    Apr
$Deposits                234     567    321

谢谢, 史蒂夫

编辑: 制造商代码包括一个例程(我似乎无法在此处添加它)来管理调用TMR2_ISR的高级中断if(PIE4bits.TMR2IE == 1&& PIR4bits.TMR2IF == 1)这似乎是否会否定任何TMR2_DefaultInterruptHandler?

再次感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

Garr Godfrey和Martin James的评论提供了有用的提示。因此,我将尽力填补可能的空白:

  1. void (*TMR2_InterruptHandler)(void);是一个全局变量,其函数指针提供当前的中断处理程序。

  2. 我会将TMR2_ISR()读作“中断服务例程”。从提供的代码中,不清楚它的调用位置。怀疑它的名字,假设在触发中断时调用它是合理的。它检查全局中断处理程序函数指针TMR2_InterruptHandler是否不是NULL,并在成功的情况下调用指向的函数。

  3. 如果之前已调用TMR2_Initialize(),则TMR2_InterruptHandler指向函数TMR2_DefaultInterruptHandler()。因此,在这种情况下,后者从TMR2_ISR()

  4. 调用
  5. void TMR2_SetInterruptHandler(void* InterruptHandler)用于TMR2_Initialize()。它设置当前的中断处理程序。 (惊喜。)
    我有点困惑,因为我会成功:
    void TMR2_SetInterruptHandler(void (*InterruptHandler)())
    这是因为我在C ++的日常工作中钻了我“干净的打字”,但我记得C对此更加松懈。 (void*与任何指针兼容。)

  6. 正如Garr Godfrey已经说过:“把你的代码放在TMR2_DefaultInterruptHandler”中
    评论建议的地方 // add your TMR2 interrupt custom code