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:使用 VFILL 进行 ECC 计算时可能出现的问题

Guru**** 2560390 points
Other Parts Discussed in Thread: TMS570LS3137, UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1243480/tms570ls3137-possible-issue-with-ecc-calculation-with-vfill

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

您好!

我们有一个使用 TMS570LS3137和 TMS5700332的系统。   对于这两种情况、我们都启用了 ECC、并由链接器计算(将是输出 Intel hex 文件的一部分)。  我们为以前的系统使用了类似的配置、没有问题。   我们将使用 TI 编译器工具链 v20.2.1 LTS。

对于此系统、在使用 Code Composer 或 Uniflash (通过 CLI)刷写 TMS570LS3137时、我们一直会遇到间歇性错误。 在另一个处理器上不会出现错误。  在 Code Composer 上、错误如下所示:

根据错误中的地址、很明显错误 位于存储器的 ECC 段。

在调试错误时、我们尝试更改 VFILL 以填充闪存各个部分的链接器文件。  我们注意到在使用 fill 时没有发生错误。  填充的使用不太 方便、因为这会导致十六进制文件大得多、闪存会更耗时。  我们比较了使用 VFILL 生成的十六进制文件并填充、注意到 计算出的 ECC 存在差异、我认为这是不正确的。

这是 存储器特定部分的 ECC 代码屏幕截图(注意、该屏幕截图针对的是与用于获取 CCS 屏幕截图的二进制代码不同的二进制代码):

以下是该 ECC 的闪存数据的屏幕截图:

在数据方面、似乎当使用 VFILL 零时用于空存储器。  使用 fill 时、我们会使用 FF。  这似乎不是产生 ECC 差异的原因、因为其他 ECC 代码确实匹配。

什么可能导致使用 Fill 与 VFILL 计算出的 ECC 存在差异?

我们不能共享我们的 源代码、因为它是我们客户的财产。  我们尝试了设置简化的代码库、但无法重现错误。

谢谢。

何塞·洛佩斯

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

    您好、Jose、

    我们已开始处理您的问题、并将尽快提供更新。

    --
    谢谢。此致、
    Jagadish。

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

    您好、Jose、

    您能否验证以下主题并执行建议的修改?

    (+) TMS570LC4357:CRC 问题(可能由于 ECC)-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    --

    谢谢。此致、
    Jagadish。

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

    您好 Jagadish:

    我们之前看过您提供的链接、但对于我们的案例来说、这并不是一个很好的解决方案。  我们的链接器命令文件确实遵循该主题中的所有建议、我们在下面的部分中使用了"palign":

    谢谢!

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

    您好、Jose、

    我将该主题转交给专家。 他将很快为您提供更新。

    --

    谢谢。此致、
    Jagadish。

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

    您好、Jose、

    Uniflash (FlashHerciles.dll)中有错误。 有时、使用链接器为未使用的闪存段生成的 ECC 值没有正确编程。 如果您对电路板进行下电上电、并重新加载程序、则 ECC 将进行编程。

    我稍后将为您提供更新的 dll 文件。

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

    您好!

    您提到的可能是不同类型的问题。  我们看到的问题是、生成的十六进制文件(未刷写)具有不同的 ECC、具体取决于是否使用了 VFILL 或 FILL、Uniflash 会以某种方式影响这一点吗?

    谢谢!

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

    您好、Jose、

    如果填充模式为0xFFFFFFFF、则 Fill 和 VFILL 应使用0xFFFFFFFF 填充闪存漏洞。  

    对于填充案例和 VFILL 案例、十六进制中的 ECC 值是正确的。

    对于填充:

    数据位于0x3B8F8:0x 23800001和0x000000FF、 -->我根据您的 ECC 地址偏移0x771F*8 = 0x3B8F8)

    ECC 应为0x82 (我使用 TRM 中的 ECC 表进行计算)

    对于 VFILL:

    数据位于0x3B8F8:0x 23800001和0x00000000、  

    ECC 应为0x88 (我在 TRM 中使用 ECC 表进行计算)

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

    您好!

    使用 VFILL 和 Fill 的代码没有任何修改。  使用 fill 时、链接器会添加数据中的0xFF。  

    使用 VFILL 时使用0xFF、即使数据是0x00、是否应该以相同的方式计算 ECC 代码?  填充模式(使用 FILL 或 VFILL 时)是相同的0xFFFFFFFF。

    谢谢!

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

    您好、Jose、

    对于 ECC 计算、数据在64位边界上对齐(地址0x0~0x07或0x8~0xF)。 0xFF (Fill)和0x00 (VFILL)在 ECC 计算中用作高位字节(地址偏移量0xF)。  

    不应该以相同的方式计算 ECC 代码,使用 VFILL 时使用0xFF,即使数据是0x00?

    同样的方法也用于计算 ECC。 请参阅 TRM:BE32器件的 ECC 编码中的表5-1

    每个 ECC[x]位代表同一行中用 x 标记的所有地址位和数据位的 XOR。 对于高位数据字节(第63~56位) 0xFF 和0x00、ECC 的区别在于 ECC 的第3位和 ECC 的第1位(x 的奇数):0x82与0x88

    两个 ECC 值都正确。

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

    您好!

    因此、考虑到 ECC 值对于两个变体(VFILL 和 Fill)是正确的。 使用 VFILL 但未使用填充时出现刷写问题的原因可能是什么?

     特定 Uniflash 安装程序或版本的"已更新"DLL 部分吗?

    谢谢!

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

    如果使用 链接器为工程生成 ECC、则有必要更改加载程序设置、这样加载程序就不会尝试生成 ECC。 需要跳过编程期间的闪存验证、因为现在将以单独的步骤对数据区域和 ECC 区域进行编程。

    您可以在"Flash Settings"中访问这些设置、如下所示、并确保:

    • 未选中"自动 ECC 生成"
    • 闪存验证设置应为‘None’(无)
    • 必须取消选中"加载程序"前执行空白检查

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

    您好!

    我们已经取消选择"Auto ECC Generation"。  当我们 在"Flash 验证设置"中选择"无"时、问题就消失了。

    我假设由于我们未验证加载是否成功、因此存在闪存实际不成功的小风险。除非我们尝试运行该软件 并命中损坏的部件、否则我们不会注意到这一点。

    您之前提到了 Uniflash 中的一个错误和更新的 DLL。  哪个版本的 Uniflash 会解决此问题?

    谢谢!

    何塞·洛佩斯

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

    您好、Jose、

    Uniflash 的哪个版本可以解决此问题?

    在5月发布的 uniflash8.3中修复了此错误。

    错误与您的错误不同。 有时不会使用链接器 ECC 对未使用闪存的 ECC 进行编程。 它只发生在一个非常特殊的程序序列中。 例如、验证已启用-->加载失败-->禁用验证-->加载程序、代码的 ECC 已正确编程、但未使用闪存的 ECC 未编程。