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.

[参考译文] TMS570LC4357:ESM 组2通道3错误、由于"推测指令提取"操作问题

Guru**** 2445440 points
Other Parts Discussed in Thread: TMS570LC4357, TMS570LS3137, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1323981/tms570lc4357-esm-group-2-channel-3-error-because-of-speculative-instruction-fetch-operation-issue

器件型号:TMS570LC4357
主题中讨论的其他器件: TMS570LS3137HALCOGEN

你(们)好!

我有两个不同的项目在处理 TMS570LC4357 MCU。

在我的第一个项目中、我使用的是 FreeRTOS、并且闪存已启用缓存(直写式)。 在第二个项目中、我不使用 FreeRTOS、但高速缓存设置是相同的。

在我的第一个项目上、即使在缓存被禁用时、我也会从 ESM 组2通道3收到一个错误。 我认为这个错误是由推测取指令操作造成的、在本例中我知道两个不同的解决方案。 但是我的第二个项目不会收到任何 ESM 错误(实际上、当我执行闪存组7写入操作时、ESM 错误会接收到)。 有什么不同呢?

根据 ARM Cortexv7-R 手册、CPU 使用推测取指令、但是在这个情况下、这个错误应该出现在两个项目中。 两个项目都过大、因此必须存在 ECC 错误、具体取决于推测指令获取操作。

FreeRTOS 是否有任何已知问题、以及它与使用闪存存储体7或 Fapi 是否相关?

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

    您好!

    我做了一些其他的测试,我发现了一些不同的情况。

    我将.text 段和闪存 API 库分开、并将其放置在闪存存储体的不同区域中。 以便我以不同的方式配置这些区域。 我的测试配置和结果如下。

    注意:我使用 vfill 进行测试配置。 我知道在这种情况下不建议使用 vfill、但我想尝试了解 RTOS 和裸机项目之间的差异行为。

    1) 1)闪存区域的高速缓存设置:启用、直写。

      闪存 API 区域的缓存设置:无关紧要。

    • FreeRTOS 项目始终收到 ESM 2.3错误。 ESM 错误的数量随时间增加。
    • 在执行 EEPROM 操作时(使用 FEE 和闪存 API)、裸机项目会接收到 ESM 2.3错误。

    2)闪存区域的高速缓存设置:禁用。

      闪存 API 区域的高速缓存设置:启用、完全写入。

    • 在代码开始时接收到一些错误并停止(两个项目)。 ESM 错误常量的数量。

    3)闪存区域的高速缓存设置:禁用。

      闪存 API 区域的高速缓存设置:禁用。

    • FreeRTOS 项目始终收到 ESM 2.3错误。 ESM 错误的数量随时间增加。
    • 在执行 EEPROM 操作时(使用 FEE 和闪存 API)、裸机项目会接收到 ESM 2.3错误。

    在3. ıf、μ C 不执行任何 EEPROM 操作、不会接收到两个项目的 ESM 错误。

    FreeRTOS 内核和 EEPROM 操作似乎会导致其他错误。 如果推测取指令操作导致 ESM 2.3错误、为什么裸机项目不会从1中接收到任何错误。 和3. 配置、以及在尝试某些 EEPROM 操作时为什么接收 ESM 错误。

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

    ESM 2.3指示闪存中的 ECC 值不正确。

    所有闪存存储器空间(闪存组0至6)的 ECC 值必须在程序/数据可被读取前被编程到闪存中。 这可以使用链接器 cmd 文件来完成。

    https://software-dl.ti.com/hercules/hercules_docs/latest/hercules/How_to_Guides/HowToGuides.html

    组7是数据闪存。 您是否将代码编程到了银行7?

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

    感谢您的回答。

    什么是"你把你的代码编程到银行7"的意思。  我将闪存组7用于仅存储数据。 我的工程不会从链接器文件生成 ECC。 我认为这不安全、因为 TI 不会提供足够的细节。 此外、我将使用 vfill 而不是 fill、我知道如果我使用 fill 而不是 vfill、将不会出现任何错误。 我的问题是、不是这样。

    "所有闪存存储器空间(闪存组0至6)的 ECC 值必须在程序/数据可被读取前被编程到闪存中。 这可以使用链接器 cmd 文件来完成。"  这个问题与推测取指令或者仅仅与闪存 ECC 值有关吗?

    • 闪存中有许多空扇区。 在运行时、CPU 不会在此区域上生成任何操作(指令或数据获取操作)、但即使此区域为空、ECC 也必须正确编程。 当我不使用此区域时、为什么 ECC 生成和计算机制 需要 为我的空位置提供正确的 ECC 值。 ECC 机制是否仅使用我有效的闪存区域?
    • 此问题 与我的配置相关。 我以相同的方式对 MCU 进行编程、以用于所有3种配置、不执行任何与 ECC 相关的操作。 在这个情况下、为什么 ESM 2.3错误计数是不同的(每秒)。 如果只是关于闪存 ECC 值、MCU 必须每秒接收相同的 ECC 错误数。
    • 无论是否使用闪存仿真、FreeRTOS 项目在运行期间都会收到 ECM 2.3错误。 不同之处。 FreeRTOS 内核是否会导致任何闪存 ECC 操作?
    • 当扇区被读取并为空但 tms570lc4357 MCU 不符合不同的值时、闪存存储体的 tms570ls3137 MCU contaion 0xff 值。
    • 如果必须使用正确的 ECC 值对所有闪存存储体区域进行编程、为什么要执行一些额外的操作? CCS 或 halcogen 生成的链接器文件应执行该操作。 似乎 CCS 只使用闪存区域来生成 ECC 值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    下面是链接器文件为整个闪存生成 ECC 的示例:

     

    e2e.ti.com/.../2330.sys_5F00_link.cmd

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

    1.要使用链接器 CMD 文件启用 ECC 生成功能,请执行 CCS->project property->ARM Linker -->链接器输出

      

      当使用链接器 ECC 生成功能时、应取消选中程序加载期间的"Auto ECC Generation":CCS->tools->On-Chip Flash->……

    2.将 palign (0)添加到链接器 CMD 文件的部分:

    由于所有 TMS570器件上的 ECC 是在64位或8字节边界上计算得出的、因此放置在片上闪存中的所有数据和代码段也应与64位边界对齐。 此外、它们还应以64位边界结尾、以确保整个段的长度为64位的倍数并完全初始化。 实现此目的的最简单方法是在将放置在片上闪存中的链接器命令文件中的所有输出段上使用 palign (8)。

    闪存组的 tms570ls3137 MCU contaion 0xff 值,此时扇区为空但 tms570lc4357 MCU 不相同的值。

    由于它具有无效的 ECC 值、因此 ECC 机制会尝试使用无效的 ECC 值来纠正闪存数据。

    似乎 CCS 只能使用闪存区域生成 ECC 值。

    程序加载期间的"自动 ECC 生成"仅计算应用程序映像的 ECC 值。  

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

    您是否清楚地理解了我的问题? 我什么时候要求从链接器文件中进行 ECC 计算? 我不想像我所说的那样有任何解决办法。 我想详细了解这个问题。 我不会使用从链接器文件生成的 ECC。 我将使用填充值为(0xff)的所有闪存。

    • 闪存中有许多空扇区。 在运行时、CPU 不会在此区域上生成任何操作(指令或数据获取操作)、但即使此区域为空、ECC 也必须正确编程。 当我不使用此区域时、为什么 ECC 生成和计算机制 需要 为我的空位置提供正确的 ECC 值。 ECC 机制是否仅使用我有效的闪存区域?
    • 此问题 与我的配置相关。 我以相同的方式对 MCU 进行编程、以用于所有3种配置、不执行任何与 ECC 相关的操作。 在这个情况下、为什么 ESM 2.3错误计数是不同的(每秒)。 如果只是关于闪存 ECC 值、MCU 必须每秒接收相同的 ECC 错误数。
    • 无论是否使用闪存仿真、FreeRTOS 项目在运行期间都会收到 ECM 2.3错误。 不同之处。 FreeRTOS 内核是否会导致任何闪存 ECC 操作?

    推测取指令操作是否会导致所有这些问题?  

    此外、当我 使用 MPU (No Access 属性)关闭程序代码未使用的闪存区域时、 没有从 ESM 2.3接收到错误。 如果这个问题与推测指令取操作相关、推测取操作似乎使用随机闪存地址。 在这种情况下、CPU 并不是完全因为 MPU 而提取此存储器区域、并且由于此操作被丢弃、不会生成 ABORT 信号。 是这样吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否清楚地理解了我的问题? 我什么时候要求从链接器文件中进行 ECC 计算? 我不想像我所说的那样有任何解决办法。 我想详细了解这个问题。 我不会使用从链接器文件生成的 ECC。 我将使用填充值为(0xff)的所有闪存。

    我知道 ECC 错误是由推测取指令引起的。  为了防止推测取错误、整个闪存(两个组)的 ECC 值应该被编程一次。

    推测取操作是否引发了此问题?  [/报价]

    推测取指令将生成不可纠正的 ECC 错误。

    如果编译器生成与寄存器内容的比较结果、则下一条指令是 LDREQ Rd、[Rs](条件加载)。 CPU 在评估比较结果之前、根据 Rs 的内容开始内存访问。 如果比较不相等、Rs 可能具有一些随机值。 CPU 丢弃其读取的内存内容(而不是放入 Rd)、并且不执行中止。 但是、存储器读取生成了 CPU 事件信号、该信号告诉 ESM 存在不可纠正的闪存错误。  

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

    在这种情况下、如果我将 MPU 设置为不对未使用的闪存区域进行访问、CPU 将无法从未使用的闪存区域中提取任何指令。 通常情况下、CPU 会生成中止、但不会因为放弃此操作而出现错误。 另外、不会接收 ESM 2.3错误、这是因为 CPU 无法访问、即使它是对随机闪存内容的推测访问。