我可以使用什么简单的方法来调试没有串口或视频的嵌入式处理器?

StackOverflow https://stackoverflow.com/questions/69492

  •  09-06-2019
  •  | 
  •  

我们有一个小型嵌入式系统,没有任何视频或串行端口(即我们无法通过 printf 输出文本)。
我们希望通过初始化序列来跟踪代码的进度。
我们可以做一些简单的事情来帮助解决这个问题吗?
它不运行任何操作系统,并且硬件平台在某种程度上是可定制的。

有帮助吗?

解决方案

最简单且可扩展的解决方案是状态 LED。根据操作切换 LED,可以是二进制形式,也可以是当某些操作发生时(如果您可以缩小焦点)。

最强大的是硬件 JTAG 设备。您甚至不需要设置断点 - 只需停止应用程序并检查内存状态就足够了。请注意,某些硬件平台不支持“花哨”选项,例如内存监视或硬件断点。前者通常通过不断停止处理器和读取内存来解决(将 10MHz 系统变成 1kHz 系统),而后者有时通过代码替换(用不同的跳转替换目标指令)来解决,这有时会掩盖其他问题。请注意这些问题以及它们适用于哪些嵌入式处理器。

其他提示

您可以采用一些策略来帮助调试:

如果您有可用的输出引脚,则可以将它们连接到 LED(或示波器)并切换输出引脚高/低以指示已达到代码中的某些点。
例如,闪烁 1 次可能是程序加载,闪烁 2 次是 foozbar 初始化,闪烁 3 次正在接受输入...

如果您有多个可用输出线,则可以使用 7 段 LED 来传达更多信息(数字/字母而不是闪烁)。

如果您具有读取内存的能力并且有一些可用的 RAM,则可以使用 sprint 函数进行类似 printf 的调试,但它不是转到屏幕/串行端口,而是写入内存中。

这取决于您尝试执行的调试类型 - 特别是如果您正在寻求一种临时的跟踪方法,或者您正在尝试提供一种可以在程序生命周期内用作状态指示的工具。项目(或产品)。

一次性进行深入的源跟踪和调试在线调试器(例如jtag)会非常有帮助。然而,当您的调试需要设置断点并调查内存和寄存器时,它们是最有帮助的 - 这使得它在处理时间关键问题时几乎没有什么好处。

如果您需要确定程序状态而不会对系统的执行产生重大影响,则使用连接到备用 I/O 引脚的 LED 将很有帮助。这些也可以用作数字存储示波器 (DSO) 或逻辑分析仪的输入。通过选择 DSO 上可识别的独特脉冲模式,可以使该技术变得更加强大。

不过,对于更通用的调试工具,串行端口是一个很好的解决方案。为了节省成本和 PCB 空间,您可能会发现使用包含 RS232 转换器的插件模块很有用。

如果您试图提供长期的状态指示作为产品正常运行的一部分,那么 LED 又是一种廉价且简单的方法。然而,在这种情况下,最好选择足够慢的脉冲模式,以便通过目视检查轻松识别。随着时间的推移,这将使您学到代表“正常”行为的特定模式。

您可以使用系统 IO 引脚的位操作轻松模拟串行通信 (UART)。将其挂在卡的一个引脚上,然后连接到那里的 RS232 转换器(TTL 到 RS232 转换器很容易购买或构建),该转换器连接到 PC 的串行端口。

JTAG 调试器也是一种选择,但设置起来很麻烦。

如果您没有 JTAG,其他人建议的 LED 是一个好主意 - 尽管您确实往往会陷入测试/重建周期以尝试找出问题。

如果您有更多的时间、空闲的硬件引脚和空闲的内存,您可以随时对低速串行接口进行位攻击。我发现这在过去非常有用。

其他人提出了一些使用输出引脚的非常好的想法,所以我不会建议这样做,尽管它可能是一个非常好的解决方案,并且非常具有成本效益。如果您的预算和目标处理器支持,那么硬件跟踪系统(无论是老式模拟器,还是具有总线侦听跟踪支持的精美 BDM)对于此类事情可能非常有用。但它非常昂贵。

使用位元软件 UART 的想法很好,但编写一个需要一些努力,而且您还需要一些免费的计时器和中断。如果您的硬件有任何其他未使用的串行接口(SPI、I2C 等),那么使用它们会更容易。使用小型微控制器,您可以将接口转换为 RS-232。

如果您必须进行位敲击,则制作同步串行可能是一个更简单的替代方案,因为它对计时并不重要。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top