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.

[参考译文] RM48L952:ECC 检测到双位错误、但未响应单位错误

Guru**** 2482105 points
Other Parts Discussed in Thread: NOWECC, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/703062/rm48l952-ecc-detects-double-bit-errors-but-won-t-respond-to-single-bit-errors

器件型号:RM48L952
主题中讨论的其他器件:NOWECCHALCOGEN

我正在尝试在设备上使用 ECC、并且遇到了一些问题。 我使用 HALCoGen 生成 ECC 代码、nowECC 注入错误。 当我注入一个双位错误时、所有操作都符合我的预期;一旦加载了包含该错误的64位块、它就会进入预取中止。 如果我仅注入一个位错误、似乎不会发生校正或异常。 此图显示了所发生的问题。 上部突出显示的部分在函数的开头显示了 PUSH 命令。 nowECC 修改了此行以在不应该推送 R5时将其推送。 在突出显示的下限区域中、您可以看到它不会弹出 R5、这会导致一些问题。 从显示的寄存器中、它看起来检测到不可纠正的 ECC 错误、但看起来它可能不是指闪存中的这个部分。

有人能解释为什么会发生这种情况吗?

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

    是否可以将故意的单位错误放入不属于数据中止或预取中止处理程序的代码段中? 此外、如何设置 CPU 协处理器 cp15寄存器来处理 TCM ECC 错误?

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

    Sunil、

    我对这种混乱表示歉意。 这不在异常中断处理程序中。 我的测试用于执行中止处理程序。 此函数执行一些代码、如果之前设置了变量、则会导致异常。

    我只是使用 Halcogen 代码对其进行初始化。 以下是与 TCM 相关的 CP1寄存器值:

    CP15_TCM_BTCM_REGION 0x08000039
    CP15_TCM_ATCM 区域0x00000039
    CP15_TCM_TCM_SELECTION 0x00000000

    下面是 Halcogen 生成的用于设置它的代码。

    /*启用 CPU 事件导出*/
    /*这允许 CPU 发出检测到的任何单位或双位错误的信号
    *通过其 ECC 逻辑访问程序闪存或数据 RAM。
    *
    _coreEnableEventBusExport_();
    /*用户代码开始(9)*/
    /*用户代码结束*/

    /*为闪存访问启用 CPU 指示的 ECC 错误响应*/
    flashWREG->FEDACCTRL1 = 0x000A060AU;

    /*用户代码开始(10)*/
    /*用户代码结束*/

    /*为 ATCM (闪存访问)启用 CPU ECC 检查*/
    _coreEnableFlashEcc_();

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

    在您的原始帖子中、您指出:

    "上部突出显示的部分在函数的开头显示了 PUSH 命令。 nowECC 修改了此行以在不应该推送 R5时将其推送。 在突出显示的下限区域中、您可以看到它不会弹出 R5、这会导致一些问题。"

    我认为该函数应该仅将 R3和 LR 推入堆栈。 当您使用 nowECC 更改 ECC 代码时、CPU 的单位错误校正机制会更正运算代码、以在 PUSH 指令中也包含 R5。 以下两条指令之间的单位不同:
    按{R3、LR}
    按{R3、R5、LR}

    因此、我认为 ECC 逻辑工作正常。 您是否在 FMC 寄存器 FEDCSTATUS.bit 1中看到 ECC 校正? 这也将反映在 ESM 组1状态寄存器位6中。

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

    我同意该函数应仅将 R3和 LR 推入堆栈。 如果我不使用 nowECC 修改这些位、就会发生这种情况。 ECC 如何工作、并将指令更正为仅出现单个位错误时不应出现的内容?

    我找不到寄存器 FEDCSTATUS。 在哪里可以找到它? 当我按照与上图相同的方式在"Expressions"选项卡中键入该内容时、它表示找不到该内容。 我在 ESM 寄存器中进行了查看。 调试器调用"Stat1"的寄存器全为零。 ESM 组1的状态是什么?

    谢谢、

    威斯汀

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有人对此有什么想法吗? 这对我来说似乎很奇怪。 我查看了 FCORERRADD 寄存器、发现它发现的可纠正错误的地址为0x34590、与预期的一样。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    威斯汀

    我在前面提到的寄存器名称中有一个拼写错误。 FEDACSTATUS 位于地址0xFFF8_701C 处。

    您是否还可以将其他 FCOR*寄存器的内容与 FEDACSTATUS 寄存器一起发布?

    此致、

    Sunil

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

    在我最初的帖子中、可以在图像中看到 FEDACSTATUS 寄存器、但我再次查看了它、现在它是不同的。 我不确定会发生什么变化。 当在损坏的 PUSH{R3、R5、LR}指令上时、该值现在为0x102。

    此图显示了寄存器。

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

    威斯汀

    当执行在这里停止时、您能否在地址0x3459C 上放置一个断点、然后读出闪存模块寄存器? 另请检查 ESM 状态寄存器。 FEDACSTATUS 寄存器显示检测到的不可纠正错误(位8)。 您能否在预取中止处理程序中清除此位?

    此致、
    Sunil

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我在上电后的第一个周期中捕获了断点、因此没有引发异常。 这是寄存器的状态。

    FlashWrapper
    FRdCntl0x00000411读取控制寄存器[存储器映射]
    FSpRd0x00000000特殊读取控制寄存器[存储器映射]
    FEdacCtrl10x000A060A错误校正控制寄存器1 [存储器映射]
    FEdacCtrl20x00000000错误校正控制寄存器2 [存储器映射]
    FCorErrCnt0x00000000错误校正计数器寄存器[存储器映射]
    FCorErrAddr0x00034590可纠正的错误地址[内存映射]
    FCorErrPos0x00000000可纠正错误位置寄存器[存储器映射]
    FEdacStat0x00000002错误状态寄存器[存储器映射]
    FUncErrAddr0x00000000不可纠正的错误地址[存储器映射]
    FEdacSDIS0x00000000错误检测扇区禁用[存储器映射]
    FPprimAddrTag0x000345B0主地址标签寄存器[存储器映射]
    FReduAddrTag0x000345B0冗余地址标签寄存器[存储器映射]
    FBnkProt0x00000000组保护寄存器[存储器映射]
    FBnkSec0x00000000组扇区使能寄存器[存储器映射]
    FBUSY0x0000007C组忙寄存器[存储器映射]
    FBnkAcc0x0000000F组访问控制寄存器[存储器映射]
    FBnkFallback0x0000FFFF组降级功率寄存器[存储器映射]
    FBnkPmpRdy0x007C80FF组/泵就绪寄存器[存储器映射]
    FPmpAcc10x00C80001泵访问控制寄存器1 [存储器映射]
    FPmpAcc20x00000000泵访问控制寄存器2 [存储器映射]
    FMdlAcc0x00000007模块访问控制寄存器[存储器映射]
    FMdlStat0x00000000模块状态寄存器[存储器映射]
    FEMUDatMsw0x00000000EEPROM 仿真数据 MSW 寄存器[存储器映射]
    FEmuDatLsw0x00000000EEPROM 仿真数据 LSW 寄存器[存储器映射]
    FEmuEcc0x00000000EEPROM 仿真 ECC 寄存器[存储器映射]
    Flock0x00000000闪存锁定寄存器[存储器映射]
    FEmudr0x00000000EEPROM 仿真地址[存储器映射]
    FDIAGCtrl0x000A0000诊断控制寄存器[存储器映射]
    FRawDataH0x00000000未校正原始数据高电平[存储器映射]
    FRawDataL0x00000000未校正原始数据低电平[存储器映射]
    FRawEcc0x00000000未校正原始 ECC [存储器映射]
    FParOvr0x00005400奇偶校验覆盖[已映射内存]
    FEdacSDis20x00000000错误检测扇区禁用寄存器2 [存储器映射]




    ESM
    IflErrPinSet10x00000000影响错误引脚设置/状态寄存器1 [存储器映射]
    IflErrPinClr10x00000000影响错误引脚清零/状态寄存器1 [存储器映射]
    IntEnaSet10x00000000中断使能设置/状态寄存器1 [存储器映射]
    IntEnaClr10x00000000中断使能清除/状态寄存器1 [存储器映射]
    IntLvlSet10x00000000中断级别设置/状态寄存器1 [存储器映射]
    IntLvlClr10x00000000中断级别清除/状态寄存器1 [存储器映射]
    STATUS10x00000040状态寄存器1 [存储器映射]
    STAT20x00000000状态寄存器2 [存储器映射]
    STATUS30x00000000状态寄存器3 [存储器映射]
    ErrPinStat0x00000001错误引脚状态寄存器[存储器映射]
    IntOffstHgh0x00000000中断偏移高寄存器[存储器映射]
    内部偏移低0x00000000中断偏移低寄存器[存储器映射]
    Ltcnt0x00003FFF低时计数器寄存器[存储器映射]
    有限控制0x00003FFF低时间计数器预加载寄存器[存储器映射]
    勘误码0x00000000错误密钥寄存器[存储器映射]
    ShdwStat20x00000000状态影子寄存器[存储器映射]
    IflErrPinSet40x00000000影响错误引脚设置/状态寄存器4 [存储器映射]
    IflErrPinClr40x00000000影响错误引脚清零/状态寄存器4 [存储器映射]
    IntEnaSet40x00000000中断使能置位/状态寄存器4 [存储器映射]
    IntEnaClr40x00000000中断使能清除/状态寄存器4 [存储器映射]
    IntLvlSet40x00000000中断级别设置/状态寄存器4 [存储器映射]
    IntLvlClr40x00000000中断级别清除/状态寄存器4 [存储器映射]
    STATUS40x00000000状态寄存器4 [存储器映射]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您提供寄存器内容。 FEDACSTATUS 寄存器显示发生了可纠正的错误、其中0被从地址0x34590中读取为1。 ESM 组1状态寄存器位6也显示了这个错误。 因此、CPU 的单位错误信令机制得到了验证。

    现在、您是否看到 R5实际压入栈、或者该指令是否更正为仅将 R3和 LR 压入栈? 您可以使用 R3、R5中的已知值检查同一断点处的堆栈内容、并查看它们是否都被压入堆栈。

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

    我很确定损坏的指令正在执行、而不仅仅是显示在调试器中。 我在推送命令上做了一个断点、然后运行到该命令。 此时、SP 寄存器为0x08000EC8。 我单步执行它、SP 寄存器更改为 0x08000EBC。 这向我表明有三个寄存器被压入堆栈。 此外、当我们从堆栈中弹出后、PC 寄存器变为0、因为 R5为零、并弹出到 PC 上。

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

    您可以在0x3459c 处放置一个断点、然后检查堆栈内容吗? 我想排除调试状态和 ECC 校正逻辑之间的任何交互。 此外、您能否读取 CPU 的可纠正故障位置寄存器(CFLR)?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CFLR 是否与 CCS 中 FlashWrapper 组中的 FCorErrAddr 相同? 当我在地址0x3459C 处中断时、该值为零。
    当我单步执行 PUSH 命令时、CCS 中显示的堆栈帧会中断。 我当前堆栈框下面的堆栈框显示"0x00000000 (未定义符号)"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我还应该研究其他什么吗?

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

    我将编写一个测试来检查这种行为、并向您返回我的结果。

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