徕卡|嵌入式开发:嵌入式软件配置管理的3个技巧

徕卡|嵌入式开发:嵌入式软件配置管理的3个技巧

文章图片


嵌入式软件配置管理可能是一项棘手的工作 。 今天的系统通常设计为在多种产品中为不同的客户在很长一段时间内工作 , 这些系统需要能够轻松配置 , 以便代码不会成为噩梦 , 并最大限度地减少配置不当的机会 。 在这篇文章中 , 我们将探讨嵌入式软件配置管理的三个技巧 , 这些技巧可以帮助嵌入式开发人员简化配置并最大限度地减少产品生命周期内的技术债务 。

技巧1 – 使用单独的回购
在开发嵌入式产品时 , 将产品的所有代码放入单个版本控制存储库中可能很诱人 。 毕竟是一个产品 , 不应该把产品的所有东西都放在一个地方吗?不!将应用程序分成多个存储库可以显着改善代码库配置管理 。
在许多情况下 , 一个产品代码将用于多个产品SKU , 并且在十年或更长时间内 , 可能会找到不同的配置来满足客户的要求 。 因此 , 团队可以仔细检查他们的产品设计并将所有配置代码放入单独的存储库中 。 至少 , 这会创建核心产品代码和几个配置存储库 , 用于管理核心应用程序的行为方式 。 这样做的好处是 , 如果SKU 或特定客户需要更改配置 , 它不会强制更改可能意外传播到其他系统的应用程序 。
配置不是唯一可以从放置在单独的存储库中受益的组件 , 将应用程序的每一层放入不同的存储库也有好处 。 例如 , 将驱动程序、中间件和应用程序分离到单独的存储库中可以迫使嵌入式开发人员更多地考虑代码的接口和抽象 , 这将有助于最大限度地减少层之间的耦合 。 例如 , 在芯片短缺期间 , 许多团队一直在努力更换微控制器 , 因为他们将应用程序与硬件紧密耦合 。

技巧2 – 利用 YAML、JSON 和 XML 文件
【徕卡|嵌入式开发:嵌入式软件配置管理的3个技巧】在许多嵌入式产品中 , 开发人员将使用条件编译语句来管理他们的系统配置 。例如 , 如果我有两个不同的系统 , 一个有两个可以控制的继电器 , 另一个有四个 , 开发人员将编写如下C代码:
#if SKU == PRODUCT_1
// Custom configuration for two relays.
#elif SKU == PRODUCT_2
// Custom configuration for four relays.
#else
#error “The Product SKU has not been defined!”
#endif如果产品很简单 , 那么在代码中散布一些条件编译并不是什么大问题 , 然而 , 今天的系统非常复杂 , 可能有数千条这样的语句分散在各处 。 可以想象 , 这将成为维护和配置的噩梦 。
开发人员可以利用配置文件 , 而不是使用条件编译 。 有两种方式可以利用配置文件 。 首先 , 嵌入式开发人员可以只创建包含产品配置信息的C模块配置 , 这些配置值被传递到各种应用程序、中间件和驱动程序初始化函数中 。 其次 , 基于C的配置文件易于设置和维护 。
一种更现代的方法是利用 YAML、JSON 和/或 XML格式的配置文件 。 例如 , 回顾条件编译示例 , 我们可以为两个中继配置编写一个如下所示的YAML文件:

Hardware:
Relays:
0x01:GPIO01
0x02:GPIO15
四中继配置 YAML 文件可能如下所示:

Hardware:
Relays:
0x01:GPIO01
0x02:GPIO15
0x03:GPIO22
0x04:GPIO23
使用YAML、JSON 和 XML文件有一个有趣的转折 , 如何使用这些文件来配置 C/C++ 应用程序?有几种方法 , 比如编写一个脚本 , 读取YAML文件 , 然后生成等效的C代码 。 例如 , 该过程可能如下所示:

有些人在C之外使用配置文件并依赖脚本来构建配置感觉很复杂 。 但是 , 如果操作正确 , 这种技术可以成为管理系统配置的一种有价值且有益的方式 。