你(们)好
我们的生产产品会导致我们遇到一些问题。 它基于 TI 28377微控制器。
我们使用的是 TI v18.1.4.LTS 工具链、SYS/BIOS 6.75.0.15、XDCtools 3.51.1.18_core。
如果我使用的是 JTAG、一切看起来都正常、因此 GEL 文件可能会做一些神奇的事情、但我们却不会这样做。 错误似乎随代码的变化而变化、因此错误并不总是位于这段代码中。
我在引导过程的早期(WD 被禁用)有一个 while 循环、然后连接到正在运行的目标并继续执行"引导"过程、从而设法重现错误。 这样、我成功捕获 NMI 中断并查看调用堆栈。 下面是这方面的图片:
您可能已经注意到,故障似乎是在 getCrcFromSection()函数中的 memcpy 周围发生的。 如果我将 JTAG 与标准28377s GEL 文件一起使用来初始化 CPU、这通常会起作用、因此该代码应该可以正常运行。
我已经注意到、这个代码被放置在0x000C 0000边界上、这是闪存组1的开始。 目前、我们在链接器 cmd 文件中有一个大闪存范围、该范围涵盖闪存组0和1 (这可能会改变)。 我已经查看了 CPU (sprz422i)关于"存储器:有效存储器之外的预取"的建议的勘误表、根据此结果、此 CPU 的这两个闪存组之间的边界没有限制。
我们已使用 InitFlash_BANK1()和 InitSysCtrl()(后者调用 InitFlash_BANK0())初始化两个闪存组
我已经尝试在 sectionFromName()之前设置一个断点 ,整个调用栈和变量看起来不错。 当我单步执行 sectionFromName/memcpy()时,会触发 NMI 中断,调用栈如之前所示。
我们看到的是与上述勘误表相关的流水线问题还是其他问题?
更新:
我已经尝试在闪存组0和1之间的边界之前和之后手动放置 getCrcFromSection()函数。
如果我完全避免0x000B FFF0-0x000B FFFF 范围、根据勘误表、这个 CPU 应该不需要这个范围、那么一切看起来都正常。
如果我将 getCrcFromSection()函数的一部分放在上述范围内,则会发生 NMI 异常。
勘误表错误吗?

