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.

[参考译文] TMS570LS0332:FMC -不可纠正的错误:总线1和总线2接口

Guru**** 2925280 points

Other Parts Discussed in Thread: TMS570LS0332

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/864993/tms570ls0332-fmc---uncorrectable-error-bus1-and-bus2-interfaces

器件型号:TMS570LS0332

您好!

我们在设计中使用的是 TMS570LS0332。 当应用程序正在执行时、我们会偶尔看到 FMC -不可纠正的错误。 这属于 ESM 模块的通道7组3。

软件在启动时检查一次闪存存储器的完整性。 没有问题。 在应用程序执行时会发生这种情况(一段时间后、两个小时后会发生一些情况、有时会发生更多情况)。  

您能否评论一下为什么会发生这种情况?  此外、您能否向我们建议调试该问题的最佳方法?

以下链接也可能相关。

https://e2e.ti.com/support/microcontrollers/hercules/f/312/t/779080

谢谢、此致、

Sreekanth Challa

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

    Sreenekanth、您好!

    是否可以发布 FEDACSTATUS 寄存器和 FUNC_ERR_ADD 寄存器的值? 您是否在代码中访问 ECC 和 OTP 存储器区域?

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

    尊敬的 QJ Wang:

    经过一段时间的测试、我找到 了 FUNC_ERR_ADD 值。 FUNC_ERR_ADD = 0xFFF8

    我认为这与以下链接中指定的问题相同。  

    https://e2e.ti.com/support/microcontrollers/hercules/f/312/t/779080

    如上述链接中所指定、我们在微控制器存储器中安装了两个可执行文件。

    启动加载程序(从0x0000到0xFFFF)

    应用(从0x10000到0x2FFFF)

    如您所见、 FUNC_ERR_ADD = 0xFFF8位于引导加载程序存储器中。  bootlooader sys_intvecs.asm 文件如下所示。  

    resetEntry
    b _c_int00
    UndefEntry
    b #0xFFF8;undefEntry
    svcEntry
    b #0xFFF8;svcEntry
    PrefetchEntry
    b #0xFFF8;prefetchEntry
    DataEntry
    b #0xFFF8;DataEntry
    b #0xFFF8;phantomInterrupt
    LDR PC,[PC,#-0x1b0];中断的硬件控制。 因此没有影响(IRQ)
    LDR PC、[PC、#-0x1b0];需要在应用程序代码中处理。 频率

    应用程序从0x10000开始、 "sys_intvecs.asm"文件内容如下。

    resetEntry
    b _c_int00
    b _expt_vec_udef_instr
    b _Svc
    b _expt_vec_abort_pref
    b _expt_vec_abort_data
    b 相位中断
    LDR PC、[PC、#-0x1b0]
    LDR PC、[PC、#-0x1b0]

    如果您看到引导加载程序中的所有异常都使用了0xFFF8。 这允许软件跳转到应用程序。 以黄色突出显示。

    我们在 TI CAN 引导加载程序示例中找到了这种跳跃方法。   

    其他信息->应用程序中的某些文件与引导加载程序具有不同的优化。 我还认为这是造成问题的原因。

    谢谢、此致、

    Sreekanth Challa

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

    您好!

    您可以就此发表评论吗? 我们对这一问题缺乏我们方面的想法。

    谢谢、此致、

    Sreekanth Challa  

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

    您好 QJ、

    一段时间之前、您已经声明可以通过编译器优化设置重现 nERROR 问题。 您是否曾进行过调查并听取了编译器团队的反馈? 我们看到所述问题与编译器优化之间存在密切关联。 感谢您的反馈。

    http://e2e.ti.com/support/microcontrollers/hercules/f/312/t/705563?CCS-TMS570LS0332-Optimizations-in-CCS-Vs-Controller-ESM-interrupt-Abort-related-to-Flash-memory

    -Stefan

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

    您好!

    应用程序是否编程为0x10000? 如果应用程序的起始位置不是0x10000、引导加载程序的跳转指令将导致中止、或者引导加载程序中的任何异常也将导致中止。 要将应用程序加载到0x10000、必须修改应用程序的内衬命令文件:

    引导程序(X):origin=0x00010000 length=0x00000020
    Flash_code (RX):origin=0x00010020 length=0x8000 - 0x20 fill=0xFFFFFFFF /*扇区8/9/10/11用于应用*/

    2.在启用 SECDED 前、必须将整个闪存组的 ECC 值编程到闪存中。 这可以通过在引导加载程序的链接器命令文件中生成正确的 ECC 值来完成。 附件是示例。

    e2e.ti.com/.../2626.bl_5F00_link.cmd

    3、Cortex-R4/5处理器有一个系统控制协处理器、CP15。 CP15提供了读取有关中止的其他信息的可能性。 CP15中保存中止原因信息的寄存器为:

    •数据故障状态寄存器

    •辅助故障状态寄存器

    •数据故障地址寄存器

    •指令故障地址寄存器

    请在 CCS 寄存器窗口中检查这些寄存器:

    4.预取中止和数据中止

    如果 CPU 尝试从受保护或有故障的存储器位置执行指令、CPU 将获得预取中止。

    • 存储器位置未在系统中实现、
    • 存储器区域受 MPU 保护、
    • ECC 检查逻辑在数据中检测到错误。

    如果数据是从受保护或有故障的存储器位置读取或写入的、CPU 将接受数据中止。 这可能是因为:

    • 未实现存储器位置
    • 存储器位置在特权模式下(处理器处于用户模式时)为只读或写
    • 存储器位置由 MPU 进行读取或写入保护
    • ECC 检查逻辑在数据中检测到错误

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

    尊敬的 QJ:

    感谢您的回答。 请查看我对您指定的每个要点的评论。

    应用程序是否编程为0x10000? 如果应用程序的起始位置不是0x10000、引导加载程序的跳转指令将导致中止、或者引导加载程序中的任何异常也将导致中止。 要将应用程序加载到0x10000、必须修改应用程序的链接器命令文件:

    引导程序(X):origin=0x00010000 length=0x00000020
    Flash_code (RX):origin=0x00010020 length=0x8000 - 0x20 fill=0xFFFFFFFF /*扇区8/9/10/11用于应用*/

    是的。 没错。 已正确指定应用程序链接器文件。  

    2.在启用 SECDED 前、必须将整个闪存组的 ECC 值编程到闪存中。 这可以通过在引导加载程序的链接器命令文件中生成正确的 ECC 值来完成。 附件是示例。

    我们使用引导加载程序通过 FlashAPI 刷写整个存储器。 因此、这没有问题。  

    整个闪存意味着什么? 例如、如果应用程序映像仅为195KB、则引导加载程序仅擦除所需的存储器并对其进行重新编程。 在对映像进行编程时、使用具有 Fapi_AutoEccGeneration 的闪存 API 一次对16个字节的闪存进行编程。

    3、Cortex-R4/5处理器有一个系统控制协处理器、CP15。 CP15提供了读取有关中止的其他信息的机会。 CP15中保存中止原因信息的寄存器为:

    我们没有研究这些寄存器。 因为当我们让控制器运行几个小时时、问题会偶尔发生一次。 一旦我再次遇到问题、我将使用这些值进行更新。   我找到 了 FUNC_ERR_ADD 值。  FUNC_ERR_ADD = 0xFFF8。

    4.预取中止和数据中止

     我们确实了解它们。  

    我还有一个问题。 我们的应用中确实包含一个安全库。 (v2.2.0)。  

    CCS 版本    : 6.1.0.00104  

    编译器版本:TI v5.2.9

    如果您看到以下票证、则也会出现闪存错误、错误地址为0xFFF8。 我坚信这完全是同一个问题。

    谢谢、此致、

    Sreekanth Challa

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

    尊敬的 QJ:

    在我的最后一个回复中添加了几个要点。

    我们没有针对整个项目进行优化。 仅针对如下所示启用的选定文件优化。

    2.如果我为整个项目启用优化、安全库本身将不起作用。 这将创建预取中止。  

    3.当我在 "exception_handlers.c"文件中查看"_excpt_vec_abort_data"函数的代码时、使用如所附图片中所示的汇编代码实现返回用户/系统模式(在 abort 处理程序函数的末尾)。  

    并非所有优化都是如此。 这可能只适用于没有优化的情况。  

    谢谢、此致、

    Sreekanth Challa

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

    您好!

    我在上一帖子中附加的链接器命令文件可用于计算整个闪存的 ECC、并且 ECC 将在加载时进行编程。  

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

    尊敬的 QJ:

    您对此问题有什么意见吗? 我们非常确信闪存编程正确。 在启动时对整个闪存执行一次完整的 CRC 校验。  似乎根本没有问题。

    谢谢、此致、

    Sreekanth Challa

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

    您好!

    FUNC_ERR_ADD = 0xFFF8

    您的应用程序是从该地址读取数据还是将数据写入该地址?

    正如我上次提到的、请使用链接器 CMD 文件对整个闪存的 ECC 进行编程。

    1.使用此处为引导加载程序附加的链接器 cmd 文件

    e2e.ti.com/.../4341.bl_5F00_link.txt

    2.在 CCS 中加载引导加载程序时、请取消选中"Auto ECC Generation"并选中"None"以查看闪存验证设置。

     

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

    尊敬的 QJ:

    感谢您的回答。 以下是蓝色问题的答案。

    您的应用程序是从该地址读取数据还是将数据写入该地址?

     ->否 它不会也不应该。 正如我在上面的一篇文章中提到的、  

    bootlooader sys_intvecs.asm 文件如下所示。  

    resetEntry
    b _c_int00
    UndefEntry
    b #0xFFF8;undefEntry
    svcEntry
    b #0xFFF8;svcEntry
    PrefetchEntry
    b #0xFFF8;prefetchEntry
    DataEntry
    b #0xFFF8;DataEntry
    b #0xFFF8;phantomInterrupt
    LDR PC,[PC,#-0x1b0];中断的硬件控制。 因此没有影响(IRQ)
    LDR PC、[PC、#-0x1b0];需要在应用程序代码中处理。 频率

    因此、它应该跳转到应用程序起始地址。 (即0x10000)。

    我还有一个问题->您认为堆栈溢出是否会导致此问题? 我在软件中执行了堆栈溢出检查。 这似乎没有问题。  

    谢谢、此致、

    Sreekanth Challa

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

    Sreenekanth、

    闪存存储器中的这个双位 ECC 错误也应该导致一个预取/数据中止。 调试根本原因的最佳方法是在中止处理程序中使用 CPU 的故障地址和状态寄存器。 您可以使用中止模式链接寄存器来识别导致故障的指令。 这样可以很好地了解中止的根本原因以及访问地址0xFFF8的原因。

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

    尊敬的 Sunil:

    我们通过监控 CPU 故障寄存器来解决该问题。 我想让这个帖子保持打开一段时间。

    谢谢、此致、

    Sreekanth Challa

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

    尊敬的 QJ:

    如何访问软件中的 CP15寄存器?  我在控制器存储器映射或参考手册中看不到寄存器。 我假设这些是 ARM 内核的寄存器。 我在 ARM 网站中也找不到寄存器的起始地址。

    请就此发表评论。 非常感谢。

    此致、

    Sreekanth Challa

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

    您好!

    ARM cortex-Rx 处理器整合了 CP15以进行系统控制。  CP15 可实现紧耦合存储器(TCM)和保护单元(MPU)的配置、并提供系统状态信息。

    CP15寄存器 只 能在特权模式下使用 MRC 和 MCR 指令访问。 MCR 和 MRC 指令的指令位模式显示在 ARM TRM 中。  

    http://infocenter.arm.com/help/topic/com.arm.doc.ddi0363g/DDI0363G_cortex_r4_r1p4_trm.pdf

    您可以通过 CCS->寄存器读取 CP15寄存器:

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

    尊敬的 QJ:

    感谢您的回答。 我们实时遇到问题。 我们希望捕获该值并通过 CAN 发送该值。

    非常感谢、致以最诚挚的问候、
    Sreekanth Challa
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sreenekanth、

    有关如何从故障地址和状态寄存器中读取数据的说明、请参阅 Cortex R4参考手册:

    https://developer.arm.com/docs/ddi0363/g/system-control/register-descriptions/fault-status-and-address-registers