This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] F29H850TU:如何使用 PIPE 模块中的 OVERRIDE_FLAG 再次触发相同的中断?

Guru**** 2553800 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1570654/f29h850tu-how-to-identify-when-the-same-interrupt-is-triggered-again-using-the-overflow_flag-in-pipe-module

器件型号:F29H850TU


工具/软件:

在 F29x 中、PIPE 模块与 F28x 目标中的 PIE 模块大不相同。

我知道这个问题中的讨论: F29H850TU:如何在 C29 内核架构中嵌套相同的中断(例如 INT_TIMER0)? - C2000 微控制器论坛 — C2000Tm︎ 微控制器 — TI E2E 支持论坛 表示不建议循环嵌套相同的中断。
我不是试图在内部嵌套相同的中断。
我只想在执行当前中断的 ISR 时检测是否触发了同一中断的另一个实例。

例如、INT_TIMER0 中断已配置为每 1 秒触发一次。
现在、假设与它对应的 ISR 需要超过 1 秒的时间来执行、并且在 ISR 完成之前、INT_TIMER0 会在 1 秒后再次触发

现在、如果发生这种情况、如何在当前中断 ISR 服务时检测是否发生了计时器中断的另一个实例?  

 INT_CTL_L_y 寄存器中该中断的 overflow_flag 位在 TRM 中似乎表明、只要触发了相同中断的另一个实例、它就会设置为 1、但我无法处理、因为它在第一个 ISR 调用本身中被设置、我无法理解为什么。
该处理器的 TRM 没有太多关于该标志位的使用说明、它似乎也依赖于同一寄存器的标志位、这并不是很清楚、正如我在 CCS 中看到、即使标志位保持为 0、overflow_flag 也设置为 1。  

总而言之、我的问题是:
overflow_flag 位是否可用于检测在执行当前计时器中断 ISR 时是否再次触发了相同的计时器中断?  
如果没有、是否有任何其他方法可以检测该情况、包括一些 CPU INT 栈位、或者以某种方法使用 INTSP 寄存器来检测此 ISR 任务溢出?



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sumukh,

    overflow_flag 的工作原理:

    当发生中断(如 INT_TIMER0)时、硬件会设置 INT_CTL_L_y 中的 FLAG 位
    2.如果在标志位仍被置位时发生同一中断的另一个实例、则会设置 OVERFLE_FLAG 位。
    3.当 CPU 确认中断时、通常会自动清除标志位。
    4.不过,必须用软件清除 overflow_flag。

    为何立即设置 overflow_flag:

    如果您在第一个 ISR 调用期间看到设置了 overflow_flag、则可能意味着出现以下任一情况:

    1.中断发生的频率很高(比 ISR 能够确认的速度快)。
    2.中断之间的标志位没有正确清除。
    3.可能存在初始化问题、即在启用中断之前未清除 overflow_flag。

    如何调试 overflow_flag:

    由于溢出位可能会为 Pended 之外的任何中断状态设置、因此 ISR 需要在清除此条件之前检查并处理底层溢出条件。 我建议  在 ISR 开始时设置一个全局标志/计数器(即 timerOverrunCount)、以跟踪执行 ISR 的次数并检查是否发生了超限情况。 您还可以查看基于 CPU 计时器中断的 SDK 示例、该示例实际上展示了这些概念。

    此致、

    Aishwarya