首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌入式C测试开发管理

嵌入式C测试开发管理
EN

Stack Overflow用户
提问于 2017-04-22 11:50:25
回答 1查看 128关注 0票数 0

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

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

我是否能够通过makefile设置#define directive或检测不同编译器的使用?

EN

回答 1

Stack Overflow用户

发布于 2017-04-24 00:33:27

为此目的使用#define#if通常是一个非常糟糕的想法,原因如下: 1.代码不可读;2.不可移植;3.不可维护;

一般的经验法则是,您只能在头文件中使用#define#if。一旦预处理器进入源文件,它就会在维护和可移植性方面成为项目失败的明确途径。

因此,不惜一切代价避免使用这样的代码:

代码语言:javascript
复制
void foo()
{
   ...

#if TARGET_REAL_CPU
   ...
#endif

   ...
}

作为一个极端的例子,我看到了一个代码:

代码语言:javascript
复制
bool some_func(
    int index,
#if SOME_DEFINE
    bool flag,
#else
    struct exception* ex,
#endif
    void* buffer,
    size_t size,
)
{
   ...
}

上面的代码将把所有的项目引向一个完全的锁骨!

,现在该怎么做。

抽象是您的朋友!:硬件、平台和编译器/工具链之间的一般分离。有些人搞砸了编译器和平台。

因此,我创建了一个项目的虚拟示例,目录结构应该如下所示。它应该让您清楚地知道分离是如何完成的:

代码语言:javascript
复制
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

1.尽可能多地编写依赖于内部的代码!在大多数情况下,它将简化开发和调试。例如,在Visual这样的方便的环境中编写和调试尽可能多的代码要简单得多,然后使用vi和gdb,甚至Keil --在我个人看来,这是一个价格过高的垃圾!

2.一旦有了依赖于平台的功能,就必须将其移动到_impl.c文件中,并将所有特定于平台的定义移到_platform.h文件中。

代码语言:javascript
复制
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仿真。然后您可以为真正的硬件创建测试项目。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43558859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档