打印
[其他ST产品]

获取编译时间作为版本号

[复制链接]
1806|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stormwind123|  楼主 | 2023-12-27 15:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
相信各位在开发的时候都有点烦代码的版本号要怎么命名,按照什么规律去命名,下面给大家介绍一下两个宏,可以获取每次编译时的年月日时分秒,非常好用!
` DATA TIME //注意是双下划线
这是两个编译器宏定义,keil里有的(我目前只用Keil验证了)。 用途:用于自动获取编译器编译时的当前时间。 –DATE– ------用于获取当前日期—格式— Jul 03 2020 –TIME– ------ 用于获取当前时间—格式—15:52:54 但是以上的格式不太符合我的习惯,所以我必须给他整一下! 我想要的是“年月日时分秒”的格式,所以有了以下的代码。
void get_ver_time(void){    u8 ver_len=0;    u8 cnt=0;    char time[10]=__TIME__;        char ver_time[10];            #define YEAR    ((( (__DATE__ [7 ] - '0') * 10  \                      + (__DATE__ [8 ] - '0')) * 10 \                      + (__DATE__ [9 ] - '0')) * 10 \                      + (__DATE__ [10] - '0'))    #define MONTH   ( __DATE__ [2] == 'n' ? (__DATE__ [1] == 'a' ? 1 : 6) \                    : __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'))    for(int i=0; time!=0; i++)    {      if(isdigit(time))      {        ver_time[cnt]=time;        cnt++;                }    }    ver_time[cnt++]=0;    ver_len=sprintf(str_ver_time,"V1.0_%d_%02d_%02d_%s",YEAR,MONTH,DAY,ver_time);}
获取到 DATE ------用于获取当前日期—格式— Jul 03 2020 年: 是_ DATE_的7-10位,直接用数组取取值后,取出来的ASCII 码,直接用来显示会有点问题,所以要减去0x30,也就是'0',
月份:需要取判断字母,来确定是几月份,具体就是按照每个月份的简称所组成的字母的差异来确定是几月。
日:和年类似,需要进一步第四位是不是空格 ,‘ ’,0x20(因为1-9号是1位数),我们需要补零。
时分秒:使用了isdigit 函数来过滤掉数据之间的空格!
最后打印出来的是,例子:2023 12 24 11 32 00 的纯数值。
注意,获取编译时间需要每一次都编译到才会更新,但是目前的的编译都是增量编译,没有改动的地方不会编译的,所以我们需要设置一下,这个函数所在的文件才可以确保每一次都可以获取到最新的编译时间!!
方法是:
点亮 总是编译即可!

使用特权

评论回复
沙发
sfd123| | 2023-12-28 08:33 | 只看该作者
能自动把编译出来的.hex文件名增加这个编译时间吗?

使用特权

评论回复
板凳
中国龙芯CDX| | 2023-12-28 08:58 | 只看该作者
楼主这个代码不容易看到呀

使用特权

评论回复
地板
储小勇_526| | 2023-12-28 10:25 | 只看该作者
这个真不错,省的自己去加版本号了

使用特权

评论回复
5
xch| | 2023-12-28 10:42 | 只看该作者
有点小复杂。IAR 中直接使用    _ _TIME_ _ , _ _DATE_ _ 作为常数变量

使用特权

评论回复
6
xch| | 2023-12-28 10:42 | 只看该作者
有点小复杂。IAR 中直接使用    _ _TIME_ _ , _ _DATE_ _ 作为常数变量

使用特权

评论回复
7
储小勇_526| | 2023-12-28 11:43 | 只看该作者
这里面有些许瑕疵,看了下搞定了,但是一大串数字作为版本号合适吗?有没有大神利用这个时间做其他应用吗?可以分享下

使用特权

评论回复
8
海洋无限| | 2023-12-28 12:30 | 只看该作者
不错

使用特权

评论回复
9
dukedz| | 2023-12-28 15:29 | 只看该作者
本帖最后由 dukedz 于 2023-12-28 15:44 编辑

建议用 git 版本信息做版本号,我的项目都是如此,譬如

CDFOC 无刷电机 FOC 控制器: https://github.com/dukelec/cdfoc
CDSTEP 步进电机控制器: https://github.com/dukelec/cdstep
CDCAM 串口摄像头: https://github.com/dukelec/cdcam

git 版本获取是在 makefile 里面完成,譬如下图,版本字符串包含最新的 tag 号:v5.1,后面 -9 表示基于这个 tag 之后的第 9 个提交,最后 -g04370d4 表示对应 git 提交的 hash 值为 04370d4,如果代码不干净,后面还会有 -dirty 标记
当然,想继续增加编译日期也很简单,只是没有必要


因为查一下 git 就知道是什么时候的代码编译的了(对应图中 10 月 15 号):


对应的 git 命令为(makefile 是 stm32cubemx 自动生成,默认没有第 17 行的内容):







使用特权

评论回复
10
linjinming2000| | 2023-12-28 17:01 | 只看该作者
#ifndef BUILD_TIME_H
#define        BUILD_TIME_H

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

#define BUILD_MONTH_IS_JAN                                 (__DATE__[0] == 'J' && __DATE__[1] == 'a' && __DATE__[2] == 'n')
#define BUILD_MONTH_IS_FEB                                 (__DATE__[0] == 'F')
#define BUILD_MONTH_IS_MAR                                 (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'r')
#define BUILD_MONTH_IS_APR                                 (__DATE__[0] == 'A' && __DATE__[1] == 'p')
#define BUILD_MONTH_IS_MAY                                 (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'y')
#define BUILD_MONTH_IS_JUN                                 (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'n')
#define BUILD_MONTH_IS_JUL                                 (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'l')
#define BUILD_MONTH_IS_AUG                                 (__DATE__[0] == 'A' && __DATE__[1] == 'u')
#define BUILD_MONTH_IS_SEP                                 (__DATE__[0] == 'S')
#define BUILD_MONTH_IS_OCT                                 (__DATE__[0] == 'O')
#define BUILD_MONTH_IS_NOV                                 (__DATE__[0] == 'N')
#define BUILD_MONTH_IS_DEC                                 (__DATE__[0] == 'D')

#define BUILD_MONTH()                                                                                                         \
                                                                            (                                                                 \
                                                                                (BUILD_MONTH_IS_JAN) ? 1 :  \
                                                                                (BUILD_MONTH_IS_FEB) ? 2 :  \
                                                                                (BUILD_MONTH_IS_MAR) ? 3 :  \
                                                                                (BUILD_MONTH_IS_APR) ? 4 :  \
                                                                                (BUILD_MONTH_IS_MAY) ? 5 :  \
                                                                                (BUILD_MONTH_IS_JUN) ? 6 :  \
                                                                                (BUILD_MONTH_IS_JUL) ? 7 :  \
                                                                                (BUILD_MONTH_IS_AUG) ? 8 :  \
                                                                                (BUILD_MONTH_IS_SEP) ? 9 :  \
                                                                                (BUILD_MONTH_IS_OCT) ? 10 : \
                                                                                (BUILD_MONTH_IS_NOV) ? 11 : \
                                                                                (BUILD_MONTH_IS_DEC) ? 12 : \
                                                                                /* 错误,默认一月 */   1        \
                                                                            )

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

#define BUILD_HOUR()                                     (((__TIME__[0] >= '0') ? (__TIME__[0] - '0') : 0) * 10 + (__TIME__[1] - '0'))
#define BUILD_MIN()                                     (((__TIME__[3] >= '0') ? (__TIME__[3] - '0') : 0) * 10 + (__TIME__[4] - '0'))
#define BUILD_SEC()                                     (((__TIME__[6] >= '0') ? (__TIME__[6] - '0') : 0) * 10 + (__TIME__[7] - '0'))

#define        APP_LoadBuildTime(arr,n)                \
{                                                                                \
        arr##[n + 0] = BUILD_YEAR();                \
        arr##[n + 1] = BUILD_MONTH();                \
        arr##[n + 2] = BUILD_DAY();                        \
        arr##[n + 3] = BUILD_HOUR();                \
        arr##[n + 4] = BUILD_MIN();                        \
        arr##[n + 5] = BUILD_SEC();                        \
}

#endif

使用特权

评论回复
11
linjinming2000| | 2023-12-28 17:02 | 只看该作者
使用的时候只需要调用APP_LoadBuildTime(arr,n)宏,arr为数组,n为起始下标

使用特权

评论回复
12
linjinming2000| | 2023-12-28 17:04 | 只看该作者
附件为H文件

BTime.rar

637 Bytes

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

438

主题

2274

帖子

3

粉丝