为何有这个需求?
做嵌入式软件开发的人对于手工维护版本号总是心有抵触。因为代码提交很频繁,如果每次提交都需要手动修改子版本号,不胜其烦。而且难免会有遗漏的时候,这样版本号就失去了意义,并不能指明其与代码的真实对应关系。因为即使有版本号,也不知道是否就是预期的版本。
有什么办法能解决这个痛点呢?
答案是有!——使用编译日期与时间替代子版本号。
实现办法
C语言编译器生成目标代码时,会生成常量字符串:__DATE__ 、__TIME__,分别表示编译的日期与时间。将这两个字符串作为版本号的一部分,每次编译时都会自动变化,这样就达到了版本号与代码编译版本唯一对应的目的。
例如,如下代码通过调试打印接口输出版本号及设备UID等信息:
printf("\r\n******************************************************************\r\n");
printf(" 欢迎使用XXXX流量计算机\r\n");
printf(" 固件编译时间:%s %s\r\n", __DATE__, __TIME__);
printf(" UID: %08X %08X %08X\r\n", UID[0], UID[1], UID[2]);
printf("******************************************************************\r\n");
问题就这么轻松愉快地解决了?没有这么简单!
多编译运行几次,你会发现,并不是每次编译时, __DATE__ 、__TIME__ 都会变化。只有引用了这两个宏的代码所在的源文件有修改,进行了重新编译,__DATE__ 、__TIME__才会变化。这与我们的期望还是有一定差距。我们期望的是只要整个工程有任何源文件被编辑、编译、链接,都能够更新__DATE__ 、__TIME__,这样才能保证版本号与编译版

本文介绍如何利用Keil的编译日期和时间自动更新软件版本号,以确保版本号与代码编译版本一一对应。通过设置源文件始终编译,确保每次编译时__DATE__和__TIME__更新,解决了手动维护版本号的痛点。同时提醒在发布版本时注意备份目标代码,避免重复编译导致版本混乱。
最低0.47元/天 解锁文章
3072

被折叠的 条评论
为什么被折叠?



