我正致力于一项涉及微控制器编程的机器人研究项目。我希望能够尽可能地将软件测试与硬件测试分开。这既是为了提高开发速度,也是为了在将代码放到机器人上之前,我可以更轻松地对代码进行单元测试/模拟。例如,我可能会写一个" MyRobot"图书馆。然后我可以在嵌入代码和非嵌入式模拟/测试代码中包含这个库。在运行时,我提供的函数指针可以读取(在嵌入式情况下)或模拟(在模拟中)传感器数据并将其提供给库。
所以我需要做的就是在编译时生成两个库:一个用于嵌入式代码,另一个用于非嵌入式代码。
我的问题是这是否可行/是否有更好的方法/如果有任何问题需要注意。
提前致谢!
答案 0 :(得分:6)
这是嵌入式系统开发中的常见情况,您创建两个库的方法通常是推荐的解决方案。它被认为是将低级硬件与嵌入式系统固件中的软件分离的最佳实践。
您提到的库通常称为"硬件抽象层" 或HAL。 HAL的API(应用程序编程接口)可以在名为hal.h
的单个头文件中提供。软件中需要访问硬件的每个源模块都会在源文件的顶部显示以下行:
#include "hal.h"
像这样设计系统的好处包括:
对于您的两个场景,如您所建议的那样,您将创建两个版本的HAL库:包含在嵌入式硬件上运行的代码的标准版本,以及模拟硬件以便测试您的硬件的仿真版本软件以受控方式。您可以命名标准库hal.lib
(可能具有不同的扩展名,具体取决于您的开发环境)和模拟库hal_simulated.lib
。两者都具有相同的界面,如hal.h
中所述。也就是说,两个库都将包含hal.h
中声明的所有函数,例如void halInit()
,int halReadProximitySensor()
等。
假设您的IDE支持Release
和Debug
配置,您可以为名为SW_Test
的软件测试创建第三个配置。此配置将与您的Debug
配置重复,但hal_simulated.lib
将链接到项目而非标准hal.lib
。
另见
答案 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 等。