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.

[参考译文] TMS320F28386S:调试 CM 内核上的 NMI 问题

Guru**** 2513185 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1528068/tms320f28386s-debugging-the-nmi-on-cm-core-issue

部件号:TMS320F28386S


工具/软件:

晚上好!

在工程开发过程中、我同时使用 CPU1 和 CM 内核、并开始在 CM 内核上捕获 NMI。 浏览寄存器我发现 NMI 原因是闪存未校正错误、FLASHECC 寄存器显示 ERR_STATUS 中设置的 UNC_ERR_L 位、UNC_ERR_ADDR 有时是 iz 0、有时显示堆栈上的一些地址。 ErrorLog 和 DIAGERRORSTLOG 寄存器均为 0。 退出 NMI 处理程序我看到 NMI 发生在相同的代码位置、但此代码中没有任何求值、这只是一个通过一些查找所需条目的常量结构数组进行的循环。 因此、我忽略了这个故障 、这是我之前执行的代码的一些副作用、但我不理解如何找到原因。

更新:禁用闪存 ECC 可解决问题、之后的代码没有问题。 但这并不好。

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

    您好、

    CMNMIFLG 显示 FLUNCERR 位设置?

    您能否使用 CM_FLASH_ECC_REGS 和以下信息找到不可纠正的错误:   

    另请参阅此论坛上的其他主题,我找到了此主题 —  https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/823580/ccs-tms320f28388d-flash-uncorrectable-error-nmi-flag-fluncerr 

    谢谢

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

    是的、我得到了带有此标志的 NMI。

    我之前说过、 UNC_ERR_ADDR_LOW 寄存器有时包含 0、有时在栈区域中的某个地址、即 C0RAM 中。 设置 UNC_ERR_L 和 UNC_ERR_INTFLG 位。

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

    您好、Oleg、

    此代码中没有任何有用的内容、这只是一个通过查找所需条目的结构的常量数组的循环。 所以我忽略了这个错误是 我之前执行的代码的一些副作用,但我不理解如何找到原因。

    注释掉此循环中的代码时、是否仍会出现 NMI/闪存不可纠正的错误?

    退出 NMI 处理程序我看到 NMI 发生在相同的代码位置

    退出 NMI 处理程序后如何检查错误代码位置?

    我建议如下:

    • 检查链接器命令文件中的段对齐情况(使用 align (8))
    • 验证工作频率的闪存等待状态是否正确
    • 检查系统时钟稳定性、确保没有与时钟相关的干扰或问题

    此致、

    Marlyn

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在此循环中注释掉代码时、是否仍会出现 NMI/闪存不可纠正的错误?

    遗憾的是、随着代码的增加、我现在无法重现问题。

    退出 NMI 处理程序后如何检查错误代码位置?

    在 NMI 处理程序中设置断点后、我可以跳过 Forever 循环并退出它、从而显示发生断点的代码。  

    检查链接器命令文件中的段对齐情况(使用 align (8))

    是的、没有 align 关键字。 这是器件的默认 cmd 文件。

    检查系统时钟稳定性、确保没有与时钟相关的干扰或问题

    程序现在在 F28388D controlCARD 上运行、因此可以正常运行。

    验证工作频率下的闪存等待状态是否正确

    125MHz 所需的等待状态值是多少? 现在是 2。

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

    几小时后、器件通过 NMI 复位一次。 但 NMI 处理程序中没有断点。 等一下。 在我再次捕捉它后,我会尝试注释代码发生的地方,并等待更多. 因此、ALIGN (8) 没有帮助。

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

    您好、Oleg、

    125MHz 所需的等待状态值是什么? 现在是 2。

    对于 125MHz、所需等待状态应为 3。 能否将 RWAIT 设置为 3?

    再次捕获后、我将尝试对代码进行注释、并等待更多。

    是的、如果更改等待状态后您再次遇到此问题、请告知我。

    此致、

    Marlyn

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

    等待状态更改为 3、效果相同。

    有时我在重新加载程序时出错:

    Cortex_M4_0: Error occurred during flash operation: Timed out waiting for target to halt while executing pwrite_en.alg
    Cortex_M4_0: Error occurred during flash operation: Timed out waiting for target to halt while executing pwrite_en.alg
    Cortex_M4_0: Error occurred during flash operation: Timed out waiting for target to halt while executing pwrite_en.alg
    Cortex_M4_0: Error occurred during flash operation: Timed out waiting for target to halt while executing pwrite_en.alg
    Cortex_M4_0: Trouble Removing Breakpoint with the Action "Remain Halted" at 0x20004118: (Error -2044 @ 0x96) Internal error: Requested breakpoint does not exist. Restart the application. If error persists, please report the error. (Emulation package 20.0.0.3178) 
    Cortex_M4_0: Error occurred during flash operation: Timed out waiting for target to halt while executing erasew.alg
    Cortex_M4_0: Flash Programmer: Error erasing Sector 1. Operation Cancelled (1).
    Cortex_M4_0: File Loader: Memory write failed: Unknown error
    Cortex_M4_0: GEL: File: C:\WorkspaceECOM\CD_CM\Debug\CD_CM.out: Load failed.
    Cortex_M4_0: Error occurred during flash operation: Timed out waiting for target to halt while executing pwrite_en.alg
    Cortex_M4_0: Error occurred during flash operation: Timed out waiting for target to halt while executing pwrite_en.alg
    Cortex_M4_0: Trouble Removing Breakpoint with the Action "Remain Halted" at 0x20004118: (Error -2044 @ 0x96) Internal error: Requested breakpoint does not exist. Restart the application. If error persists, please report the error. (Emulation package 20.0.0.3178) 
    

    但第二个发行版 (Ctrl-Alt-R) 通过。

    现在我将尝试注释掉代码。

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

    因此、注释掉代码可以消除该问题。 因此、代码如下:

    我在外部生成的文件中有 const resource 表。 记录定义为

    typedef struct {
    	char name[256];
    	int id;
    	int offset;
    	int size;
    	int stype;
    	int width;
    	int height;
    } EVEMAP;
    

    表:

    const EVEMAP edfmap[] = {
    {"default-fl.blob", 0, 0, 4096, 0, 0, 0},
    {"NotoSansMono-VariableFont.glyph", 1, 4096, 24320, 0, 0, 0},
    {"verdana.glyph", 2, 28416, 36480, 0, 0, 0},
    {"NotoSansMono-VariableFont.xfont", 3, 64896, 311, 0, 0, 0},
    {"NotoSansMono-VariableFont.xfont.padding", 4, 65207, 9, 0, 0, 0},
    {"verdana.xfont", 5, 65216, 311, 0, 0, 0},
    {"verdana.xfont.padding", 6, 65527, 9, 0, 0, 0},
    {"LED-fail.raw", 7, 65536, 256, 37815, 32, 32},
    {"LED-off.raw", 8, 65792, 256, 37815, 32, 32},
    {"LED-on.raw", 9, 66048, 256, 37815, 32, 32},
    {"advion.raw", 10, 66304, 8640, 37815, 480, 72},
    {"back-icon.raw", 11, 74944, 256, 37815, 32, 32},
    {"bs-icon.raw", 12, 75200, 256, 37815, 32, 32},
    {"cancel-icon.raw", 13, 75456, 256, 37815, 32, 32},
    {"ecom-logo.raw", 14, 75712, 8640, 37815, 480, 72},
    {"eth.raw", 15, 84352, 256, 37815, 32, 32},
    {"expand-icon.raw", 16, 84608, 144, 37815, 24, 24},
    {"expand-icon.raw.padding", 17, 84752, 48, 0, 0, 0},
    {"gilson.raw", 18, 84800, 8640, 37815, 480, 72},
    {"home-icon.raw", 19, 93440, 256, 37815, 32, 32},
    {"io-icon.raw", 20, 93696, 256, 37815, 32, 32},
    {"lcprocess.raw", 21, 93952, 8640, 37815, 480, 72},
    {"leak-icon.raw", 22, 102592, 256, 37815, 32, 32},
    {"left-icon.raw", 23, 102848, 256, 37815, 32, 32},
    {"lilichro.raw", 24, 103104, 8640, 37815, 480, 72},
    {"menu-icon.raw", 25, 111744, 256, 37815, 32, 32},
    {"okay-icon.raw", 26, 112000, 256, 37815, 32, 32},
    {"remote-icon.raw", 27, 112256, 256, 37815, 32, 32},
    {"right-icon.raw", 28, 112512, 256, 37815, 32, 32},
    {"semba.raw", 29, 112768, 8640, 37815, 480, 72},
    {"shift-icon.raw", 30, 121408, 256, 37815, 32, 32},
    {"shrink-icon.raw", 31, 121664, 144, 37815, 24, 24},
    {"shrink-icon.raw.padding", 32, 121808, 48, 0, 0, 0},
    {"welch-logo.raw", 33, 121856, 8640, 37815, 480, 72},
    {"wufeng.raw", 34, 130496, 8640, 37815, 480, 72},
    {"xenon-off.raw", 35, 139136, 256, 37815, 32, 32},
    {"xenon-on.raw", 36, 139392, 256, 37815, 32, 32},
    {"zivak.raw", 37, 139648, 8640, 37815, 480, 72},
    {"zoomall-icom.raw", 38, 148288, 144, 37815, 24, 24},
    {"zoomall-icom.raw.padding", 39, 148432, 48, 0, 0, 0},
    {"version.txt", 42, 148544, 40, 0, 0, 0},
    {"version.txt.padding", 43, 148584, 24, 0, 0, 0},
    {""}};
    

    并且 NMI 在资源查找例程中被缓存:

    EVEMAP *findEDFObject(const char *name)
    {
    	int i = 0;
    	while(edfmap[i].name[0])
    	{
    		if(strcmp(edfmap[i].name, name) == 0) // <- NMI
    		{
    			return edfmap + i;
    		}
    		i++;
    	}
    	return 0;
    }
    

    或此处:

    EVEMAP *flashBitmapById(uint16_t id)
    {
        return edfmap + 5;
    	int i = 0;
    	while(edfmap[i].name[0])
    	{
    		if(edfmap[i].id == id) // <- NMI
    		{
    			Cmd_SetBitmap(RAM_FLASH + edfmap[i].offset / 32, edfmap[i].stype, edfmap[i].width, edfmap[i].height);
    			return edfmap + i;
    		}
    		i++;
    	}
    	return 0;
    }
    

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

    您好、Oleg、

    是否在 flashBitmapById() 函数中修改了 FLASH? 如果是、请确保遵循 该器件的闪存 API 指南中重点介绍的闪存编程指南。

    此致、

    Skyler

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

    你好。

    您可以看到上面的所有代码。

    此函数用于外部器件的闪存操作、内部闪存从未修改。

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

    您好、Oleg、

    哎呀,我想问一下 Cmd_Set Bitmap() 函数,而不是 flashBitmapById() 函数:/

    目前、我假设它也不修改内部闪存。 您能否验证是否未在修改内部闪存 不限 交叉点? 如果您将这些函数移动到其他闪存区域、是否会发生此错误?

    此致、

    Skyler

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

    从不  

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

    您好、Oleg、  

    您可以尝试将代码移动到闪存的其他区域吗?

    此致、

    Skyler

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

    我确认在任何代码点都不会修改内部闪存。

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

    该代码会不断修改、因此会沿闪存区域移动。 Somyimes 它需要几个小时来捕捉这个问题,沉闷的时间来分钟。 但无论如何,它会发生,如果 ECC 检查是打开的,它恰好在这个地方发生,顺便说一下,计数器“i"是“是在数组中间发生的。

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

    您好、Oleg、

    让我深入了解一下、并提供明天的更新。

    此致、

    Skyler

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

    您好、Oleg、

    您能否确保触发 NMI 的函数不在 勘误表的“在有效存储器之外进行预取“部分中指定的闪存地址范围内? 以下是另一个 E2E 主题、 讨论了这个问题可能会出现的方式。 或者,可以使用 cm_disableDataCache () 和 Flash_disableProgramCache () 函数禁用预取。

    此致、

    Skyler

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

    是的、我相信它位于默认的.text 段中、该段的定义离闪存结尾真的很远。 无论如何、默认情况下、.cmd 文件中定义了涵盖此勘误表的特殊段。

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

    您好、Oleg、

    好的、感谢您提供的信息。 针对问题正在进行内部调试、我认为该问题与您看到的问题相同、我将在我们确定根本原因时提供更新。

    此致、

    Skyler

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

    您好、Oleg、

    1. 如果您处理中断、NMI 之后代码是否继续正常执行? 我们需要确认此问题是否破坏了代码的功能。  
    2. 您能提供更多代码吗? 如果您可以发送项目或至少调用 findEDFObject() 和 flashBitMapbyID() 函数的函数、这将有助于我们进行调试。
    3. 您是否也可以发送项目的映射文件? 如果没有、您能否提供加载/运行这两个函数的地址?

    此致、

    Skyler

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

    是的、它会继续正常执行、直到出现下一个 NMI。

    明天我将提供其余的。

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

    您好、Oleg、

    好的、谢谢!

    -斯凯勒

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

    您好、Oleg、

    请参阅此常见问题解答、其中介绍了您在 CM 上遇到的问题以及可能的权变措施: (+)【常见问题解答】TMS320F28388D:【常见问题解答】为什么 F2838xD 器件上的 CM 内核有时会出现 NMI 异常、报告运行时指向非闪存地址的不可纠正的闪存 ECC 错误? - C2000 微控制器论坛 — C2000︎ microcontroller - TI E2E 支持论坛

    此致、

    Joseph