小小毛

  • 85 主题
  • 302 帖子
  • 1128 积分
  • 身份:版主
  • 热心工程师 技术达人
  • E币:1712

【原创】MDK中如何自动获取编译日期以及编译脚本bat的编写

2021-5-19 09:10:06 显示全部楼层
本帖最后由 小小毛 于 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编译脚本,可以完全实现自动化。
最后附上源文件,欢迎下载:
游客,如果您要查看本帖隐藏内容请回复



您需要登录后才可以评论 登录 | 立即注册

最新评论

楼层直达:

小小毛

  • 85 主题
  • 302 帖子
  • 1128 积分
  • 身份:版主
  • 热心工程师 技术达人
  • E币:1712
小小毛 2021-6-8 11:47:48 显示全部楼层
aeqwTw 发表于 2021-5-21 10:31
如果沒有用自动化bat编译脚本,這個就沒有作用了對嗎?

也有用,其实是两个东西揉在一起说的

SnailWillow

  • 62 主题
  • 231 帖子
  • 1222 积分
  • 身份:版主
  • 论坛新秀
  • E币:1441

小小毛

  • 85 主题
  • 302 帖子
  • 1128 积分
  • 身份:版主
  • 热心工程师 技术达人
  • E币:1712
广告

电子阔少

  • 150 主题
  • 663 帖子
  • 1579 积分
  • 身份:版主
  • 论坛新秀 灌水之王
  • E币:1691

二哲科技

  • 171 主题
  • 508 帖子
  • 1841 积分
  • 身份:版主
  • 论坛新秀 灌水之王
  • E币:1050

zwjiang

  • 0 主题
  • 24 帖子
  • 2038 积分
  • 身份:LV5 资深技术员
  • E币:1018

aeqwTw

  • 0 主题
  • 26 帖子
  • 1014 积分
  • 身份:LV4 高级技术员
  • E币:620
aeqwTw 2021-5-21 10:31:47 显示全部楼层
如果沒有用自动化bat编译脚本,這個就沒有作用了對嗎?

点评

也有用,其实是两个东西揉在一起说的  详情 回复 发表于 2021-6-8 11:47
广告

skyblue

  • 0 主题
  • 4 帖子
  • 270 积分
  • 身份:LV1 技术小白
  • E币:215

Ziiiro

  • 0 主题
  • 15 帖子
  • 416 积分
  • 身份:LV2 初级技术员
  • E币:343

ywfl00_667779343

  • 0 主题
  • 4 帖子
  • 506 积分
  • 身份:LV3 中级技术员
  • E币:222

hyzhau_878982858

  • 0 主题
  • 1 帖子
  • 205 积分
  • 身份:LV1 技术小白
  • E币:199
广告

forrest

  • 2 主题
  • 18 帖子
  • 1095 积分
  • 身份:LV4 高级技术员
  • E币:582
快速回复
12
19
广告
关闭 热点推荐上一条 /6 下一条
快速回复 返回列表