我正在用C开发e混合系统,并且已经设置了一个环境,使我能够在没有目标平台的情况下进行本地测试,而目标平台是由#define TESTING_ENABLED启用的。
这将很快扩展到项目的所有方面,因此在平台间切换时,管理每个测试定义可能会变得乏味。
我是否能够通过makefile设置#define directive或检测不同编译器的使用?
发布于 2017-04-24 00:33:27
为此目的使用#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,
)
{
...
}上面的代码将把所有的项目引向一个完全的锁骨!
,现在该怎么做。。
抽象是您的朋友!:硬件、平台和编译器/工具链之间的一般分离。有些人搞砸了编译器和平台。
因此,我创建了一个项目的虚拟示例,目录结构应该如下所示。它应该让您清楚地知道分离是如何完成的:
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
└── src1.尽可能多地编写依赖于内部的代码!在大多数情况下,它将简化开发和调试。例如,在Visual这样的方便的环境中编写和调试尽可能多的代码要简单得多,然后使用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.通过在目录中使用不同的文件夹来分离编译器和工具链。然后,这些项目文件包括来自相应的子文件夹的特定.c和.h文件;
例如,这种方法将帮助您轻松地为您的固件开发测试套件,例如使用windows仿真或Keil仿真。然后您可以为真正的硬件创建测试项目。
如果我错过了一些东西,我会在这个过程中编辑它,我想社区的开发人员也会帮我的。
https://stackoverflow.com/questions/43558859
复制相似问题