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.

[参考译文] TMS570LS3137:ECC 问题、vFill 与填充

Guru**** 1818760 points
Other Parts Discussed in Thread: NOWECC, UNIFLASH, TMS570LS3137, SEGGER
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1339961/tms570ls3137-problem-with-ecc-vfill-vs-fill

器件型号:TMS570LS3137
主题中讨论的其他器件:NOWECCUNIFLASHSEGGER

您好!

在实现整个闪存内容的 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 限定符是否有某种特殊性?

感谢您的帮助、

亚伦

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

    大家好、Aaron

    我已开始处理该线程、并将尽快提供更新。

    --
    谢谢。此致、
    Jagadish。

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

    大家好、Aaron

    下面是一些有关 fill 和 vfill 之间差异的信息。  编程前 Vfill 需要执行擦除步骤。

    以下各项之间的区别是什么:

      FLASH0 (RX) :origin=0x00000020 length=0x001FFFE0 vfill = 0xffffffff

      FLASH0 (RX) :origin=0x00000020 length=0x001FFFE0 fill = 0xffffffff

    前一个选项(vfill)不会导致链接器在指定的整个区域内输出填充值0xFFFFFFFF。 相反、当链接器计算 ECC 区域的数据值时、它指示链接器将存储器区域视为填充0xFFFFFFFF。

    后者(填充)实际上会输出所有闪存内容以及为闪存填充数据。

    当使用较慢的调试探针、例如 LaunchPad 中包含的 XDS100类探针时、这两个选项之间的差异主要表现为。 使用 vfill 将导致下载大小等于程序的大小加上 ECC 数据(约512K)。 而使用'fill'指令意味着即使对于小型的'blinky'程序、也需要下载4MB 的映像。

    假设闪存在编程前已擦除闪存-两种选择都将导致闪存针对每个地址使用有效的 ECC 内容进行编程-但基于 vfill 的.out 文件程序只需大约1分钟、而不是4-5分钟。

    --
    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    感谢您的答复和澄清。 这对我来说很合理。

    我们更喜欢使用 vfill 选项。 若要下载该程序、我们从命令行使用 J-Link 探测器和 UNIFLASH 工具(具有 dslite.bat 脚本)。 是否可以在下载程序之前擦除闪存? (我们在项目中使用 TMS570LS3137)。

    谢谢。此致、

    亚伦

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

    大家好、Aaron

    您是否在 UNIFLASH 设置中选择了"整个闪存"擦除选项?

    --
    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    它不适用于我:

    我想这个选项对于 J-Link 探头是不可能的吗? 在这种情况下、是否是唯一改用 fill 限定符的解决方案?

    谢谢。此致、

    亚伦

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

    大家好、Aaron

    是的、没错、Segger J-Link 仿真器不支持片上闪存设置。

    您可以看看以下主题、这是同一个问题:

    (+) TMS570LS3137:将闪存 ECC 下载到专用存储器区域时出现问题(使用 UNIFlash)-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    --
    谢谢。此致、
    Jagadish。