嵌入式软件可维护性 - 配置

6
我正在开发一款嵌入式软件,旨在运行于两到三个不同系列的微控制器上。目前我们有一个读取配置开关并进行编译的Makefile。
这个过程对于开发人员和非开发人员来说越来越繁琐,他们需要了解编译开关和构建配置。我知道Linux内核使用ncurses生成编译配置。我正在寻找类似的跨平台工具。它应该可以在Windows和Linux上运行。虽然这仍然不能完全解决问题,但对于非开发人员更有吸引力,我可以快速共享我的.config文件或与现有的进行比较。配置将按特定顺序进行,并且此处的差异工具将有所帮助。
有人能分享类似项目维护的经验或参考项目(用于多个微控制器的嵌入式和通用代码库)。只是想了解最佳实践。
附注:使用C语言,8/16位微控制器,无操作系统,仅基于定时器的批处理调度程序(裸机)。

1
能否详细说明一下,究竟是什么变得“越来越繁琐”了呢?是什么改变使情况变得更糟了——或者从另一个角度来看,问题的哪个方面需要解决? - Brooks Moses
首先,软件堆栈高度依赖配置(因为它在非常低端的微控制器上运行)。开发人员必须查看源代码以了解这些开关的含义。在护士中,有一种方法可以为每个编译选项提供文档。有一些非法配置,检查这些配置使我的 makefile 变得臃肿。我们遇到过一些情况,其中配置被覆盖(由于开发人员的错误),在 makefile 的最后阶段识别它需要很长时间。 - Kamath
1
在我看来,你的测试不够充分。理想情况下,所有提交到源代码库(CVS、Git、P4、SVN等)的更改都必须定期构建(至少每天/每晚一次),并经常进行测试(每天)。任何构建或测试中断都可以通过查看自上次成功测试以来的更改相对容易地识别出来。测试是朋友,而非敌人。 - Alexey Frunze
3个回答

1

如果你找不到其他的东西,GNU autotools 可以让事情变得更容易一些。


1
点赞 - 不过我特别建议使用autoconf并忽略其余部分。(而且,为此事,只使用相当有限的autoconf能力 - 你可能不需要任何自动编译器探测,但在整个代码库中使用.in文件作为模式的能力是非常有用的。) - Brooks Moses
自动工具是跨平台的吗?我猜它的学习曲线相当陡峭 :( - Kamath
1
它是跨平台的。但对我来说,学习曲线一直都很痛苦。 - dbrank0
我可以在除了GCC以外的编译器中使用autotools吗,比如mcc18? - Kamath
@AUZKamath:学习autoconf对我来说也是一种痛苦。autoconf不依赖于编译器,它使用bash例程执行某些检查。如果要探索编译器选项,则必须自己编写这些例程(在autoconf术语中称为宏),以防在某些autoconf宏集合中没有可用的。 - dma_k

1

当我进行多平台开发时,我使用了类似于这里我的答案中的解决方案。为每个平台拥有一个特定的“platform_XXX.h”文件,并将条件编译限制在单个主“platform.h”文件中,该文件选择正确的子文件。


1

我有一个微控制器,但是有几个项目使用相同的源代码进行编译。我认为我的情况与你的类似,至少在某种程度上是这样的。我的解决方案也受到了Linux内核的启发。

config.h

所有需要访问某些配置参数的源代码只需包含一个名为config.h的头文件。

config.h仅包含一行:

#include <config/project.h>

project.h

我有几个配置头文件,每个项目一个。一个project.h由宏定义组成,这些宏定义具有诸如truefalse或常量等值:

#define CONFIG_FOO true
#define CONFIG_BAR false
#define CONFIG_TIME 100

check.c

该文件检查配置参数的正确性: - 所有参数必须被定义,即使对于该项目没有用处或意义 - 不需要的参数组合会被标记 - 参数值受到限制。
#if !defined(CONFIG_FOO)
        #error CONFIG_FOO not defined
#endif

#if !defined(CONFIG_BAR)
        #error CONFIG_BAR not defined
#endif

#if !defined(CONFIG_TIME)
        #error CONFIG_TIME not defined
#endif

#if !(CONFIG_FOO ^ CONFIG_BAR)
       #error either CONFIG_FOO or CONFIG_BAR should be se
#endif

#if CONFIG_TIME > 250
        #error CONFIG_TIME too big
#endif

Makefile

通过指示编译器输出预处理器宏,可以(借助一些sed表达式)将相同的参数值提供给给定项目的Makefile


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接