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/TDA2P-ACD:使用 Code Composer 调试 Cortex M4的 GCC 输出

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/699170/ccs-tda2p-acd-debugging-gcc-output-for-cortex-m4-using-code-composer

器件型号:TDA2P-ACD

工具/软件:Code Composer Studio

我们正在使用 GNU Arm 嵌入式工具链(developer.arm.com/.../gnu-rm) 和自定义 makefile 为 TDA2P 构建裸机软件。
要调试代码、我们需要使用 CCS 8.0.0.16和 XDS560v2调试器。 连接到目标并上载 ELF 工作正常、调试器停止在主函数的入口点。
我们使用的是无工程调试会话、因此我必须手动找到包含主控制的文件。

问题是设置断点仅适用于包含 main 函数的文件。 我可以使用"Step in"从其他源文件中逐步进入函数、而不会出现任何问题。
找到文件并单步执行代码工作正常、但设置断点不能按预期工作。 每个断点都是灰显的、即设置为非活动。 如果我尝试激活断点、我将收到以下消息:
"任何已加载符号中的代码都不与"filename"第 XXX 行关联。"

这是我的代码:

第186行:McSPIChannelDisable() 我在这里设置一个断点
第187行: u32_base_addr
、第188行: u32_通道); 

在"Disassembly"窗口中、我看到以下内容:

186. McSPIChannelDisable ( <-在第
9e004f80行:68B9设置了非活动断点 LDR R1、[r7、#8]
9e004f82:69B8 LDR R0、[r7、#0x18]
9e004f84:F000FD26 BL 0x9e0059d4 

当我尝试在地址9e004f80的反汇编视图中设置断点(折行函数调用)时、我可以在完全相同的源代码行(186)处看到活动断点、我之前曾尝试在该行中设置断点。  但这种方法不是一种选择、因为它非常耗时。

这些是我们的编译器和链接器调用(为了便于阅读、删除了 include 和目标文件名)。

arm-none-eabi-gcc.exe -mthumb -std=gnu99 -fno-short-enums -G3 -MD -MP -DSOC_TDA2PX -D_TI_ARM_V7M4_-mcpu=cortex-M4 -March =armv7e-m -c -o spi.o spi.c

arm-none-eabi-gcc.exe -specs=rdimmon.iprob-m-tex-m4=armv7e-mcums -imums -mf-nods -mcums -tex-mv7e-mcums -mcums -mv-mcums -rendip-m-r libs/ti.csl.aem4 libs/csl_uart_console.aem4 -lrdimon -LC -lm -o elf/out.elf 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Sascha、
    在无工程调试会话中调试 GCC 可执行文件时、我听说过类似的问题。 与调试器的源代码相关性似乎存在一些问题。 它可能是 DWARF 符号中的错误、也可能是目标文件解析器中的错误。 我们从未能够正确调查此问题、因为我们从未能够在本地重现此问题。 如果您可以提供一个小型通用测试用例(源文件和可执行文件)、则会非常有用、越简单越好。 所需的所有测试用例都是重现这样一个问题:在源文件中设置断点不起作用、而在反汇编视图中设置断点则起作用(然后、它将在以前不起作用的同一源文件中关联断点)。

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

    您好 Ki、

    我创建了一个包含两个 C 语言和一个汇编程序文件的小型示例项目。 我还包括了 ELF 输出和所有目标文件。 要构建它、只需运行 build.bat 文件即可。 在 CCS 中将代码作为 makefile 工程导入后、我使用包含的 tda2p.ccxml 文件通过无工程方法连接到目标。

    这就是我所做的:

    • 信号目标配置
    • 连接到 CortexA15_0
    • 在 scripts -> TDA2Px 多核初始化-> IPU1SSClkEnable_API 下启动 GEL 文件
    • 连接到 Cortex_M4_IPU1_C0
    • 加载程序
    • 在 src1目录中找到 main.c 的文件
    • 在第10行中设置断点(函数调用)
    • 继续、然后进入该步骤、转到"anone_file.c"
    • 尝试在第4行中设置断点(在 c = a + b 处)不起作用(对我来说、它甚至不会在代码视图中显示为非活动断点、但它会显示在"Breakpoints"视图中)
    • 在反汇编视图中在地址9e00014a 处设置断点会在代码的第4行中设置断点

    我使用 Windows 10 Pro 计算机来构建软件。 这是 CCS 版本信息

    Code Composer Studio
    版本:8.0.0.00016

    操作系统:Windows 10、v.10.0.10.0/Win32

    e2e.ti.com/.../ti_5F00_gcc_5F00_debug_5F00_test.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您提供出色的测试案例。 我可以重现此问题。 当然存在一些源代码相关问题。 我将为此文件一个错误、并找到一个解决方法。

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

    针对此问题提交了错误。 跟踪 ID:CCSIDE-3359

    到目前为止、已验证了一种权变措施。 创建包含源文件的虚拟工程。

    然后在 调试启动配置中引用项目

    请注意、在指定源查找路径时、请确保在"器件"字段中为多核目标选择了正确的 CPU。

    这是一种笨拙的解决方法、但却能做到这一点。 如果我找到更好的东西、我会告诉您。

    谢谢

    Ki

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

    [引用 USER="Ki-Soo Lee">这是一种笨拙的变通办法、但却做到了这一点。[/引用]使用 CCS 8.0.0.00016时、有一个使用 gcc-arm-no-eabi-7-2017-Q4编译器的 Cortex-A8项目。 CMake 生成的 makefile 文件用于编译、 并创建了一个"makefile 工程及现有代码"Eclipse 工程、以允许 CCS 浏览、编辑和调试工程。

    使用 main 获取 C 源文件并尝试使用断点的不同方法:

    1)在调试配置设置为自动运行到 main 的情况下、启动调试会话时会在 main 成功停止。

    2) 2)如果双击某个源代码行、则会获得 Eclipse 断点(小蓝色圆圈)、并且调试器不会在断点处停止。 修改源查找路径以添加包含源文件的特定目录不会更改行为。

    3) 3)如果选择源代码行并使用"Run to Line"、程序将在所选源代码行停止。

    4) 4)如果右键单击某个源代码行并选择"Breakpoint (Code Composer Studio)-> Breakpoint"、则获取 Code Composer Studio 断点(带有一个勾号的大蓝色圆圈)、程序在断点处停止。

    因此、创建一个包含源文件的虚拟项目似乎并不是一个完全可靠的解决方法。 测试2和4之间的行为差异是否提供了问题原因的线索?

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

    切斯特、您好!

    问题是使用了标准 Eclipse 工程而不是 CCS 工程。 当 CCS 工程与调试会话关联时、调试器将始终默认为 CCS 断点。 如果 Eclipse 工程与调试会话关联、则调试器将默认为 Eclipse 断点。 如果您希望调试器默认为 CCS 断点、则可以转到 Eclipse 工程的工程属性并启用默认为 CCS 断点的选项:

    谢谢

    Ki

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

    [引用用户="Ki-Soo Lee 的说法]问题是使用了标准 Eclipse 项目而不是 CCS 项目。谢谢、我不知道在使用标准 Eclipse 项目时启用 Code Composer 断点支持的选项。

    确认解决了我的问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的快速响应。 我们已验证两台 PC 上的变通办法、并且工作正常。