【问题标题】:How debugging works in MCU systems programmed in C在用 C 语言编程的 MCU 系统中调试的工作原理
【发布时间】:2014-02-12 21:20:06
【问题描述】:

据我了解,在 linux 系统上调试是通过 ptrace 系统调用完成的。
我想知道如何为微控制器(无操作系统)编写调试器。
为简单起见,让我们假设像 Arduino Due(基于 ARM)这样的板的软件调试器的情况。

  • 假设我对调试器在 Linux 和 Windows 上的工作方式有一个清晰的认识,我需要学习什么才能完成这样一个项目
  • 为 MCU 系统编程调试器会有多大不同? (我不能使用系统调用)
  • 是否可以通过 USB 或串行接口进行调试?
  • 我应该使用哪些语言? (C、C++、Arm 汇编)
  • armgcc 编译器如何帮助我完成项目(是否有 -g 等标志选项?)

我计划将调试器实现为命令行 Linux 实用程序。

【问题讨论】:

  • 阅读 Gdb internals 文档(现在是一个 wiki)
  • 我建议你看看 GDB debugger stubs。这些是使用 GDB 远程串行协议通过串行方式与 GDB 通信的小型、易于实现的代码片段。它记录在这里 (sourceware.org/gdb/current/onlinedocs/gdb/Remote-Protocol.html),一个例子在这里 (embecosm.com/appnotes/ean4/…)。然后,您将使用target remote 连接到您的开发板。该协议主要由以$ 开头的文本包组成,后跟一个命令及其参数,并以# 和一个校验和结束。

标签: c linux debugging embedded arduino


【解决方案1】:

大多数现代处理器,包括 Arduino Due 上的 ARM,都通过 JTAG 接口提供片上调试支持访问。 Cortex-M3 片上调试支持 8 个硬件断点和一些其他功能 - 代码在闪存中运行,您无法设置软件断点。

JTAG 接口本身相当简单,但您需要特殊的硬件来支持 PC。根据性能和功能的不同,JTAG 调试器的成本可能会有很大差异,从非常低到大笔资金。需要将 JTAG 连接到调试器软件的软件。 OpenOCD 是一个开源工具,用于将 JTAG/片上调试连接到 GDB,允许 GDB-ARM 托管在 PC 上以调试远程 ARM 目标。

理论上,您可以编写自己的软件来通过 JTAG 访问 OCD。我从未考虑在微控制器上实现目标托管调试器,尽管我在 ARM9、SrongARM 和 x86 上使用过 VxWorks,并且它对目标托管调试的支持有限。目标托管调试的实用性受到缺乏可用于托管调试器以支持源级调试的源代码和符号表信息的限制。

即便如此,我相信可以从目标本身访问片上调试,请参阅ARM's documentation for details.

【讨论】:

  • 还有一种中间可能性 - 远程调试,其中调试器程序和符号表位于开发机器上,但使用在目标而不是 JTAG/SWD 上运行的 gdbserver 之类的存根。虽然如果目标完全不起作用,这将不起作用,但它确实具有优势或在异步串行、USB 或网络等最终用户接口上运行 - 与需要仅调试电气连接的 JTAG/SWD 不同。跨度>
  • @ChrisStratton:是的,但调试存根仍需要访问 CoreSight OCD 以在从 Flash 运行的代码中设置断点。
猜你喜欢
  • 2017-04-16
  • 1970-01-01
  • 2017-12-25
  • 2023-01-28
  • 2015-02-21
  • 2021-10-28
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多