技巧1 – 使用 GPIO 对 PCB 版本进行硬编码
并非所有系统都有两个或三个可用的空闲 GPIO 线。相反,开发人员还可以利用免费的模数 (ADC) 通道并使用模拟电压来表示版本号。在这种情况下,单个 ADC 通道可以连接到电阻桥的中点,其中一个电阻连接到 VCC,另一个连接到地。在这种情况下,将调整电阻值以提供与版本号相关联的特定电压。对于低功率应用,开发人员希望选择足够大的电阻值,以防止任何大的寄生电流通过电路。
技巧2 – 使用 Major.Minor.Patch 语义
开发人员可以使用多种不同的方法对他们的嵌入式软件进行版本控制。不过,应该采用并适合大多数软件开发团队使用的系统是 MAJOR.MINOR.PATCH 语义。毫无疑问,你已经看到具有这些版本号的软件,例如 1.0.0、1.1.2、2.4.2 等。
由于语义定义,通用版本控制方案和对更改影响的理解一目了然。例如,MAJOR 编号仅在软件发布时 API 更改不兼容时才会增加。这意味着我们仅在代码发生不向后兼容的更改时才增加 MAJOR。仅当进行与现有 API 向后兼容的改进时,MINOR 编号才会增加。PATCH 仅在将错误修复应用于软件时才会增加。
使用这种语义模式进行版本控制将使任何软件嵌入式开发人员都能理解版本控制。
技巧3 – 创建一个 version.h 模块
创建一个包含 Major.Minor.Patch 语义以及版本日志的 version.h 模块是最有效的软件版本控制方法。可以使用宏定义轻松设置软件的版本号,例如:
- #define VERSION_MAJOR (1)
- #define VERSION_MINOR (0)
- #define VERSION_PATCH (0)
开发人员甚至可以设置允许运行软件的最低硬件版本:
#define HARDWARE_VERSION_MIN (4)
version.h 模块的一个重要部分不仅是对软件进行版本控制,而且还包括版本日志。这可以使用注释来完成,并且应该包括以下信息:
- 软件版本
- 模块已更改
- 对模块的更改
技巧4 – 尽可能避免模块和函数版本控制
嵌入式应用程序的版本控制方式完全取决于嵌入式开发团队,但建议尽可能避免模块和功能级别的版本控制,意思是不将版本号分配给单个 C 模块或其中的函数。这样做的原因是它为版本控制增加不必要的开销,这也提高了版本控制信息出错的可能性。
例如,如果对一个 Dio_Write 函数进行了更改,不增加该函数的版本号。更新 Dio_Write 所在组件的版本号,这可能是 Dio.c,也可能是驱动程序组件,它是特定微控制器驱动程序的集合。如果对功能进行版本化,还必须对模块、组件和软件进行版本化,可能会忘记在某个地方更新它,然后这些更改就会丢失。最好避免在如此低的级别进行版本控制。
技巧5 – 将 VCS 与你的 IDE 集成
版本控制软件的一个重要方面是该软件如何集成到版本控制系统 (VCS) 中。目前最流行的 VCS 是 git,但一些开发团队仍在使用 svn 和 mecurial。在对软件进行版本控制时,确保将 VCS 功能集成到开发环境中以使提交更改变得简单和容易,这一点至关重要。例如,许多 VCS 插件将允许开发人员单击一个按钮,他们将添加任何新的更改到推送。他们还会弹出一个对话框,让开发人员有机会评论他们所做的更改,这是复制在 version.h 中记录的更改并将它们粘贴到 VCS 日志中的绝佳机会,这样软件和 VCS 之间的所有版本信息都匹配!
结论
对嵌入式系统进行版本控制并不一定很复杂。事实上,你对系统进行版本控制越简单,使用错误版本的硬件或软件而出现混淆或问题的可能性就越小。嵌入式开发人员可以利用多种技巧来简化版本控制,例如使用集成版本日志和基于硬件的版本控制。无论采用什么系统,成功的唯一方法是相关开发人员采用严格的版本控制方法,并且在提交软件时不要偷工减料。