C 嵌入式应用程序测试代码

C 嵌入式应用程序测试代码,c,testing,embedded,atmega,C,Testing,Embedded,Atmega,背景: 我正在开发一个使用Atmel AVR atmega2560的大型项目。该项目包含大量基于硬件的功能(7个SPI设备、2个I2C、2个RS485 MODBUS端口、大量模拟和数字I/O)。我为所有这些设备开发了“驱动程序”,它们为主应用程序循环提供了访问所需数据的接口 问题: 我正在开发的项目最终必须符合SIL标准 我希望能够测试代码并提供良好的代码覆盖率。然而,我找不到任何信息来帮助我开始如何建立这样一个测试框架 我的想法是,我可以拥有一套自动化测试,这将允许对未来的bug修复和功能添加

背景:

我正在开发一个使用Atmel AVR atmega2560的大型项目。该项目包含大量基于硬件的功能(7个SPI设备、2个I2C、2个RS485 MODBUS端口、大量模拟和数字I/O)。我为所有这些设备开发了“驱动程序”,它们为主应用程序循环提供了访问所需数据的接口

问题:

我正在开发的项目最终必须符合SIL标准

我希望能够测试代码并提供良好的代码覆盖率。然而,我找不到任何信息来帮助我开始如何建立这样一个测试框架

我的想法是,我可以拥有一套自动化测试,这将允许对未来的bug修复和功能添加进行测试,看看它们是否破坏了代码。问题是我不明白如何在芯片上测试代码

我是否需要硬件来监视设备上的I/O并模拟外部连接的设备?如能提供任何建议,将不胜感激


--Steve从不在真正的硬件上运行单元测试。始终模拟I/O接口。否则,您不能模拟错误条件,更重要的是,您不能依靠测试来成功

所以你需要的是把你的应用程序分成不同的部分,你可以独立测试。模拟器(或模拟)这些测试所需的所有硬件,并在开发PC上运行它们


这应该涵盖您的大部分代码,并留给您驱动程序。尽量使驱动程序代码在没有硬件的情况下工作。对于其余部分,您必须找到一种使代码在硬件上运行的方法。这通常意味着您必须使用响应信号的外部设备等创建一个测试台。因为这很脆弱(如“您的测试无法自动进行”),您必须在准备硬件后手动运行这些测试。

是一种在具有代码覆盖率的硬件上运行单元测试的商业工具。

这是一个非常好的问题-嵌入式开发人员普遍关心的问题。不幸的是,大多数嵌入式开发人员不像您那样关心,只在真正的硬件上测试代码。但正如另一个答案所指出的,这基本上可以测试代码的标称功能,而不是转角/错误情况

这个问题没有单一而简单的解决办法。然而,有些指导方针和技术可以做得比较好

首先,将代码分为几层。一层应该是“硬件不可知的”——即函数调用。不要要求用户直接写入硬件寄存器。另一层(较低)处理硬件。为了测试更高级别,可以对该层进行“模拟”。没有硬件就无法真正测试较低级别,但它不会经常更改,需要深入的硬件集成,因此这不是问题


“测试线束”将是所有与硬件无关的高级代码,带有专门用于测试的“伪”低级代码。这可以模拟硬件设备的正确和错误功能,从而允许您在PC上运行自动测试。

您有JTAG连接器吗?您可以使用JTAG模拟芯片上的错误情况。

我喜欢将任务分开。例如,当我为我的Atmel AVR创建一个循环缓冲区时,我用Code::Blocks编写它,并用常规GCC编译器而不是AVR GCC编译器编译它,然后我为它创建一个单元测试。我使用了一个特殊的头文件来提供我想要使用的正确数据类型(例如uint8_t)。我发现了单元测试中的错误,修复了它们,然后将修复后的代码转移到AVR Studio并集成了它。之后,我使用编写的支持函数和ISR将缓冲区放入有用的代码中(即,从缓冲区中弹出一个字节,将其放入UART数据输出寄存器,为printf函数向缓冲区添加一个字符串常量,等等)。然后我使用AVR模拟器来确保我的ISR和函数被调用,并且正确的数据显示在寄存器中。在那之后,我把它编程到芯片上,它工作得很好

与AVR Studio相比,我更喜欢Code::Blocks的调试功能,所以只要有可能,我就使用上面的方法。当我做不到的时候,我通常只处理硬件。例如,我有一个自动产生方波的计时器。我所能做的最好的事情就是看到这个针头正在模拟器中旋转。在那之后,我只需要连接一个示波器并确保

我喜欢在调试问题时使用多级方法。例如,对于时钟,第一层是“在时钟引脚上放置一个探针,看看那里是否有信号”。如果没有,则探测uC上的引脚并查找信号。然后,我在一个UART中编写了一个调试接口,在这里我可以查看特定的寄存器值,并确保它们是应该的。因此,如果它不起作用,下一步就是‘调用寄存器值并确保其正确’


在计划调试时,请尝试提前四步左右思考。这里应该有+5V电压,但如果没有呢?在调试界面中写入一种切换pin的方法,看看这是否会改变它。如果那不起作用呢?做点别的什么,等等。你会遇到这样的情况:“我不知道为什么这个该死的东西不管用!!!!”但希望您能事先找出原因。

SRoe,我还强烈建议您抽象出更高层的逻辑、算法、功能等。努力将真正的硬件或设备特定代码隔离到少量模块中。这将使遵循Aaron的建议变得更容易。它还将提高硬件独立位的可测试性。在主机上运行后,您应该在实际目标硬件上运行单元测试,但模拟对外部硬件的访问。Th