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.

[参考译文] LAUNCHXL2-570LC43:在遇到异常向量后使用 CCS 调试调用栈

Guru**** 2589300 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1130544/launchxl2-570lc43-debugging-call-stack-using-ccs-after-exception-vector-is-encountered

器件型号:LAUNCHXL2-570LC43

我有一个故障/故障、需要确定、在 XL2-570LC43上运行裸机软件。  基本上、我有使用中断在 CAN 上持续传输的代码、并且在运行大约2小时后、代码遇到故障、导致触发其中一个低电平(复位、undef、预取)中断向量。  在这种情况下、CCS 不会显示调用栈。  在2+小时内、已发送了数百万条消息、因此不能清除这是软件的 CAN 部分的错误。  可能类似于一些未处理的中断。  我看到的故障不仅发生在一个矢量上、而且在不同的时间发生复位、undef 和预取。

resetEntry:
       b  _BL_c_int00
解 defEntry:
       b  未定义尝试
svcEntry:
       b  svcEntry
PrefetchEntry:
       B  prefetchEntry

是否有人已经有了一种好的方法来执行此操作、或者我应该找出 ARM (大端字节序)堆栈框并编写我自己的调试代码?

基本而言、我需要做的是、在该线程的末尾执行的操作...

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/688822/tms570ls1224-bootloader-application-jump-leads-to-undefentry-after-interrups-are-enabled

如果 CCS 能够做到这一点、那就很好了、就像正常堆栈框被显示用于分析一样。  可能需要目标端代码的帮助。

非常感谢您的任何帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="521569" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1130544/launchxl2-570lc43-debugging-call-stack-using-ccs-after-exception-vector-is-encountered ]如果 CCS 具有执行此操作的工具、则会非常好、相同的方式显示正常的堆栈框架以进行分析。  [/报价]

    虽然 CCS 目前没有对此提供任何内置支持、但在 Cortex-M4F 器件中、以前使用了自定义 GEL 脚本来解压堆栈、从而使 CCS 显示异常的上下文。 请参阅 CCS/TM4C1294KCPDT:如何在异常处理程序中使堆栈解开?

    为了处理 Cortex-M4F 和 Cortex-R5F 之间异常堆栈帧的任何差异、需要对 GEL 脚本进行一些更改、但可能会形成一个起点。

    至少对于 GEL 脚本、它只在 CCS 中的 PC 上运行、而不需要目标端代码。

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

    您好!

    我需要有关调试的认真帮助。  几天前、我发现了上述问题、结合了"自发"复位、undefEntry 或 prefetchEntry 错误、运行时间长达8或10小时、才遇到错误。

    从昨天开始,问题已变为自发重置或 DataEntry 错误之一,可能在10分钟到几小时内发生。  这可能是"更好或更差"的、具体取决于延长运行时间是可取的、还是更快地遇到一些错误、这样可以进行更多的实验或分析。  当发生 DataEntry 错误时、故障地址 R14_ABT (不一定)不在同一位置(与预期的情况相同)。  我相信 R14_ABT - 0x8是故障 PC、基于一些论坛文章。  我甚至不能确定追踪 DataEntry 错误是否会导致我的实际原因、但这是一个开端、而且持续/经常发生。

    有一点、我不知道症状是如何发生如此大的变化(从 undefEntry 和 prefetchEntry 到 DataEntry、运行时间为6小时以上到几分钟)、因为我没有以任何真实方式更改我的源代码。  从某种意义上说,似乎的"稳定性"一夜就蒸发了。

    无论如何、我不知道要采取哪些步骤来解密 DataEntry 故障。  我不太确定我处于哪种处理器模式(我认为是用户、或者可能是中断)。  我曾尝试查看过其他数据中止论坛文章和《技术参考手册》、但尚未对需要执行的步骤获得可靠的处理。  其中有几篇文章未介绍调试步骤、但似乎已找到解决方案、而不必真正使用调试结果进行修复。  我要解决的一个问题是寄存器的数量以及特定寄存器的确切功能(有时甚至不确定在哪里可以找到特定文章中提到的寄存器)。

    非常感谢您帮助我使用 Cortex-R5F 确定必要的调试步骤、或指导我获得正确的信息。

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

    因此、在一个故障情况下、我看到 R14_ABT 为0x112cc、这将导致 PC 为0x112c4。  我看一下汇编器、它似乎从[R13](链接/帧寄存器??)加载了 r0 (内核寄存器值)。  R13的值为0x8002800 (包含0)、这应该是我的未定义栈基址(与默认值相比、我将堆栈的大小加倍、以防遇到某些堆栈溢出问题)。  C 代码应该与一些 CAN 消息框 FAICT 一起使用。  不知道未定义栈的用途是什么、即使我查看的是正确的 R13。

    我不知道我是如何到达这里的。  非常感谢您的任何帮助。

    000112b0:E59DC00C LDR R12、[R13、#0xc]
    000112b4:E35C0008 CMP R12、#8
    000112b8:3AFFFFEE Blo $C$L107
    2603节点->IF1NO =(uint8) MessageBox;
    C$L108:
    000112bc:E59D0000 LDR r0、[R13]
    000112c0:E5DDC007 ldrb R12、[R13、#7]
    000112c4:E5C0C103 strb R12、[r0、#0x103]
    2605成功= 1U;
    000112c8:E3A0C001 MOV R12、#1
    000112cc:E58DC010 str R12、[R13、#0x10]
    2614返回成功;

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

    实际上、0x8002800是未定义的堆栈基地址、因此代码似乎在栈外读取以获取0值。  不知道 R13为什么保持该值。

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

    我尝试获取 GEL 项目并将其移植到 XL2-570LC43、但无法确定它应该如何工作。  通过一些微调、我能够编译和加载代码、但不知道代码应该如何运行(如果代码正在运行)。  我之前的大多数/所有项目都将在 hl_sys_main.c 中的 main()停止启动、但这个项目不会(如果需要、不知道在何处放置断点)。

    我可能需要改进更多事情。

    谢谢。

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

    尊敬的 Peter:

    您是否已解决问题?

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

    我以完全不同的方式"解决"了我的问题(似乎需要在异常向量之间跟踪栈的问题)。  我非常希望能够在 TMS570-LC43上获取 GEL 项目、该项目可能会在没有目标代码支持的情况下跨异常向量执行栈跟踪。  这将有助于我调试未来的 oddlball 问题、也有助于我更好地了解这个特定的 ARM 处理器是如何运行环境和堆栈/寄存器的。  现在、我仍然经常猜测处理器是如何工作的(使用其他更简单的较旧处理器的经验)。

    您是否认为移植 GEL 项目是一个可行的目标、或者我是否应该放弃这一愿望?  实际上、(灾难性)异常向量的大多数情况都是由一段时间前发生的错误内存脚本写入引起的、堆栈跟踪无论如何也不会产生太大的帮助。

    非常感谢。

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

    尊敬的 Peter:

    我不知道如何使用 GEL 工程来跟踪堆栈使用情况。 您是否知道有任何 MCU 或 MPU 器件使用此方法来跟踪堆栈?   

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

    大家好、Chester 认为、GEL 工具应该能够跟踪堆栈、因为它只是一种"宏"语言、以人类解释编译器/架构构造的相同方式来解密机器状态。  我对 ARM 架构不太熟悉(目前)、但我正在慢慢地学习如何手动执行此操作。  我将在另一个线程中对 ARM 提出一些问题。  根据我所能知、当发生异常时、ARM 将进入不同的机器模式、并保持故障模式不变(使用其寄存器和堆栈)、因此堆栈布线更容易。  CCS 调试器本身在为用户提供机器状态可视性方面已经非常"强大"、但现在用户仍然需要连接点。  大概是、GEL 工具可以做什么(帮助连接点)构建到 CCS 中(在未来的版本中?)。

    我已经使用了 GDB 很多、并且使用了它的"宏"功能来解密 C++结构。  C++中有许多令人难以置信的模糊之处、典型的 C++编程人员无法理解、必须将其视为黑盒。  有人写的 GDB 宏程序确实帮助我找出了一些奇怪的东西(有迭代器的东西等)。  同样、宏程序本来可以内置到 GDB 中、但通过加载项执行此操作的能力足够好。

    一般来说、软件开发工具(IDE、调试器等)在近几十年来为编程人员提供了很大帮助。  近年来、我使用了 Visual Studio Code、并对它提供的支持程度、尤其是其大量的附加扩展印象深刻。  近年来、我使用了 DDE (GDB 的图形前端)、它对多线程分析的支持令人印象深刻。

    总之、这些工具使思想简单的编程人员的生活变得更加轻松、尤其是在解码重复内容(例如 C 到汇编器转换)方面、但编程人员仍然需要知道如何在各个级别连接点。

    谢谢。