Keil版本号

  这篇详细介绍keil版本管理

一、__DATE__和__TIME__简介

  经常都需要手动添加版本号或者生成时间会很繁琐。这个时候,C语言中的两个宏__DATE____TIME__可以帮到我们。
__DATE__用于获取系统日期,而__TIME__用于获取系统时间,我们可以根据该两个宏获取到的信息将其保存于程序变量中,在程序运行过程中直接调用。

__DATE__的格式为 “Aug 27 2013” | “Sep 3 2019”
__TIME__的格式为 “14:01:32”

二、版本管理源码

  根据上面获取的格式,也可以自己写出Version版本管理;这里的源码(内有注释)如下

2.1 数值输出

2.1.1 Version.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include "Version.h"
/********************************************************************************
块注释 : 获取系统编译日期
********************************************************************************/
unsigned int GetBuildDate(void)
{
const unsigned char *StrD=__DATE__;
unsigned int u32DateBuf=0;

u32DateBuf+=(StrD[10]-'0')*10000;
u32DateBuf+=(StrD[9] -'0')*100000;

if(StrD[4]!=' ')u32DateBuf+=(StrD[4]-'0')*10;
u32DateBuf+=(StrD[5]-'0');
switch(StrD[0])
{
case 'J':
switch(StrD[1])
{
case 'a':u32DateBuf+=100;break; //January
case 'u':
switch(StrD[2])
{
case 'n':u32DateBuf+=600;break; //June
case 'l':u32DateBuf+=700;break; //July
default:break;
}
break;
default:break;
}
break;
case 'F':u32DateBuf+=200;break; //February
case 'M':
switch(StrD[2])
{
case 'r':u32DateBuf+=300;break; //March
case 'y':u32DateBuf+=500;break; //May
default:break;
}
break;
case 'A':
switch(StrD[1])
{
case 'p':u32DateBuf+=400;break; //April
case 'u':u32DateBuf+=800;break; //August
default:break;
}
break;
case 'S':u32DateBuf+=900;break; //September
case 'O':u32DateBuf+=1000;break; //October
case 'N':u32DateBuf+=1100;break; //November
case 'D':u32DateBuf+=1200;break; //December
default:break;
}
return u32DateBuf;
}//这样得出来的数据为:190903

/********************************************************************************
块注释:获取系统编译时间
********************************************************************************/
unsigned int GetBuildTime(void)
{
const unsigned char *StrD=__TIME__;
unsigned int u32DateBuf=0;

u32DateBuf = 0;
u32DateBuf+=(StrD[0] - '0')*100000;
u32DateBuf+=(StrD[1] - '0')*10000;

u32DateBuf+=(StrD[3] - '0')*1000;
u32DateBuf+=(StrD[4] - '0')*100;

u32DateBuf+=(StrD[6] - '0')*10;
u32DateBuf+=(StrD[7] - '0');

return u32DateBuf;
}//这样得出来的数据为:140132

/***************************************The End Of This File***************************************/

2.1.2 Version.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef _VERSION_H
#define _VERSION_H

#include <stdint.h>
#include <string.h>

/*******************************************************************************
块注释:版本信息
*******************************************************************************/
#define SFVERSION (10112UL) // 通讯显示版本号:01.01.12


/*******************************************************************************
块注释:对外接口
*******************************************************************************/
unsigned int GetBuildDate(void); // 获取系统编译日期
unsigned int GetBuildTime(void); // 获取系统编译时间

#endif
/***************************************The End Of This File***************************************/

2.2 字符串输出

2.2.1 Version.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#include "Version.h"
/********************************************************************************
块注释 : 获取系统编译日期
********************************************************************************/
void SetBuildDate(char *pBuildDate)
{
const char *StrD = __DATE__;

// if(0 == LanguageMode)
{
pBuildDate[0] = StrD[7];
pBuildDate[1] = StrD[8];
pBuildDate[2] = StrD[9];
pBuildDate[3] = StrD[10];
pBuildDate[4] = '/';

switch(StrD[0])
{
case 'J':
{
switch(StrD[1])
{
case 'a':
pBuildDate[5] = '0';
pBuildDate[6] = '1';
break;
case 'u':
switch(StrD[2])
{
case 'n':
pBuildDate[5] = '0';
pBuildDate[6] = '6';
break;
case 'l':
pBuildDate[5] = '0';
pBuildDate[6] = '7';
break;
default:break;
}
break;
default:break;
}
}
break;
case 'F':
pBuildDate[5] = '0';
pBuildDate[6] = '2';
break;
case 'M':
{
switch(StrD[2])
{
case 'r':
pBuildDate[5] = '0';
pBuildDate[6] = '3';
break;
case 'y':
pBuildDate[5] = '0';
pBuildDate[6] = '5';
break;
default:break;
}
}
break;
case 'A':
{
switch(StrD[1])
{
case 'p':
pBuildDate[5] = '0';
pBuildDate[6] = '4';
break;
case 'u':
pBuildDate[5] = '0';
pBuildDate[6] = '8';
break;
default:break;
}
}
break;
case 'S':pBuildDate[5]='0';pBuildDate[6]='9';break;
case 'O':pBuildDate[5]='1';pBuildDate[6]='0';break;
case 'N':pBuildDate[5]='1';pBuildDate[6]='1';break;
case 'D':pBuildDate[5]='1';pBuildDate[6]='2';break;
default:break;
}
pBuildDate[7] = '/';
if(StrD[4] == ' ')pBuildDate[8] = '0';
else pBuildDate[8] = StrD[4];
pBuildDate[9] = StrD[5];
pBuildDate[10] = '\0';
}
/*英文格式显示
else
{
pBuildDate[6] = StrD[7];
pBuildDate[7] = StrD[8];
pBuildDate[8] = StrD[9];
pBuildDate[9] = StrD[10];
pBuildDate[10] = '\0';

switch(StrD[0])
{
case 'J':
{
switch(StrD[1])
{
case 'a':
pBuildDate[0] = '0';
pBuildDate[1] = '1';
break;
case 'u':
{
switch(StrD[2])
{
case 'n':
pBuildDate[0] = '0';
pBuildDate[1] = '6';
break;
case 'l':
pBuildDate[0] = '0';
pBuildDate[1] = '7';
break;
default:break;
}
}
break;
default:break;
}
}
break;
case 'F':
{
pBuildDate[0] = '0';
pBuildDate[1] = '2';
}
break;
case 'M':
{
switch(StrD[2])
{
case 'r':
pBuildDate[0] = '0';
pBuildDate[1] = '3';
break;
case 'y':
pBuildDate[0] = '0';
pBuildDate[1] = '5';
break;
default:break;
}
}
break;
case 'A':
{
switch(StrD[1])
{
case 'p':
pBuildDate[0] = '0';
pBuildDate[1] = '4';
break;
case 'u':
pBuildDate[0] = '0';
pBuildDate[1] = '8';
break;
default:break;
}
}
break;
case 'S':pBuildDate[0]='0';pBuildDate[1]='9';break;
case 'O':pBuildDate[0]='1';pBuildDate[1]='0';break;
case 'N':pBuildDate[0]='1';pBuildDate[1]='1';break;
case 'D':pBuildDate[0]='1';pBuildDate[1]='2';break;
default:break;
}
pBuildDate[2] = '/';
if(StrD[4] == ' ')pBuildDate[3] = '0';
else
pBuildDate[3] = StrD[4];
pBuildDate[4] = StrD[5];
pBuildDate[5] = '/';
}
*/
}//这样得出来的数据为:2019/09/03

2.2.2 Version.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef _VERSION_H
#define _VERSION_H

#include <stdint.h>
#include <string.h>

/*******************************************************************************
块注释:版本信息
*******************************************************************************/
#define VERSION ("v1.01.02") // 通讯显示版本号:01.00.12


/*******************************************************************************
块注释:对外接口
*******************************************************************************/
void SetBuildDate(char *pBuildDate);// 获取系统编译日期
/***************************************The End Of This File***************************************/
#endif

三、注意要点

  编译方面需要注意有个别差异:
局部编译:不会再编译未改动位置;局部编译后,虽然 .bin文件生成的时间是 对应编译时间(准确)的,但因为该工程内获取版本时间代码未改动,因此导致局部编译未更新获取内部版本时间(和 .bin文件更新时间没关系)。该工程内部显示获取的版本时间仍为 你上一次 全局编译的时间。提交版本时候需要全局编译一次

-------------本文结束感谢您的阅读-------------