主题中讨论的其他器件:NOWECC、 UNIFLASH、 SEGGER
您好!
在实现整个闪存内容的 CRC 计算(TMS570安全手册要求的安全机制)期间、我们遇到了一些不可纠正的 ECC 错误、这些错误我们追溯到未使用的闪存位置。 我们的链接器脚本包括以下内容:
MEMORY { VECTORS (X) : origin=0x00000000 length=0x00000060 KERN_FUNC (RX) : origin=0x00000060 length=0x0000FF0F vfill = 0xffffffff FLASH0 (RX) : origin=0x00010000 length=0x002F0000 vfill = 0xffffffff
编译后生成以下.map 文件:
MEMORY CONFIGURATION name origin length used unused attr fill ---------------------- -------- --------- -------- -------- ---- -------- VECTORS 00000000 00000060 00000020 00000040 X KERN_FUNC 00000060 0000ff0f 00008494 00007a7b R X FLASH0 00010000 002f0000 002f0000 00000000 R X ffffffff
例如、在 Kern_FUNC 部分中仅使用0xFF0F 中的0x8494字节。 我们在0xC000处得到 ECC 错误、该错误位于所用部件中。 根据链接器文档、vfill 限定符足以强制整个段而不仅仅是填充的部分生成 ECC。 但在使用 nowECC 生成 ECC 时、我们会看到以下内容:
PS C:\...\build> .\nowECC.exe -i .\input.hex -f021 16M_ADD -a -o .\output.hex This is nowECC Version 2.22 Mapping: F021-16MB ECC calculation from 0x00000000 to 0x0000001F ECC calculation from 0x00000060 to 0x000084F7 ECC calculation from 0x00010000 to 0x00058ABF *** Appending ECC section to file -> .\output.hex No Errors
因此、仅在地址0x84F7之前生成 ECC。
如果我们更改 Vfill 仅说明符 填充 在链接器脚本中、会按预期为整个闪存生成 ECC、不会出现 ECC 错误、但二进制文件的大小自然也会大幅增加。
我所遗漏的 vfill 限定符是否有某种特殊性?
感谢您的帮助、
亚伦