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 错误(ESM 组1通道6事件)。 原因是什么?如何跟踪?

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

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1042986/tms570ls3137-flash-ecc-errors-esm-group-1-channel-6-event-what-is-the-cause-how-to-track

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

您好!  

我们正在使用贵公司的 TMS570LS3137开发产品。 在最近的软件版本中、芯片报告了 ESM 组1通道6事件错误。
查找手册发现这意味着闪存 ECC 发现了一个单位可纠正的错误。
我们的应用场景不允许出现此错误、即使该错误是可纠正的。

我的问题有以下三点:

1.此错误的原因是什么?
除了硬件故障之外、哪些软件操作会导致闪存 ECC 错误?
TMS570的 MPU 模块可以防止意外的闪存写入操作。 由于重写闪存被阻止、为什么 ECC 检查失败?

2.我们如何跟踪这个问题?

3.我不理解技术参考手册中 FCOR_ERR_ADD 寄存器的位[2:0]的含义以及 FCOR_ERR_POSbits[7:0]的描述。 例如、您能详细解释一下吗?

期待您的回复、谢谢!

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

    您好!

    1.故障地址被编程到 FCOR_ERR_ADD 寄存器。  FEDACSTATUS 寄存器标志指示错误类型。

      MPU 设置不会影响通过 F021闪存 API 进行的闪存写入。

    请检查以下寄存器: FEDACSTATUS、 FCOR_ERR_ADD 和 FCOR_ERR_POS。

    FCOR_ERR_ADD[2 :0]为字节偏移。  

       ERR_POS: 单位错误的位地址。

       FCOR_ERR_POS 寄存器的 bus2字段的值是多少?

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

    您好!

    "MPU 设置不会影响通过 F021闪存 API 进行的闪存写入。" 没错。但是、这个程序不使用这些接口来操作闪存。所以、我想、如果没有 ECC 编码、我们的程序是否会溢出并读取闪存地址、 导致 ECC 检测失败?此读取的来源可能是读取数据或读取指令。您认为什么?

    发生错误时、我们观察到这些寄存器的状态、如下所示:

    FCORERRCNT:0x0
    FCORERRADD:0x5b50
    FCORERRPOS:0x0
    FEDACSTATUS:0x2

    这是否意味着错误地址是0x5b50?
    ECC 编码意味着该地址下的位0应该为0、但位1的值实际上读作1、因此报告 ECC 错误、是否理解为这样?

    不太理解您所说的"FCOR_ERR_POS 寄存器的 bus2字段"。 您是否会检查问题2的答案中是否包含该问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="437631" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1042986/tms570ls3137-flash-ecc-errors-esm-group-1-channel-6-event-what-is-the-cause-how-to-track/3858822 #3858822"]这是否意味着错误地址是0x5b50?

    是的、0x5b50是错误地址

    [引用 userid="437631" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1042986/tms570ls3137-flash-ecc-errors-esm-group-1-channel-6-event-what-is-the-cause-how-to-track/3858822 #3858822"] ECC 编码表示该地址下的位0应为0,但位1的值实际上读作1,因此报告 ECC 错误,是否理解为这样?

    FEDACSTATUS:0x2 ->  在总线1上检测到单位错误并进行纠正(用于主闪存)。  

    [引用 userid="437631" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1042986/tms570ls3137-flash-ecc-errors-esm-group-1-channel-6-event-what-is-the-cause-how-to-track/3858822 #3858822"]我不太理解您所说的"FCOR_ERR_POS 寄存器的 bus2字段"。 您是否会检查问题2的答案中是否包含该问题?[/引述]

    闪存包装程序有两条总线、总线1和总线2。

    CPU 使用总线1来访问闪存的正常扇区(组0和组1)、针对这些扇区存储程序和数据。 CPU 将使用总线2来访问 OTP 扇区、EEPROM 仿真闪存组。  

    当 CPU 通过总线1访问程序闪存(组0和组1)时、CPU 的内置 SECDED 逻辑将执行 ECC 检查。 请注意、这个 ECC 逻辑位于 CPU 内部、而不是闪存包装程序内部。  

    您是否通过注入 ECC 错误来执行任何闪存自检?

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

    谢谢你
    我们没有使用 OTP 扇区或 EEPROM 仿真闪存组。
    2.我没有故意注入此故障来验证它,是我们的官方应用程序现在报告了此问题,我想找到例外代码并修复它。
    当前的0x5b50只是错误的地址。 我们是否可以通过任何方法找出导致问题的代码?

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

    1.将*。out 文件加载到闪存中

    2.在_c_int00 ()开头的某个位置运行代码和预定义断点

    3.打开然后拆分窗口,然后在0x5B50处找到指令

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

    老实说,我知道你谈论的所有步骤,我不明白。 您是如何解决错误的原因的?

    您是否认为错误是由在0x5B50处执行指令引起的?

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

     FEDACCTRL1寄存器的值是多少?

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

    QJ Wang、您好!

    FRDCNTL:0x311
    FEDACCTRL1:0xa060a
    FEDACCTRL2:0x0

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

    谢谢

    是的、0x5B50是错误地址。  当 EOFEN 或 EZFEN 使能位被置位(您的置位中为 FEDACCTRL1[7:4]=0x6)时,错误地址将在错误期间被捕捉。

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

    谢谢!
    那么是什么导致了这个错误呢?
    硬件故障? 还是代码溢出?

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

    您好、Shunyun、

    它可能是闪存中的永久性故障。 在闪存擦除操作之后、如果位置(0x5B50)的内容及其对应的 ECC 位置为0xFFFFFFFF、则闪存应该正常。  

    它可能是瞬态故障。 您能否检查闪存地址0x5B50的 ECC 值? 它应该位于0xF0400000 + 0x5B50/8 = 0xF0400B6A。

    在 c_int00 ()函数中、启用闪存 ECC 后、读取0x5B50是否会导致 ECC 错误? 0x5B50处是什么? 它是您的代码的一部分吗?

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

    您好 QJ、好久不见。

    1。

    我修改 了 sys_link.cmd 文件、现在错误地址已更改为0x1990。

    sys_link.cmd 配置如下:

    存储器

    引导程序(X):origin=0x00000000 length=0x00000020
    FLASH0 (RX):origin=0x00000020 length=0x0017FFE0
    FLASH1 (RX):origin=0x00180000 length=0x00180000
    堆栈(RW):origin=0x08000000 length=0x0000C000
    RAM (RW):origin=0x0800C000 length=0x00033F00
    USERDEFINE (RW):origin=0x0803FF00 length=0x00000100

    部分

    .intvecs:{}>向量 load_start(__vectors_start)
    .text:{}> FLASH1
    .const:{}>FLASH1
    .cinit:{}>FLASH1
    .pinit:{}>FLASH1
    .bss:{}> RAM
    .data :{}> RAM
    .sysmem:{}>RAM

    如您所见、我的程序中未使用0x1990、因为每个不可改变的段都存储在 FLASH1中。

    按照您的建议、我检查了以下地址下的值:

    地址0x1990下的值为 0xFFFF FFFF

    0xF0400000 + 0x1990/8 = 0xF040 0332,  地址0xF040 0330下的值为0x0997 0997

    2.

    在调试模式下、我将断点放置在 ESM 中断服务函数中。 在退出中断函数后、CPU 跳转到 u_div32.asm 中的__aeabi_uidivmod 函数、该函数是附加映像中红色箭头的位置。如果我继续向下计数、您可以看到我的 C 代码确实有一行除法。

    那么、我的问题是、为什么_aeabi_uidivmod 函数中存在访问错误、并且此函数是否存在缺陷?在分析此函数的汇编代码后、寄存器之间基本上没有计算、没有读取和写入存储器、为什么会发生此类错误?

    u_div32

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

    随函附上我以 C 语言书面提到的分部声明:

    void intToAscii(UINT32 value,INT8 buffer[],UINT16 buffer_len)
    {
        UINT8 i = 0;
        UINT8 j = 0;
        UINT8 digit_start = 0;
        UINT16 digit = 0;
        UINT32 denom = 1000000000;
        UINT8  t_buffer[30] = {0};
    
        if (0 == value)
        {
            t_buffer[0] = '0';
            t_buffer[1] = '\0';
            j = 2;
        }
        else
        {
            for(i = 10; i > 0; i--)
            {
                digit = value / denom;
                if((1 == digit_start) || (digit != 0))
                {
                    digit_start = 1;
                    value %= denom;
                    t_buffer[j++] = (digit + '0');
                }
                else
                {
                    ;
                }
                denom /= 10;
            }
            buffer[j] = 0;/*ZSQ modify warning NULL -> 0 2021.4.25*/
        }
    
        if(j > buffer_len)
        {
    
        }
        else
        {
            CM_Memcpy(buffer,buffer_len,t_buffer,j);
        }
    
    
    }

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

    当我注意到这个工程师遇到了类似的问题时、我浏览了论坛。

    TMS570LS1225 Thumb/Arm 模式帮助-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

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

     这也许是由推测取回造成的。  

    Cortex-R4 CPU 可以生成推测取指令到闪存存储器空间内的任何位置。 对具有无效 ECC 的位置的推测取指令(随后未使用)不会创建中止、但会为可纠正或不可纠正的错误设置 ESM 标志。 不可纠正的错误将无条件地导致 nERROR 引脚切换为低电平。 因此、必须注意为整个闪存空间(闪存0和闪存1)生成正确的 ECC、包括段与任何未使用或空白闪存区域之间的空洞。

    是否可以尝试使用 链接器 CMD 文件生成 ECC?

    http://software-dl.ti.com/hercules/hercules_docs/latest/hercules/How_to_Guides/index.html

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

    我已经尝试禁用 Flashecc、但该错误不会再次出现、程序稳定运行。

    因此、我几乎可以肯定、正如您提到的、全范围的 ECC 编码一定会防止这个问题再次出现。但是、仅仅因为一个问题不再发生并不意味着它已经解决了。您还在说、也许、我怎么知道这是推测取指令导致了这个问题?

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

    建议使用相应的 ECC 值填充孔洞、以避免由于推测取导致的不可纠正的 ECC 错误。 请参阅 TMS570LS3137 TRM:5.3.1 SECDED 初始化

    ARM Cortex-R TRM:5.1关于预取单元(PFU):

    PFU 的用途是:
    •预测 分支指令的结果、在 DPU 之前执行推测取指令
    •以有助于 DPU 高效实施的方式格式化指令数据。


    PFU 从 DPU 以及 内部协处理器 CP14和 CP15控制下的存储器系统获取指令。 在 ARM 状态下、内存系统 每个周期最多可提供两条指令。  PFU 在其 FIFO 中缓冲最多三个指令数据取指令。  PFU 和 DPU 之间有一个额外的 FIFO、通常可以缓冲多达八条指令。  这减少或消除了分支指令之后的停滞周期。 这提高 了处理器的性能。

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

    我有用于整个闪存的 ECC 代码、问题不再重复。

    我认为这就是答案。 感谢您的回复。

    更详细地说、我建议您将 ECC 配置的这一部分添加到链接中。 演示中的 CMD 或 HALCOGEN 生成的代码、首先、这个问题不容易找到。