5

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

4

8 回答 8

10

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

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

于 2008-09-16T04:59:27.850 回答
5

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

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

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

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

于 2008-09-16T04:55:39.263 回答
2

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

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

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

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

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

于 2008-09-16T10:56:05.607 回答
2

You can easily emulate serial communications (UARTs) using bit-banging from the IO pins of the system. Hook it to one of the card's pins and attach to a RS232 converter there (TTL to RS232 converters are easy to either buy or build), which goes to your PC's serial port.

于 2008-09-17T16:14:07.020 回答
0

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

于 2008-09-16T04:58:28.650 回答
0

如果您没有 JTAG,其他人建议的 LED 是一个好主意 - 尽管您确实倾向于最终进入测试/重建周期以尝试追踪问题。

如果您有更多的时间、备用的硬件引脚和可用的内存,您总是可以对低速串行接口进行 bit-bash。我发现这在过去非常有用。

于 2008-09-16T09:20:13.200 回答
0

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

于 2008-09-16T18:58:29.113 回答
0

The idea of using a bit-banged software UART is nice, but there's some effort required in writing one and also you need some free timers and interrupts. If your hardware has any other unused serial interface (SPI, I2C, ..), using them would be easier. With a small microcontroller you could convert the interface to RS-232.

If you have to go for the bit-banging, making a synchronous serial might be a simpler alternative as it wouldn't be critical to timing.

于 2009-04-23T20:45:54.490 回答