背景:

我正在开发使用爱特梅尔AVR atmega2560一个相当大的项目。这个项目包含了大量的基于硬件的功能(7 SPI器件,2 I2C,2个RS485 MODBUS口,大量的模拟和数字I / O的)。我已经开发“驱动程序”所有这些设备,其提供的主应用程序循环与访问所需数据的接口的

问题:

我开发该项目最终将必须符合SIL标准。

我想能够测试的代码,并提供代码覆盖的良好水平。但是我无法找到任何信息,让我开始对这样的测试框架应该如何设置。

的想法是,我可以有一套自动化测试,这将允许未来的错误修正和功能的增加进行测试,以查看它们是否破坏代码。事情是我不理解如何代码可以在芯片进行测试。

我是否需要硬件来监视设备上的I / O与仿真外部连接的设备吗?可以提供任何指针将高度赞赏。

- 史蒂夫

有帮助吗?

解决方案

这是一个很好的问题 - 为嵌入式开发人员共同关注的问题。不幸的是,大多数嵌入式开发人员并不关心你的,只有测试在真实硬件的代码。但作为另一个答案指出,这基本上可以测试只是代码,而不是在角落/错误情况的标称功能。

没有单一的和简单的解决这个问题。一些准则和技术存在,但是,做一个比较好的工作。

首先,代码分离成层。一个层应该是“硬件不可知” - 即的函数调用即可。不要问用户直接写入HW寄存器。另一(下部)层处理与HW。为了测试该更高级别的该层可以被“嘲笑”。较低的水平离不开硬件进行真正的考验,但它不会经常更换,需要深HW整合,所以它不是一个问题。

一个“测试工具”将是具有“假”所有的高级别HW不可知码专门用于检测低的水平。这可以模拟为正确和不正确功能性的HW设备,从而允许你在PC上运行的自动测试。

其他提示

从不上或针对实际的硬件上运行的单元测试。总是嘲笑你的I / O接口。否则,你不能模拟错误条件,更重要的是,你不能依赖于测试成功。

所以,你需要的是你的应用程序分割成各个部分可以独立测试。模拟器(或模拟),你需要为这些测试和开发计算机上运行它们的所有硬件。

这应包括大部分的代码,并给你留下的驱动程序。尽量让尽可能多的驱动程序代码,无需硬件可能工作。对于剩下的,你就必须弄清楚一种方法,使在硬件上运行的代码。这通常意味着你必须建立与外部设备,其响应于信号等试验台由于这是脆(如“你的测试就无法自动完成这项工作”),您必须准备的硬件后手动运行这些测试。

VectorCAST的是在包含代码覆盖该硬件运行单元测试一个商业工具。

你有一个JTAG连接器?您可能能够使用JTAG来模拟错误条件在芯片上。

我喜欢分开的任务。例如,当我做了一个循环缓冲区我爱特梅尔AVR我写的这一切在代码::块,并与常规GCC编译器,而不是AVR GCC编译器编译它,那么我为它创建一个单元测试。我用了一个特殊的头文件,以提供正确的数据类型,我想工作,(uint8_t为例)。我发现的错误与单元测试,它们固定,然后拿着固定码到AVR Studio和集成它。之后,我使用的写支持功能和的ISR,以适应缓冲成有用的代码(即,弹出一个字节的缓冲区off,将其推入UART数据输出寄存器,追加字符串常量到缓冲器用于printf函数等)。然后我用的AVR模拟器,以确保我的ISR和功能都被称为和正确的数据在寄存器中出现了。从那以后,我编程它在芯片上,它完美地工作。

我非常喜欢代码::块相比,AVR Studio中的调试能力使我使用上述方法时,我可以。当我不能我通常只处理硬件。比如我有一个自动产生方波的计时器。我能做的最好的是看到脚位是在模拟器上进行重组后。在此之后我不得不勾范围并进行确认。

我喜欢调试问题时使用的多级方法。例如与时钟的第一层是“把时钟引脚上的探头,看看是否有信号存在”。如果没有,探索出在UC的引脚并查找信号。然后,我在UART的,我可以看一下具体的寄存器值,并确保他们是他们应该做的是一个编码的调试接口。所以,如果它不能正常工作的下一个步骤是“调出寄存器的值,并确保它是正确的。”

尽量提前考虑四个步骤或者所以每当你计划你的调试。应该有+ 5V这里,但如果没有呢?写入调试接口的方式来切换针,看看有没有改变它。如果不工作怎么办?做别的事情,等等等等等你到一个地步,你碰上“我不知道为什么这个党THING不起作用!!!!”但希望你会先找出原因。

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