我正在开发e 带C的嵌入式系统,并且已经设置了一个环境,使我能够在没有目标平台的情况下进行本地测试,由#define TESTING_ENABLED
启用。嵌入式C测试开发管理
这将很快扩展到包含项目的所有方面,因此在平台之间切换时管理每个测试定义可能会变得乏味。
我可以通过makefile设置#define directive
或检测不同编译器的使用吗?
我正在开发e 带C的嵌入式系统,并且已经设置了一个环境,使我能够在没有目标平台的情况下进行本地测试,由#define TESTING_ENABLED
启用。嵌入式C测试开发管理
这将很快扩展到包含项目的所有方面,因此在平台之间切换时管理每个测试定义可能会变得乏味。
我可以通过makefile设置#define directive
或检测不同编译器的使用吗?
为此目的使用#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的仿真来轻松开发您的固件的测试套件。然后你可以为真实的硬件创建测试项目。
如果我错过了一些东西,我会在这个过程中编辑它,我猜,社区的开发人员会帮助你。