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.

[参考译文] TMS320F280025:Timer2 ISR 延迟。

Guru**** 2574645 points
Other Parts Discussed in Thread: TMS320F280025

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1560489/tms320f280025-timer2-isr-delayed

器件型号:TMS320F280025


工具/软件:

您好:

我正在处理 TMS320F280025 微控制器、C2000 v5.0.00.00 和安全诊断库 v4.01.00 的项目。
该系统基于两个中断:

  • Timer2(500ms 周期):在 ISR 内、CPUTIMER_TCR_TIF 根据线程中的需要清除:
    TMS320F280025:HWBIST 测试后的虚假中断 
  • ADC(具有 55µs 周期):每次发生 ISR 时、都会执行 STL_HWBIST_runMicro、直到 HWBIST 测试完成。 之后、闪存 ECC 测试将执行一定数量的周期、以运行可纠正和不可纠正的测试…μ s 然后、该循环从 HWBIST 测试重新启动。
  • 没有其他中断干扰正常运行、系统会正确调度。


我注意到、有时 timer2_ISR 的执行延迟的时间等于执行闪存测试的 ADC_ISR 周期数。 之后、STL_HWBIST_runMicro 的执行似乎会恢复正常操作。
这一问题似乎不会在两种不同的情况下发生、即:

  • CPUTIMER_TCR_TIF 不能由 timer2_ISR 清除(因此不能通过 HWBIST 测试清除、因为这意味着虚假计时器 2 中断)。
  • 与 IER、PIEIER12 和 EINT/DINT 相关的指令不会在 ADC_ISR 的 else 语句中执行。

提前感谢您的支持。

以下是代码:

__ interrupt void timer2_isr (void)

  //一些代码...

  //清除溢出标志—这是避免虚假中断的强制性操作
  //在 HWBIST 微运行执行之后。
  CPUTimer_clearOverflowFlag (CPUTIMER2_BASE);
}

中断无效 ADC_ISR (void)

  //一些代码...

  //确认中断组 1 以允许来自该组的进一步中断
  INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_GROUP1);

  if(条件==1)
  {
    //一些代码...

    //执行 HWBIST 微运行
    STL_HWBIST_runMicro ();

    //一些代码...
  }
  暴露
  {
    Uint16_t PIEIER_prev = HWREGH (PIECTRL_BASE + PIE_O_IER12);

    // IER:禁用除组 12 和 ERAD 之外的所有中断。
    IER &= INTERRUPT_CPU_INT12 | INTERRUPT_CPU_RTOSINT;

    // PIEIER12:禁用组 12 的所有中断
    //除了闪存可纠正的错误中断。
    HWREGH (PIECTRL_BASE + PIE_O_IER12)&= PIE_IER12_INTX11;

    //启用中断。
    EINT;

    //执行闪光自检。
    flash_selfest ();

    //禁用中断。
    DINT;

    //恢复中断寄存器。
    HWREGH (PIECTRL_BASE + PIE_O_IER12)= PIEIER_PREV;
  }
}

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

    您好、Andrea、

    谢谢您的提问、我会仔细研究一下、然后返回给您。

    此致、

    Delaney

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

    您好 Delaney、有任何更新吗?

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

    您好、Andrea、

    抱歉、我没能及时回答 E2E 主题。 请允许我直至本周结束来研究这个问题。

    此致、

    Delaney

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

    尊敬的 Delaney:

    有新消息吗?

    此致、
    Andrea

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

    您好、Andrea、

    抱歉、我仍然无法查看您的代码。 这些类型的问题通常需要我更长时间才能回答。 如果您对中断或 CPU 计时器模块有任何具体的概念问题、如果您想采用这种方法、我可能会更快回答。

    此致、

    Delaney

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

    您好、Andrea、

    很抱歉耽误你的时间。 我已经查看了您的设置并想确认、 CPU 计时器 2 ISR 嵌套在 ADC 中断内部是您的预期行为(如果在此期间进行了标记)吗? 请概述您的预期行为与您看到的内容。  

    请注意、您永远不想在 ISR 中编写不同组的 PIEIER。 这可能会导致意外行为。 因此、您不想写入 ADC ISR 内部的 PIEIER12(从组 1 中)。  请参阅下面的警告:

    根据您的当前代码、预计 CPU 计时器 2 中断不会嵌套在 ADC ISR 中、因为 TIMER2 位于组 14 中、并且尚未为该组启用嵌套。 请告诉我您尝试执行哪种嵌套、启用了哪些中断、我可以提供一些建议。  

    此致、

    Delaney

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

    尊敬的 Delaney:

    这是预期行为:
    -在 ADC ISR 执行期间,如果要运行闪存 ECC 测试,只嵌套 PIE_IER12_INTX11 和 INTERRUPT_CPU_RTOSINT。
    -如果 Timer2 在 ADC ISR(或之前的嵌套 ISR )期间被标记,则必须推迟 Timer2 ISR 的执行,直到 ADC ISR(以及任何嵌套 ISR )完成。

    有时、我可以看到 Timer2 ISR 已标记、但不会针对执行闪存 ECC 测试的任何后续 ADC 事件执行、直到 HWBIST 微运行执行解锁 Timer2 ISR。

    此致、

    Andrea

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

    您好、Andrea、

    我看到、因此您不希望嵌套计时器 2 ISR、而只是在 ADC ISR 和任何嵌套 ISR 完成后发生。 我会更详细地查看您的代码、然后返回给您。

    此致、

    Delaney

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

    您好、Andrea、

    为了确保我理解正确、下面是所需行为的示例:

    1. ADC ISR x - HWBIST 代码(条件== 1)
    2. ADC ISR x+1 — 闪存 ECC 代码(条件!= 1)
      1. 嵌套 INTERRUPT_CPU_RTOSINT  
      2. 在此期间标记 TIMER2
    3. TIMER2 ISR
    4. ADC ISR x+2 — 闪存 ECC 代码(条件!= 1)
    5. ADC ISR x+3 — 闪存 ECC 代码(条件!= 1)

    VS。您看到的内容:

    1. ADC ISR x - HWBIST 代码(条件== 1)
    2. ADC ISR x+1 — 闪存 ECC 代码(条件!= 1)
      1. 嵌套  INTERRUPT_CPU_RTOSINT  
      2. 在此期间标记 TIMER2
    3. ADC ISR x+2 — 闪存 ECC 代码(条件!= 1)
    4. ADC ISR x+3 — 闪存 ECC 代码(条件!= 1)
    5. TIMER2 ISR  

    如果这是正确的、那么我的问题是:在最大情况下、ADC ISR 会嵌套多长时间(多少个周期)-其他两个中断都嵌套在其中? 这是否超过 55us((100MHz SYSCLK 为 5500 个周期)? 如果另一个 ADC ISR 中断在原始 ADC ISR 结束之前出现、则第二个 ADC ISR 将优先、因为它位于 PIE 的组 1 中、TIMER2 是 14 组、并且将首先由 CPU 提供服务。 PIE 不会跟踪中断的进入顺序、只要中断传播到 CPU、PIE 就会检查哪个中断具有已启用和已标记的最高优先级、并指示 CPU 跳转到该 ISR。

    此致、

    Delaney

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

    尊敬的 Delaney:

    所需的 行为是正确的、我看到的是:

    1. ADC ISR x - HWBIST 代码(条件== 1)
    2. ADC ISR x+1 — 闪存 ECC 代码(条件!= 1)
      1. 嵌套  INTERRUPT_CPU_RTOSINT  
      2. 在此期间标记 TIMER2
    3. 此处应该会发生 TIMER2 ISR、但实际不会发生。
    4. ADC ISR x+2 — 闪存 ECC 代码(条件!= 1)
    5. ADC ISR x+3 — 闪存 ECC 代码(条件!= 1)
    6. ...执行了大约 500 ADC ISR...
    7. ADC ISR x+n - HWBIST 代码(条件== 1)为了“解锁“TIMER2 ISR、必须执行此操作
    8. TIMER2 ISR (此处不应发生这种情况)  


    在最坏的情况下、ADC ISR 加上所有嵌套中断都不超过 43us、我们已经验证了没有时序问题、也没有未成功实现的中断。

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

    您好、Andrea、

    谢谢您的澄清。  

    请注意、您永远不想在 ISR 中编写另一个组的 PIEIER。 这可能会导致意外行为。 因此、您不想写入 ADC ISR(从组 1 开始)内的 PIEIER12

    您是否尝试过删除以下代码行并查看问题是否仍然存在?  

            // PIEIER12: disable all interrupt of group 12
            // except the flash correctable error interrupt.
            HWREGH(PIECTRL_BASE + PIE_O_IER12) &= PIE_IER12_INTX11;

    ...

            // Restore interrupts registers.
            HWREGH(PIECTRL_BASE + PIE_O_IER12) = pieier_prev;

    此致、

    Delaney

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

    尊敬的 Delaney:

    是的、我已尝试删除这些行、但问题仍然存在。

    此致、

    Andrea

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

    您好、Andrea、

    您能尝试在的末尾添加一项检查吗  ADC ISR x+1 — 闪存 ECC 代码(条件!= 1) 这会读取 CPU 计时器寄存器以验证此时是否实际设置了标志、并检查组 14 的 IER 位的状态以确保其已启用?  flash_selfest() 函数中是否有任何可能禁用此 IER 位的代码?

    此致、

    Delaney