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

       需求背景:
       每次程序修改,变更以及发布,都要手动修改程序版本以及版本日期,有些程序员难免会粗心忘记修改。
       原理:
       因为编译器每次编译后都会记录日期,我们可以通过一个宏 __TIME__ __DATE__ 来获取日期和时间,获取到之后,是一个字符串形式。
      实验条件:
      MDK集成工具V5.0版本以上。
       实现方法:
         今天,他来了!
     首先定义日期结构体:
  1. #ifndef __VERSION_H
  2. #define __VERSION_H
  3. #include <string.h>
  4. #include <stdlib.h>
  5. typedef struct version_date
  6. {
  7.    int tm_mday;        /* 月中的第几天,范围从 1 到 31*/
  8.    int tm_mon;         /* 月份,范围从 1 到 12*/
  9.    int tm_year;        /* 实际的年数 */      
  10. }version_date;
  11. extern version_date v_date;
  12. void mcu_get_version_date(void);
  13. #endif
然后在C文件中通过一个接口去获取:
  1. #include "version.h"
  2. /**********************************************************
  3. 本文件包含2个功能:
  4. 1. 软件版本日期
  5. 2. mbus ID,从芯片的唯一ID号读取
  6. 软件版本号不可控,统一使用软件版本日期。
  7. 1. 读软件版本日期 格式如下:3字节协议:
  8. Byte0 : 00~99 表示[2020 ~ 2099]
  9. Byte1 : 1~12   月Mon
  10. Byte2 : 1~31   日day
  11. exp : Nov  4 2020
  12. *********************************************************/
  13. char  TimeStr[]= __TIME__;
  14. char  DataStr[]= __DATE__; //"Nov  4 2020";
  15. version_date v_date;
  16. char Month_tab[][12] =
  17. {
  18.         "January",
  19.         "February",
  20.         "March",
  21.         "April",
  22.         "May",
  23.         "June",
  24.         "July",        
  25.         "August",
  26.         "September",
  27.         "September",
  28.         "November",
  29.         "December",
  30. };
  31. /*
  32. 获取编译后的字符日期版本,转换成整数后保存
  33. // Nov  4 2020
  34. */
  35. void mcu_get_version_date(void)
  36. {
  37.         /*比较前3个字符,找出月份*/
  38.         for(int i = 0; i < 12; i++)
  39.         {
  40.                 char *ptr = Month_tab[i];        
  41.                 if(*ptr == DataStr[0])
  42.                 {
  43.                         ptr++;        
  44.                         if(*ptr == DataStr[1])
  45.                         {
  46.                                 ptr++;        
  47.                                 if(*ptr == DataStr[2])
  48.                                 {
  49.                                         v_date.tm_mon = i+1;
  50.                                         break;                        
  51.                                 }                        
  52.                         }
  53.                 }
  54.         }
  55.         /*找出日+年*/        
  56.    char *pstr = DataStr;
  57.    pstr = strchr(pstr, ' '); /*寻找空格*/
  58.    pstr++;        
  59.    if(*pstr == ' ')  /*如果为1~9日,则字符串中隔有2个空格*/
  60.    {        
  61.           pstr++;        
  62.           // 字符转数字  
  63.          char b = *pstr;   
  64.          v_date.tm_mday = (b - 0x30);               
  65.    }
  66.    else
  67.    {
  68.          char a = *pstr;  
  69.          pstr++;        
  70.          char b = *pstr;   
  71.          v_date.tm_mday = (a - 0x30)*10 + (b - 0x30);         
  72.    }
  73.    pstr++;
  74.    v_date.tm_year = atoi(pstr);
  75. }
最后,通过运行,bat脚本,可以实现自动化编译:
企业微信截图_16213864144716.png 企业微信截图_16213863938073.png

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