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.

[参考译文] TMS320F28388D:响应 NMI 中断的延迟

Guru**** 2589265 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1110390/tms320f28388d-delay-in-responding-to-nmi-interrupt

器件型号:TMS320F28388D

尊敬的 Vince:

因此、我将 CPU2闪存设为空、并且在 CPU1程序中、我将尝试通过 IPC 引导 CPU2、这会导致 NmiIntruptRegs.NMIFLG.bit.CPU2WDRSn 被设置并导致 NMI_ISR。 我已经尝试使用#pragma 将此 ISR 保留在闪存和 LS RAM 存储器中。 但是、在这两种情况下、设置标志和调用 ISR 所需的时间均为13msec。 在这种情况下是否预计会出现这种延迟?

此致、

艾琳

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

    您好、Irene、

    虽然仍然存在预期的延迟(通常为14个周期的绝对最小值)、但13ms 相当高。 健全性检查的两个方面:

    1.您在 CCS 中是否处于"调试"模式? 如果是这样、与自由运行代码相比、理论上可能会有减慢的情况。 可能值得在 CCS 中使用"disconnect"按钮进行测试、以允许代码自由运行并查看延迟是否仍然很长。

    2.您是否使用 GPIO 切换和示波器来检查延迟? 这实际上是检查标志和 ISR 之间延迟的最简单方法。 如果您使用另一种方法、请改用此 GPIO 切换方法。

    让我知道您通过上述测试/检查确定的内容、以便我们深入了解可能导致这种情况的原因。

    如果以上不是解决方案、那么有可能只有一个安全装置超时触发 NMI。 请确保这不仅仅是 WDCNTR 达到其8位溢出值。

    此致、

    Vince

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

    尊敬的 Vince:

    如何确保  WDCNTR 不会达到溢出值? 我的意思是、如果我连接 CPU2、那么我无法重现我正在测试的场景、即 CPU2闪存为空、CPU1尝试从闪存引导 CPU2。

    CPU1 WDCNTR 未达到8位溢出值。

    此致、

    艾琳  

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

    您好、Irene、

    我已就此与看门狗专家联系,在下周初之前作出答复。

    同时、为了澄清我之前的帖子:

    我认为、当您从 CPU2运行时、可能会发生 CPU2达到其 WD 计数器限制、因为您尚未设置 CPU2 WD 中断处理程序(需要时清除 WD 计数器的函数)。

    此致、

    Vince

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

    您好、Irene、

    CPU2看门狗默认处于禁用状态、除非由应用启用、否则不应运行。 您能否提供引导 CPU2所遵循的步骤?

    此致、

    Vivek Singh

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

    您好、Vivek、

    这就是我要做的:

    我将 CPU2清空(这是通过选项"Tools"->"On Chip Flash"擦除闪存来完成的)。 我正在 CPU1中运行一个程序。
    CPU1尝试使用以下 IPC 函数引导 CPU2:

    IPC_setBootMode (IPC_CPU1_L_CPU2_R、MODE);
    // CPU01到 CPU02 IPC 标志寄存器
    IPC_setFlagLtoR (IPC_CPU1_L_CPU2_R、(IPC_FLAG0 | IPC_FLAG31));

    此处模式为03、即闪存引导选项0

    由于 CPU2为空、因此在 CPU1中设置 NmiIntertRegs.NMIFLGCLR.bit.CPU2WDRSn、以触发 NMI 中断。

    我已经创建了一个定制 ISR 来处理这个问题。 但是、设置标志和应答 ISR 所需的时间为13ms。 这是一个大延迟。

    我想知道延迟背后的原因、因为 NMI 中断是高优先级中断。

    此致、

    艾琳

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

    你(们)好

    [~ userid="448119" URL"μ C/support/microcontrollers/C2000-microcontrollers-group/C2000/f/C2000-microcontrollers-forum/1110390/tms320f28388d-delay-ine-responding-to-NMI-interrupt/4134329#4134329"]我已经创建了一个自定义 ISR 来处理此问题。 但是、设置标志和应答 ISR 所需的时间为13ms。 这是一个很大的延迟。[/quot]

    好的、这是 CPU1的 NMIWD。 在 CPU1上,您是否在花费很长时间的任何其他 ISR 中? 请注意、此器件不支持中断嵌套、因此您需要确保在发生 NMI 时 CPU 不会卡在其他一些 ISR 中。  

    此致、

    Vivek Singh

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

    您好、Vivek、


    你是对的。 它将进入 CPU2toCPU1IPC0 ISR、这将带我回答以下问题和观察结果。 CPU2为空、在 CPU1中、我尝试引导 CPU2、如我后续问题中所述

    运行以下指令、但在 IPCCPU1toCPU2Regs.CPU1TOCPU2IPCFLG 寄存器中、我只看到 IPC31置1、而不是 IPC0。 我甚至尝试通过将 CPU1TOCPU2IPCSET.bit.IPC0设为1来手动设置此 IPC0、但它仍然未得到反映。

    IPC_setFlagLtoR (IPC_CPU1_L_CPU2_R、(IPC_FLAG0 | IPC_FLAG31));

    2.在 CPU2toCPU1IPC0 ISR 中、即使在我确认任何标志之前、我也会看到'CPU2TOCPU1IPCSTS'为0。 如果它为0且 CPU2为空、那么为什么调用此 ISR?

    CPU2TOCPU1IPCBOOTSTS 的值为0x08、根据 TRM、这意味着"等待 CPU1设置 CPU1TOCPU2IPCFLG0以允许 CPU2开始引导"

    请告诉我。

    此致、
    艾琳

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

    我想当您检查标志时、CPU2会被复位、因此所有标志都会被清除。 您应该尝试在 CPU2中对一些代码进行编程、然后尝试执行此操作。  

    此致、

    Vivek Singh

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

    您好!

    如果您对此有任何进一步的疑问、请告知我们。

    此致、

    Vivek Singh

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

    您好、Vivek、

    我想通过编程方式(而不是通过调试器)确定 CPU2是否为空。 如果 CPU2为空、则我不会将其复位。

    在我的代码中、我 在内部处理 CPU2和 CM 的引导序列。 由于我无法确定检查代码中 CPU2是否为空的方法、因此无论 CPU2是否为空、我都将其复位、这会导致 CPU1中出现 NMI。

     

    所以我的主要问题是,我们是否可以通过 CPU1中的程序确定 CPU2是否为空。  如果是、那么我们如何做到这一点。

    此致、

    艾琳

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

    艾琳

    [~ userid="448119" URL"μ C/support/microcontrollers/C2000-microcontrollers-group/CC2000/f/C2000-microcontrollers-forum/1110390/tms320f28388d-delay-ine-responding-to-NMI-interrupt/4160739#4160739']在我的代码中、我 在内部处理 CPU2和 CM 的引导序列。 由于我无法确定检查代码中 CPU2是否为空的方法、因此无论 CPU2是否为空、我都将其重置、这会导致 CPU1中出现 NMI。

    如果 CPU2为空且 CPU1应用程序代码释放 CPU2的复位、则它将自动复位(通过 CPU2引导代码)。 您不必在代码中执行它。  

    [~ userid="448119" URL"/support/microcontrollers/C2000-microcontrollers-group/CC2000/f/C2000-microcontrollers-forum/1110390/tms320f28388d-delay-ine-responding-to-NMI-interrupt/4160739#4160739']因此,我的主要问题是,如果 CPU1中的程序不是空的,我们是否可以通过 CPU2。  如果是、则我们如何执行此操作。

    CPU1无法读取 CPU2闪存、因此无法检查 CPU2闪存是否为空。  

    此致、

    Vivek Singh