嵌入式软件版本管理一般都是人工维护,容易被遗忘造成不同软件相同版本号,而对应的开发工具如Keil或IAR,目前没有发现编译前可加载exe方式外部修改版本号的方法。

当然有人会说可以用 __DATE__,__TIME__代替版本信息,标准C库都具有这两个宏,但输出的格式太长不理想,作为一个数字强迫症,只好自己想办法在预编译时把当前时间处理成数字版本号。

本文也是从这两个宏下手,通过预编译计算出数字版本信息,节省单片机运算开销。

宏定义如下:

#define YEAR ((__DATE__[7]-'0')*1000+(__DATE__[8]-'0')*100+(__DATE__[9]-'0')*10+(__DATE__[10]-'0'))

#define MONTH (__DATE__[2]=='n'?1 \
	:__DATE__[2]=='b'?2 \
	:__DATE__[2]=='r'?(__DATE__[0]=='M'?3:4) \
	:__DATE__[2]=='y'?5 \
	:__DATE__[2]=='n'?6 \
	:__DATE__[2]=='l'?7 \
	:__DATE__[2]=='g'?8 \
	:__DATE__[2]=='p'?9 \
	:__DATE__[2]=='t'?10 \
	:__DATE__[2]=='v'?11:12)

#define DAY ((__DATE__[4]==' '?0:__DATE__[4]-'0')*10 \
	+(__DATE__[5]-'0'))

#define HOUR ((__TIME__[0]-'0')*10+(__TIME__[1]-'0'))
#define MINUTE ((__TIME__[3]-'0')*10+(__TIME__[4]-'0'))
#define SECOND ((__TIME__[6]-'0')*10+(__TIME__[7]-'0'))

uint32_t dateStamp = (YEAR%100)*100000000+MONTH*1000000+DAY*10000+HOUR*100+MINUTE;

使用方法:

在需要获取的地方读取到十进制格式的dateStamp变量,即可看到比较易读的数字序列,格式为 YYMMDDHHMM,如: 2103150005。

个人认为,作为编译版本信息,精准到分钟足以区分出不同版本标签,通过日期容易追溯历史版本,好过xxxx.xx.xx格式无意义的幻数,毕竟嵌入系统软件作为内部管理,能简单的区分便于维护即可。

注意,这个代码文件需要设置每次重新编译,否则可能因为没有改动而不更新,具体开发环境的设置方法就不在这里讨论了。

 

发表回复

后才能评论