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.

[参考译文] CCS/TMDXRM57LHDK:卡在 PrefetchEntry -如何调试

Guru**** 2446730 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/633049/ccs-tmdxrm57lhdk-stuck-at-prefetchentry---how-to-debug

器件型号:TMDXRM57LHDK

工具/软件:Code Composer Studio

您好!

我正在开发一个使用 lwIP 库创建两台服务器的应用程序、即"数据"和"配置"服务器。 数据服务器每100ms 发送一次使用 DMA 接收的传感器数据。 Config 服务器发送传感器配置、在开始时每1000ms 读取一次。

现在,在执行过程中的某个看似是随机的*点,Config Server 将忽略其1000ms 的时序,并在每次调用 sys_check_timeouts()时发送。 在一小段时间(几毫秒)后、应用程序停止。 在 CCS Debug 视图中暂停它时、我可以看到它在   HL_sys_intvecs.asm 文件中的 b prefetchEntry 行挂起。 直到应用程序停止运行为止。

我非常感谢您提供有关如何调试这种情况的建议。

*几秒钟后以及半小时后、我观察到了这种行为。  

此致、

Lars

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

    1.编写一个 ISR 以进行预取、ISR 可能只包含一个 while 循环
    2.在此 while 处添加断点()
    3.当错误发生时,它运行到断点。
    4.打开"寄存器"窗口
    5.在 CP15下,您将找到“指令故障地址”和“指令故障状态”
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、感谢您的回复。  

    我不确定如何编写 ISR 以进行预取。 您能否提供可提供进一步说明的最小示例或指南? 对于给您带来的不便、我深表歉意、但由于这是我的第一个项目、我还没有体验过。

    此致、

    Lars

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

    我能不能将答案视为"否"?

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

    Lars、您好!

    QJ 已离开办公室几天、无法回复。 如果您已经到达 ISR 矢量表中的 b 预取条目位置、我认为您已经到达预取矢量并正在自行循环。 如果此时停止操作、则应能够执行 CP15检查 QJ 引用的内容。 此外、请查看其他 CPU 寄存器、例如 LR 寄存器、它将显示返回地址并让您了解问题发生的位置。

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

    感谢您的快速回复。 我从寄存器中获得了以下地址:
    CP15_instruction_FAULT_ADDRESS:0x20202020
    CP15_instruction_FAULT_STATUS:0x00000000
    LR:0x20202024

    在"Disassembly"视图中查看这些地址时、我只能看到"???? 存储器映射阻止读取0x20201D78 [code=0x20000 ]"

    我希望这是足够的信息来提供进一步的帮助。 如果不是、我会很乐意收集它。

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

    这通常意味着您的代码将分支到此地址、或通过未初始化或损坏的内容访问此地址。 这更难以跟踪。 除了通过在代码中输入断点、执行到断点、如果没有故障、将断点进一步放入代码中并重复、直到缩小故障发生位置、我没有真正好的方法来跟踪这些类型的问题。 您还可以在代码中放置标记(切换 GPIO、发送 UART 消息、使用全局变量根据代码的哪些部分已执行设置标记等)、以检查执行路径和错误发生的位置。 在这些情况下、跟踪功能也很好、但设置起来可能很棘手、而且购买的工具也很昂贵。

    在没有此错误的情况下执行代码的最后一点是什么? 即、最后一次进行的更改是什么? 这似乎是对 ECC 组的读取、其中8位数据用于填充整个字、但 LR 值指示下一个地址作为返回地址。 您的代码中是否有此值的任何地方、因为 ECC 诊断测试或最近的更改可能会读取 ECC 值? 另一种可能是与收费操作相关的、其中 ECC 是作为编程操作的一部分计算的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Chuck、

    感谢您的建议。 这可能需要我一些时间来缩小范围。 我不确定最后执行的代码是否没有错误。

    但是、我观察到、这仅在两台服务器都与客户端建立连接时发生。 如果只有一个连接、程序将无误地运行(就我所见)。