在没有串行端口或者视频的情况下,我可以使用哪种简单的方法来调试嵌入式处理器?

时间:2020-03-05 18:55:09  来源:igfitidea点击:

我们有一个小型的嵌入式系统,没有任何视频或者串行端口(即,我们无法通过printf输出文本)。
我们想通过初始化序列跟踪代码的进度。
我们可以做一些简单的事情来吗?
它没有运行任何操作系统,并且硬件平台是可以自定义的。

解决方案

回答

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

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

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

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

回答

JTAG调试器也是一个选项,尽管设置很麻烦。

回答

最简单,最具扩展性的解决方案是状态LED。如果我们可以缩小焦点,则可以基于动作(以二进制形式或者发生某些动作时)切换LED。

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

回答

如果我们没有JTAG,则其他人建议的LED指示灯是一个好主意,尽管确倾向于以测试/重建周期结束以试图找出问题所在。

如果我们有更多的时间,还有备用的硬件引脚和备用的内存,则可以随时对低速串行接口进行位冲击。我发现过去非常有用。

回答

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

首先,深入地跟踪和调试在线调试器(例如jtag)可能会很有帮助。但是,它们在调试需要设置断点并调查内存和寄存器的地方最有用,这在处理时间紧迫的问题时几乎没有好处。

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

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

如果我们要长期提供状态指示,作为产品正常运行的一部分,LED再次是一种便宜的简单方法。但是,在这种情况下,最好选择足够慢的脉冲模式,以便通过目视检查容易识别。随着时间的流逝,我们将学会所有代表"正常"行为的特定模式。

回答

其他人提出了一些使用输出引脚的不错的主意,所以我不建议这样做,尽管这可能是一个很好的解决方案,并且非常经济。如果预算和目标处理器支持它,那么硬件跟踪系统(老式的仿真器或者带有总线侦听跟踪支持的高级BDM)可能适合此类情况。不过,它非常昂贵。

回答

我们可以使用系统IO引脚的位敲击轻松地仿真串行通信(UART)。将其钩到卡的一个引脚上,然后连接到那里的RS232转换器(可以轻松购买或者构建TTL到RS232转换器),该转换器可以连接到PC的串行端口。

回答

使用功能强大的软件UART的想法不错,但是编写代码时需要付出一些努力,而且还需要一些免费的计时器和中断。如果硬件具有任何其他未使用的串行接口(SPI,I2C等),则使用它们会更容易。使用小型微控制器,我们可以将接口转换为RS-232.

如果我们必须进行位冲击,那么进行同步串行可能是一种更简单的选择,因为这对时序而言并不重要。