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:数据中止异常-查找指令

Guru**** 2894810 points

Other Parts Discussed in Thread: HALCOGEN, TMS570LS0432, TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/923514/tms570lc4357-data-abort-exception---find-instruction

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

大家好、

在我们的其中一个项目中、我们有一个偶发的"数据中止异常"。 "数据故障状态寄存器"读取0x0000080D。 TRM 告诉我这是写入权限错误。

我希望能够通过评估 读取0x00000000的"数据故障地址寄存器"来跟踪导致异常的指令。 这就是我产生困惑的地方、这实际上意味着什么?

此致、
Juergen

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

     Juergen、您好!

    您的 MPU 设置是什么? 数据中止可以是精确的、也可以是不精确的。 发生精确中止时、DFAR 保存故障地址。

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

    您好 QJ、

    感谢您的回复。 我对 MPU 不太熟悉、因此我不确定如何回答您的问题。 下面您可以看到 MPU 的 Halcogen 设置。

    该项目广泛使用 EMIF 上的外部 RAM、不确定这是否是提示。 EMIF 设置在区域10中。

    谢谢、此致、

    Juergen

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

    Juergen、您好!

    对于基于 Cortex-Rx 的器件、不能从具有器件或严格排序存储器类型属性的区域执行指令。 处理器将此类区域视为具有 XN 权限。 不要尝试从 EMIF 存储器执行代码?

    您是否单步执行代码并找到导致数据中止的函数?

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

    您好 QJ、

    不能省略 EMIF 访问、项目使用非常大的数据缓冲区、这些缓冲区只能在外部 RAM 中分配。 我有理由相信,EMIF 无论如何都不是问题。  

    我希望我可以单步执行导致问题的代码。 不幸的是、硬故障只是偶尔发生。 我的目标是找到导致问题的代码。

    在数据中止异常的具体情况下、"数据故障状态寄存器读取"0x00001008 。 因此、5位状态等于0b01000、这表示"Synchronous External Abort"、VAR 应该对此有效。 此外、它还显示了它是一个读取访问。 由于它是一个外部中止、因此 SD 位= 1意味着它是一个"AXI 从器件错误"。

    DFAR 读取 0x02096B1F、这是保留的存储器空间。  

    我想知道上面的信息是否允许我追溯到导致异常的指令。

     

    谢谢、
    Juergen  

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

    您好 Juergen、

    导致代码访问了一个不存在的内存位置。  

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

    您好 QJ、

    这就是 DFAR 告诉我的信息。 问题是、是否有方法可以追溯到导致它的代码段。

    此致、
    Juergen

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

     Juergen、您好!

    值 R14_abt 是多少? 是否清除了 nERROR 引脚? 是否设置了任何 ESM 状态标志? 找到根本原因并不容易。  

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

    [引用]我想知道上面的信息是否允许我追溯到导致异常的指令。[/引用]我在 CCS 中查看如何检查此类故障、其中包含一个故意尝试从无效地址 0x02096B1F 读取的程序

    在 CCS Tools -> ARM Advanced Features 中、选择 Vector catch -> Non-Secure 下的"break on Data Abort":

    让程序运行、直到发生数据中止。 使用默认的 HalCoGen 中断配置时、没有特定的数据中止处理程序、因此当调试器捕获到数据中止时、PC 将位于  HalGoGen 生成 的 HL_SYS_intvecs.asm 中的"b DataEntry"。

    在 CCS Registers 视图中、找到 Abort_Registers 的值:

    和用户寄存器:

    在"Registers"视图中、转到"Core Registers"、然后手动将寄存器设置为:

    • PC:R14_ABT - 8的值,这是生成同步数据中止的指令(如果存在异步数据中止,指令可能不准确。 减去8的原因由  异常进入和退出摘要解释
    • SP:R13_user 的值。

    因此、对于上述示例集:

    • PC = 0x00004120-8 = 0x00004118
    • SP = 0x08000FE8

    手动设置 PC 和 SP 会将 CCS 调试上下文更改为发生数据中止的上下文、并允许您检查栈上的局部变量。 示例显示了读取 BAD_PTR (0x02096B1F)无效地址的行:

    如果程序已崩溃、则可能是堆栈已被覆盖/损坏、这可能会妨碍确定原因。

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

    切斯特、您好!

    非常感谢您提供有关如何追溯数据中止的详细说明。 这看起来非常有希望。 但是、我无法启用"数据中止时中断"、控制台显示:

    --------------------------------------------------------------------

    CortexR5:GEL 输出:闪存的存储器映射设置@地址0x0CortexR5:

    读取寄存器 REG_AHB_DOWNLOAD 时出现问题:未找到1627402249的映射寄存器

    --------------------------------------------------------------------

    不确定这意味着什么以及如何修复它。

    我在我们基于操作系统的项目中尝试过它。 它具有用于异常到中央异常处理程序的分支指令。 不过、我认为这一点无关紧要。

    此致、

    Juergen

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

    [引用用户="JU_We"]

    但是、我无法启用"数据中止时中断"、控制台显示:

    --------------------------------------------------------------------

    CortexR5:GEL 输出:闪存的存储器映射设置@地址0x0CortexR5:

    读取寄存器 REG_AHB_DOWNLOAD 时出现问题:未找到1627402249的映射寄存器

    [/报价]您是否使用 Segger J-Link?

    原因是我最近在 将 Segger J-Link 与 TMS570LS0432搭配使用时看到该错误、但每次执行停止时(https://e2e.ti.com/support/tools/ccs/f/81/p/913701/3421743#3421743)

    我尚未尝试通过 Segger J-Link 和 TMS570LC4357的组合启用"数据中止中断";XDS110用于上述测试。

    与启用'break on Data Abort'不同、在到中央异常处理程序的分支指令上设置断点应具有与在异常处理程序修改任何寄存器之前停止相同的效果。

    理论上、中央异常处理程序可以采取步骤转储导致数据中止的调用栈、但我目前没有任何这方面的示例、更容易尝试使用 CCS 调试器。

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

    您好 Juergen、

    您是否捕获了 R14_abt? 正如 Chester 所说、您可以找到地址(R14_abt - 0x8)、如果数据中止是精确中止、则会生成数据中止。

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

    您好!

    在回到难以复制的现实问题之前、我还故意强制 CPU 执行数据中止。 看看我是否获得有意义的结果。 适用于同步中止、不适用于异步中止。  

    在 CCS 中、结合 Segger 的 J-Link、我无法读取 USER_Registers。 当我无法设置"数据中止时中断选项"时、似乎与问题类似

    不过、IAR 工作正常、我可以跟踪导致同步中止的指令。  

    对于同步中止(从错误地址读取)、DFSR 值为 :0x00001008 ->同步外部中止/读取。 只是想知道 DFAR 中的值(0x02096B1F)是什么意思、因为它应该是有效的。

    对于异步中止(写入错误地址)、DFSR 值为 0x00001C06 -> 异步外部中止/写入。

    还想知道是否有一种调试异步中止的方法。 《技术参考手册》在第2.3.2.4章中讨论了 SPSR 中的 A 位。 它听起来像是设置 A 位屏蔽不精确中止。 是否有可行的方法来利用它来同时调试异步中止?

    此致、
    Juergen

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

    与 Chester 的示例一样、R14_abt - 0x8 将向您显示读取了无效 BAD_PTR 地址(0x02096B1F)的行。

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

    您好!

    正如我在上一篇文章中提到的、我能够复制  切斯特的示例、当我按照切斯特的指令执行操作时、找到同步中止的指令没有问题。 我想知道、如果发生异步中止、是否有一种方法可以追溯到指令。 我通过写信给坏地址而不是从坏地址中读来刺激这一点。

    无论如何、我只是想从这些示例中学习、但这些示例与我再次重复的实际问题有所不同:

    当到达地址0x10处的断点时、根据 ARM TRM、DFAR 为0x0000080D ->写入权限故障:

    这让我回到了我的第一篇帖子:

    A)我甚至不知道我在追逐什么、什么会导致权限错误?  当错误发生时、MPU 的 MPUERRSTAT 寄存器为0。

    b)对于权限故障、DFAR 应该是有效的并且读取为0。 不知道这告诉我什么。

    此致、

    Juergen

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

    您好!

    我记得您的原始问题。 DFAR 不会在不精确(异步)中止时更新。 通常无法找到异步中止。 权限故障可能与 MPU 设置有关、下图是使用 HALCOGen 设置 MPU 的示例: