我们已经看到数据中止发生。
当 CPU 从内存读取指针时、似乎总是会发生。
LD Rn、[PC、#IMM]
LD Rn、[Rn]
(笑声)
IMM: DC32地址
当第一条指令执行时、数据中止在访问"IMM"变量时发生
在一种情况下、这是在子例程中。
此代码被多次调用。
在两个位置、它会生成数据中止、但仅在以全速运行时才会生成数据中止。
如果我单步执行代码、则不会发生数据中止。
在其他地方、我没有看到该错误。
我们使用参数覆盖模块、并将前64KB 重新映射到 SRAM 以允许闪存编程(这是一个引导加载程序)
显示此问题的第一个子例程、在 POM 被启用后也许运行20条指令。
第二个子例程在 POM 被禁用后可能会运行20秒。
===
我在另一个地方看到了这个问题。
这是在对 F021库的调用返回后进行的。
然后、我将通过指针检查状态、代码具有相同的模式。
在这种情况下、全速执行和单步执行都将导致数据中止。
在这种情况下、POM 被启用、CPU 应该在前64KB 内执行、但是 POM 将这个映射到内部 SRAM。
我找到了一个权变措施、即创建一个我跳转到的__ramfunc 子例程。 那么我不会得到中止。
===
我们发现问题的第三个地方根本不使用 POM。
引导加载程序启动应用程序时、会将参数传递给应用程序
指示上电复位。 然后、应用程序将 S/W 复位置为有效、该复位将被置为有效
将 CPU 返回到引导加载程序、该加载程序不会执行完全初始化。
在调用应用程序之前、只初始化堆栈和通用寄存器
同样、现在将 S/W 复位作为参数传递、应用程序开始实际执行。
应用程序从未接触 POM。
数据中止现在发生在 SVC 中。 此服务将 CPU 设置为系统模式。 PSR.M[4:;0}= 0x1F。
这必然会执行很多次、但在1小时后会发生数据中止。
我们非常感谢您对这一个问题的看法!