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:L2RAMW -使用 GCC 编译/链接时出现双位 ECC 不可纠正的错误

Guru**** 2602595 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/742562/tms570lc4357-l2ramw---double-bit-ecc-uncorrectable-error-when-compiling-linking-with-gcc

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

您好!

初始化期间,我看到组3通道3 ESM 错误(地址0xFFFFFF520的值为0x00000008)。 我注意到了几种模式:
*仅在硬复位(关闭/打开 PSU)期间发生。 一旦我清除该标志、它似乎不会由调试器复位触发。
*只有在使用 arm-none-eabi-gcc 编译/链接二进制文件时才会发生这种情况。 如果我将 HALCoGen 层切换到 TI 并使用 CCS 编译、则不会发生这种情况。
*如果我在 esmREG->SR1[2]= 0xFFFFFFFF 的情况下清除_c_int00 ()开头的标志;MCU 将按预期运行、没有明显问题。  

我已经深入研究了反汇编并通过指令单步执行初始化指令、在 ESM 组3自检之前、我看不到 TI 和 GCC 生成的指令之间的功能差异。 我无法确定根本原因。

在代码开始执行之前、我正在刷写的二进制文件是否需要遵守某些要求? 您能说明一下我应该使用什么 gcc 标志吗?  我想知道这是否是一个链接问题。  

如果没有、是否有调试提示?

谢谢、
Brad

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

    为了通过校验 RAM 验证错误信令和响应、启动代码确实会特意导致一个双位 RAM 错误。 这会导致数据中止、并且中止处理程序会识别这是故意引起的还是 RAM 访问中的真正双位错误。

    如果错误不是由启动代码有意生成的、您能否在不初始化变量的情况下检查您的应用程序是否有可能读取变量? 您是否在启动序列中执行 CPU RAM 的自动初始化?

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

    感谢您的快速响应。 我没有修改 HALCoGen 生成的启动代码、而是对其进行检测以调试此问题。

    为了进行调试、我已经将应用代码剥离、只需使 HALCoGen HL_SYS_main.c 文件中 int main (void)内的 LED 闪烁。 我已经通过 Clang 分析器和 Coverity 静态分析器运行了所有 C 代码、并且未检测到读取任何未初始化变量。 我没有使用许多变量来使 LED 闪烁、因此这很容易通过手动代码检查和测试进行验证。

    在哪里可以找到故意的 ECC 错误并进行检查? 调用_memInit(),尽管我的测试/检测似乎表明错误发生在那之前。

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

    您好、Sunil、

    我已经确定了根本原因、并提出了新的问题。 我在这里的经历很长、所以我会跳到最后

    当我将 HALCoGen 层的工具链从 TI 更改为 GCC 时,HALCoGen 将 getResetSource()的函数声明如下所示:

    -resetSource_t getResetSource (void);
    +resetSource_t getResetSource (void)__attribute__(naked); 

    因此、GCC 忽略了函数的 return 语句。 当程序计数器到达函数末尾时、没有返回_c_int00 ()的 BX LR 指令。 程序计数器将继续运行 hl_system.c 中的下一个函数,即 systemGetConfigValue()。 永远不会在代码中的任何位置调用此函数、它应该是功能上的死区代码。 一旦程序计数器到达该函数的末尾、它最终将返回_c_int00 ()。  事后看来、ECC 不可纠正的错误似乎是合适的。  

    您能解释一下为什么为 GCC 添加了此属性吗? 它是否解决了可以通过其他方式解决的问题? 在工具链转换期间添加 naked 属性的唯一其他位置是_c_int00()。

    谢谢、
    Brad

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

    我必须在选择 GCC 工具集时向软件团队核实为什么为 getResetSource 函数指定此属性。

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

    谢谢 Sunil、我很感激。

    如果我在上一个帖子中不清楚、当我删除该属性时、函数会按预期返回、ECC 错误不再表示。

    我做了一些研究、发现

    "此属性允许编译器构建必需的函数声明、同时允许函数主体为汇编代码。 指定的函数不会有编译器生成的起始代码/结束代码序列。 只能将基本 asm 语句安全地包含在裸函数中(请参阅 基本 asm)。 虽然使用扩展 ASM 或混合使用基本 ASM 和 C 代码似乎可以正常工作、但不能依赖它们来可靠地工作、也不受支持。"

    该段中的关键短语是"将不具有起始/结束序列"。 在声明中给定该属性时、GCC 似乎运行正常。 还值得注意的是、该函数仅包含 C 代码、GCC 文档指出、使用该属性时不安全。

    最棒的
    Brad

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Brad。 我也理解了这一点。 我查找了有关此属性的信息、并确定它确实需要自己的手动上下文保存和恢复以及显式返回指令。

    请保持关注,直到我从软件团队那里听到只有在选择 GCC 工具集时才为 getResetSource()函数定义此属性的原因。

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

    软件团队已确认这是一个错误、并将在下一次 HALCoGen 更新中加以解决。 同时,您需要从 HL_system.h 文件中声明的 getResetSource()函数中手动删除“naked”属性。

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

    我感谢我们在这方面的快速周转时间,这一确认将有助于我们向前迈进。 我们期待看到 HALCoGen 更新。

    谢谢、
    Brad