裸机代码是否有任何标准测试方法


8

我想知道裸机代码(尤其是诸如设备/外围设备初始化代码之类的东西)是否具有任何测试方法,因为在写入寄存器时几乎不会出错(一旦知道所有地址都正确映射)。同样,当仅将设备配置为一个功能时,这种代码通常只有很少的分支/路径,那么在这里有必要进行哪种测试?

Answers:


11

无论是使用内部振荡器还是外部晶振,我都要在新板上进行验证的第一件事是我已正确设置了时钟频率。这很重要,因为许多外设(例如UART,SPI,I2C和计时器)都依赖于它。

我验证它的方式是编写一个短循环程序,可以使用汇编语言(我可以手动计算周期),也可以使用C语言,只要您可以获得反汇编清单并执行相同的操作-并打开一个LED和关闭。我设置了一个循环,使其每秒执行一次。我运行代码,并检查LED是否在一分钟内闪烁60次。

就外围设备而言,检查它们的最佳方法是使用示波器(如果有),并查看UART的RX线,SPI的CLK,MOSI和芯片选择线,以及SDA和SCL线。 I2C,并检查线路是否切换以及时序是否正确。

如果没有示波器,则可以在这些线路上放置LED,然后启用或禁用外围设备。禁用时,大多数线路将处于低电平(LED熄灭),但某些线路将处于高电平,例如RX引线UART的指示灯(LED亮)。启用外围设备后,大多数LED应当变暗,因为线路将切换。通过循环运行(禁用/启用),可以更容易地看到开或暗之间的差异。

对于UART,您可以将TX线连接到RX线作为回路。然后,您还可以连接到UART转USB电缆,并在PC 上将RealTerm之类的程序连接到终端。除了测试接口之外,这将在以后的其他调试中派上用场。

对于其他代码,我根据需要使用多个LED来显示代码中的各种路径正在执行。如果您的UART已经工作并连接到PC,则可以在代码中添加对子例程的调用,以输出一条消息以显示该程序已达到的目标(或者,如果有可用的标准C库,请使用printf)。但是正如弗拉基米尔·克拉维罗(Vladimir Cravero)在下面的注释中指出的那样,这可能会使您的代码速度变慢(115,200波特,不是太多,因为一个字符时间小于10 µs)。但是在ISR和其他对时间要求严格的代码中,只需使用LED。

正如Al Bundy在下面的评论中所指出的那样,在线调试器也很有用,特别是在可以设置多个断点的情况下,并且在可以更改存储位置的断点的情况下尤其有用。并非所有调试器都具有该功能。

但是除非没有必要,否则我不会使用调试器很多,例如,查看外设寄存器中的位。或找出我无法通过检查发现的错误;或进行基本的代码覆盖率分析。但是总的来说,我喜欢以“正常”速度运行程序,因为通常会出现很多问题,而单步执行时可能不会出现。我的大多数程序都大量使用中断,这会干扰调试器的使用。


您几乎说了所有内容,我想补充一点,通常是在代码中撒上fprintf会使速度大大降低,这是您在必要时应该使用的东西,如果您知道自己在做什么。我已经看到有关ISR等中的fprintf的一些问题(并且有一些问题)。
弗拉基米尔·克拉韦罗

@VladimirCravero同意-这就是为什么喜欢使用LED。
tcrosley

感谢您的回答。如果您只有模拟器而不是实际硬件,那么将使用什么工具/设置进行代码覆盖的任何指针?
穴居人

调试器呢?值得一提吗?
Al Bundy

2
@AlBundy除非必须(例如)查看外设寄存器中的位,否则我不会大量使用调试器。或找出我无法通过检查发现的错误;或执行基本代码覆盖率分析,如我在对OP的评论中提到的那样。但是总的来说,我喜欢以“正常”速度运行程序,因为通常会出现很多问题,而单步执行则不会。我的大多数程序都大量使用中断,这会干扰调试器的使用。我将其中一些评论添加到我的答案中。
tcrosley
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.