需求背景:
每次程序修改,变更以及发布,都要手动修改程序版本以及版本日期,有些程序员难免会粗心忘记修改。
原理:
因为编译器每次编译后都会记录日期,我们可以通过一个宏 __TIME__ __DATE__ 来获取日期和时间,获取到之后,是一个字符串形式。
实验条件:
MDK集成工具V5.0版本以上。
实现方法:
今天,他来了!
首先定义日期结构体:
- #ifndef __VERSION_H
- #define __VERSION_H
- #include <string.h>
- #include <stdlib.h>
- typedef struct version_date
- {
- int tm_mday; /* 月中的第几天,范围从 1 到 31*/
- int tm_mon; /* 月份,范围从 1 到 12*/
- int tm_year; /* 实际的年数 */
- }version_date;
- extern version_date v_date;
- void mcu_get_version_date(void);
- #endif
- #include "version.h"
- /**********************************************************
- 本文件包含2个功能:
- 1. 软件版本日期
- 2. mbus ID,从芯片的唯一ID号读取
- 软件版本号不可控,统一使用软件版本日期。
- 1. 读软件版本日期 格式如下:3字节协议:
- Byte0 : 00~99 表示[2020 ~ 2099]
- Byte1 : 1~12 月Mon
- Byte2 : 1~31 日day
- exp : Nov 4 2020
- *********************************************************/
- char TimeStr[]= __TIME__;
- char DataStr[]= __DATE__; //"Nov 4 2020";
- version_date v_date;
- char Month_tab[][12] =
- {
- "January",
- "February",
- "March",
- "April",
- "May",
- "June",
- "July",
- "August",
- "September",
- "September",
- "November",
- "December",
- };
- /*
- 获取编译后的字符日期版本,转换成整数后保存
- // Nov 4 2020
- */
- void mcu_get_version_date(void)
- {
- /*比较前3个字符,找出月份*/
- for(int i = 0; i < 12; i++)
- {
- char *ptr = Month_tab[i];
- if(*ptr == DataStr[0])
- {
- ptr++;
- if(*ptr == DataStr[1])
- {
- ptr++;
- if(*ptr == DataStr[2])
- {
- v_date.tm_mon = i+1;
- break;
- }
- }
- }
- }
- /*找出日+年*/
- char *pstr = DataStr;
- pstr = strchr(pstr, ' '); /*寻找空格*/
- pstr++;
- if(*pstr == ' ') /*如果为1~9日,则字符串中隔有2个空格*/
- {
- pstr++;
- // 字符转数字
- char b = *pstr;
- v_date.tm_mday = (b - 0x30);
- }
- else
- {
- char a = *pstr;
- pstr++;
- char b = *pstr;
- v_date.tm_mday = (a - 0x30)*10 + (b - 0x30);
- }
- pstr++;
- v_date.tm_year = atoi(pstr);
- }
个人认为这个功能非常有用,配合自动化bat编译脚本,可以完全实现自动化。
最后附上源文件,欢迎下载:
游客,如果您要查看本帖隐藏内容请回复