2017-04-22 97 views
0

我正在开发e 带C的嵌入式系统,并且已经设置了一个环境,使我能够在没有目标平台的情况下进行本地测试,由#define TESTING_ENABLED启用。嵌入式C测试开发管理

这将很快扩展到包含项目的所有方面,因此在平台之间切换时管理每个测试定义可能会变得乏味。

我可以通过makefile设置#define directive或检测不同编译器的使用吗?

回答

1

为此目的使用#define#if通常是一个非常糟糕的主意,原因有几个,代码变为: 1.无法读取; 2.不可移植; 3.不可维护;

一般的经验法则是,只能在头文件中使用#define#if。只要预处理器进入源文件,就维护和便携性而言,它就成为项目失败的明确途径。

所以,不惜一切代价避免,这样的代码:

void foo() 
{ 
    ... 

#if TARGET_REAL_CPU 
    ... 
#endif 

    ... 
} 

正如我已经看到了代码一个极端的例子:

bool some_func(
    int index, 
#if SOME_DEFINE 
    bool flag, 
#else 
    struct exception* ex, 
#endif 
    void* buffer, 
    size_t size, 
) 
{ 
    ... 
} 

这上面的代码将导致任何项目到完全clasterfuck!

现在,它应该如何完成。

抽象是你的朋友! 3个主要事物之间的一般分离:硬件,平台和编译器/工具链。有些人搞乱了编译器和平台。

所以,我创建了一个项目的虚拟示例,目录结构应该如下所示。它应该给你一个明确的概念分离是怎么做的:

firmware/ 
├── bin 
│   ├── arm 
│   ├── windows_x64 
│   └── windows_x86 
├── build 
│   ├── gcc 
│   │   └── arm 
│   ├── keil5 
│   │   └── arm 
│   └── vs2017 
│    └── windows 
├── include 
│   └── firmware 
│    └── frm.h 
├── src 
│   ├── arm 
│   │   ├── frm_init_impl.c 
│   │   └── frm_platform.h 
│   ├── frm_idle.c 
│   ├── frm_init.c 
│   ├── frm_state.c 
│   └── windows 
│    ├── frm_init_impl.c 
│    └── frm_platform.h 
└── test 
    └── firmware_test 
     ├── build 
     │   └── vs2017 
     │    └── windows 
     └── src 

写平台,依赖代码尽可能!在大多数情况下,它将简化开发和调试。例如,在像Visual Studio这样方便的环境中编写尽可能多的代码,然后使用vi和gdb甚至Keil - 这对我个人来说是一个价格过高的垃圾!

2.只要你拥有了它必须移动到_impl.c文件和所有平台的具体定义为_platform.h文件

FrmStatus frm_init() 
{ 
    // Platform in-depended code 
    ... 

    status = frm_init_impl(...); 
    if(FAILED(status)) 
    { 
     ... 
    }  

    // Platform in-depended code 
    ... 
} 

在这种情况下,依赖于平台的功能,你将有不同的实现的frm_init_impl功能在不同的文件夹和文件,让我们来说说Windows模拟代码和真正的芯片特定的一个。但你的平台依赖于frm_init的功能将永远保持不变!

3。使用build目录中的不同文件夹分开编译器和工具链。然后这些项目文件包括来自src的相应子文件夹的特定.c.h文件;

例如,这种方法将帮助您使用针对窗口的仿真或针对Keil的仿真来轻松开发您的固件的测试套件。然后你可以为真实的硬件创建测试项目。

如果我错过了一些东西,我会在这个过程中编辑它,我猜,社区的开发人员会帮助你。