本帖最后由 小小毛 于 2021-5-20 16:06 编辑

       需求背景:
       每次程序修改,变更以及发布,都要手动修改程序版本以及版本日期,有些程序员难免会粗心忘记修改。
       原理:
       因为编译器每次编译后都会记录日期,我们可以通过一个宏 __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
  • 复制代码
    然后在C文件中通过一个接口去获取:
    #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脚本,可以实现自动化编译:
    企业微信截图_16213864144716.png 企业微信截图_16213863938073.png

        个人认为这个功能非常有用,配合自动化bat编译脚本,可以完全实现自动化。
    最后附上源文件,欢迎下载:
    游客,如果您要查看本帖隐藏内容请回复