在嵌入代码和非嵌入代码之间维护单个代码库

时间:2015-12-16 03:11:56

标签: c testing embedded tdd microcontroller

我正致力于一项涉及微控制器编程的机器人研究项目。我希望能够尽可能地将软件测试与硬件测试分开。这既是为了提高开发速度,也是为了在将代码放到机器人上之前,我可以更轻松地对代码进行单元测试/模拟。例如,我可能会写一个" MyRobot"图书馆。然后我可以在嵌入代码和非嵌入式模拟/测试代码中包含这个库。在运行时,我提供的函数指针可以读取(在嵌入式情况下)或模拟(在模拟中)传感器数据并将其提供给库。

所以我需要做的就是在编译时生成两个库:一个用于嵌入式代码,另一个用于非嵌入式代码。

我的问题是这是否可行/是否有更好的方法/如果有任何问题需要注意。

提前致谢!

2 个答案:

答案 0 :(得分:6)

这是嵌入式系统开发中的常见情况,您创建两个库的方法通常是推荐的解决方案。它被认为是将低级硬件与嵌入式系统固件中的软件分离的最佳实践。

您提到的库通常称为"硬件抽象层" 或HAL。 HAL的API(应用程序编程接口)可以在名为hal.h的单个头文件中提供。软件中需要访问硬件的每个源模块都会在源文件的顶部显示以下行:

#include "hal.h"

像这样设计系统的好处包括:

  • 模块化即可。如果您需要更改时序,例如读取传感器的UART或SPI接口,即使代码中有多个位置读取该传感器,您也只需要更改HAL库。
  • 可移植性即可。如果以后需要将项目迁移到其他微控制器,则只需要更改HAL层。
  • 封装即可。硬件的细节隐藏在HAL层中,这允许您的其他软件在更高的抽象级别上运行。如果您使用的是微控制器制造商提供的设备库,它提供寄存器,I / O端口等的地址,您可以在HAL库中封装对此库的引用,以便您的应用程序代码不需要知道它。
  • 测试性即可。这是您问题的主要焦点。您可以编写可以在不同平台(例如Windows)上运行的特殊版本的HAL层,以测试您的应用程序软件。这个特殊版本不需要包含微控制器制造商提供的器件库,因为当您在测试环境中运行时,微控制器不存在,因此其寄存器和I / O端口不需要可以通过您的软件访问。

对于您的两个场景,如您所建议的那样,您将创建两个版本的HAL库:包含在嵌入式硬件上运行的代码的标准版本,以及模拟硬件以便测试您的硬件的仿真版本软件以受控方式。您可以命名标准库hal.lib(可能具有不同的扩展名,具体取决于您的开发环境)和模拟库hal_simulated.lib。两者都具有相同的界面,如hal.h中所述。也就是说,两个库都将包含hal.h中声明的所有函数,例如void halInit()int halReadProximitySensor()等。

假设您的IDE支持ReleaseDebug配置,您可以为名为SW_Test的软件测试创建第三个配置。此配置将与您的Debug配置重复,但hal_simulated.lib将链接到项目而非标准hal.lib

另见

Hardware Abstraction (Wikipedia)

答案 1 :(得分:1)

考虑到你不熟悉不是面向对象语言的C,我会去一个带有内部逻辑甚至#ifdefs的库(如果性能是必须的),例如:

bool turnOn()
{
   #ifdef DEV
       printf ("Turned On\n");
       return true;
   #endif

   #ifdef PROD
      return robot_command_turnOn();
   #endif
}

bool turnOn()
{
   if (inProduction())
      return robot_command_turnOn();

   printf ("Turned On\n");
   return true;
}

甚至更好:

bool turnOn()
{
   printf ("Turned On\n");

   if (!inProduction())
        return true;

  return robot_command_turnOn();
}

有几种方法可以做到这一点。在我看来,我不会去两个库,因为我需要保持同步功能签名和版本,这可能是一团糟。

秘诀是为您的硬件构建一个接口库(机器人以防万一)并开发融合所有可能交互的库,以便保持从硬件层的抽象级别。该接口库可以控制您是否正在测试该单元(使用上面的inProduction()之类的函数)并在允许的情况下将命令发送到硬件。

使用像C ++这样的面向对象的语言,你可以使用模式来帮助你:ie: interface pattern factory pattern 等。