您好!
我想请您澄清并提供更多有关闪存 ECC 诊断和 CPU 推测取指令到触发双错误事件的未初始化闪存存储器的信息(FEDAC 状态寄存器-位 B1_UNC_ERR、存储在寄存器 FUNC_ERR_ADD 中的错误地址)。
我知道、在 TI 论坛上、有几个与此主题相关的主题。 解决方案是 a)初始化整个闪存存储器空间并让闪存编程器自动计算 ECC 值;或 b)让链接器显式生成 ECC 值、将其存储到由链接器生成的特殊段中、并将闪存数据与 ECC 一起存储。
根据 TI TMS570技术参考手册:
- 所有 ATCM 程序存储器空间(闪存组0至6)的 ECC 值必须编程到闪存中。' 相关区域高达0x7FFFF。 由于这是 SMC2图像闪存的一部分、因此应对其进行编程。
- "对具有无效 ECC 的位置的推测取指令、随后未使用、将不会产生中止、但会为可纠正或不可纠正的错误设置 ESM 标志。 不可纠正的错误将无条件地导致 nERROR 引脚切换为低电平。 因此、必须注意为整个 ATCM 空间生成正确的 ECC、包括段与任何未使用或空白闪存区域之间的空洞。"
关于推测取指令、根据我在 ARM Cortex R4F 技术参考手册中和论坛上的这里所找到的内容、它们可以对指令和数据执行。
在我们的示例中,程序执行期间在来自起始或中间闪存扇区的地址上发生了双错误事件- 0xa0000、0xc0000、0xf0000、...、0x100000、 0x110000、...高达0x2d0000、0x2e0000、0x2f0000。 查看观察到的地址、它们都与64KB 对齐。 (请注意、闪存包含前四个具有32KB 的扇区、之后是高达0x2FFFFF 的128KB 的扇区)。
我们的软件利用闪存的初始部分(高达0x190000)。 我希望推测执行会生成接近"已知"程序或数据闪存块的地址、但不会生成来自闪存末尾的地址。 您能解释一下我们观察到的情况吗? (CPU 尝试访问给定地址的可能性有多大?)。
谢谢你。