微控制器C代码的unit testing模式

虽然有很多unit testing框架支持C,但我对如何为微控制器代码编写unit testing感到有些困难(在我的情况下是PIC,但我认为这个问题比这更普遍)。

为微控制器编写的大部分代码都围绕将配置和数据值写入寄存器,从寄存器读取输入数据以及响应中断事件。 我想知道是否有人可以提供一些最有效的方法指针。

你写;

“为微控制器编写的大部分代码都围绕着向寄存器写入配置和数据值,从寄存器读取输入数据以及响应中断事件”。

我同意这在实践中经常出现这种情况,但我实际上并不认为这是一件好事,我认为重新思考一些事情会帮助你完成测试目标。

也许是因为微控制器程序员可以随时联系并触摸硬件,很多(大多数?)他们已经养成了在整个代码中做到这一点的习惯。 通常这种习惯是毫无疑问的,也许是因为很多人从事这种工作的是EEs而不是计算机科学家的训练和倾向。 我知道,我自己就是这样开始的。

我想说的是,微控制器项目可以而且应该像任何其他软件项目一样进行良好设计。 良好设计的一个非常重要的部分是限制对硬件驱动程序的硬件访问! 将所有编写寄存器的代码分区,将中断等响应到模块中,从而为软件的其余部分提供对硬件的良好,干净,抽象的访问。 使用逻辑分析仪,示波器,自定义测试装置或任何其他有意义的测试来测试目标上的驱动程序模块。

一个非常重要的一点是,现在你的软件的其余部分,绝大多数,现在只是你可以在主机系统上运行和测试的C代码。 在主机系统上,硬件模块以一种方式存根,可以查看被测代码正在执行的操作。 您可以在此代码上使用主流unit testing方法。 这需要一些准备和工作,但如果组织良好,您可以创建一个可以应用于所有项目的可重用系统。 潜在的好处是巨大的。 我在这里写了一些关于这些想法的文章;

[ http://discuss.joelonsoftware.com/default.asp?joel.3.530964.12%5D%5B1%5D

一种方法可能是使用模拟器。 我一直在研究AVR仿真器,其中一个使用它的想法确实是unit testing代码。 仿真器实现CPU和寄存器,中断和各种外设,并且(在我的情况下)写入仿真UART的字节转到仿真器的常规stdout 。 通过这种方式,unit testing代码可以在模拟器中运行,并将其测试结果写入控制台。

当然,还必须确保模拟器正确实现真实CPU的行为,否则unit testing无法信任。

编写寄存器访问函数/宏的模拟版本。 请注意,这假设您的代码使用一组通用的寄存器访问函数,而不是像*(volatile int*)0xDEADBEEF = 0xBADF00D这样的特殊内容。

直接从测试代码调用中断处理程序(在某些架构上可能有问题¹),如果可用则调用“软件中断”,或者如果需要它们异步执行,则从定时器中断处理程序调用。 这可能需要在您可以模拟的函数/宏中包装中断启用/禁用代码。

¹8051浮现在脑海中:至少使用Keil 8051编译器,您无法直接调用中断函数。 这可以通过C预处理器来解决。

是否有任何类型的环回模式,以便您可以使用控制器本身生成可以测试的事件?