ee168 发表于 2022-11-1 11:12

发布一个Keil下执行文件备份的小程序

本帖最后由 ee168 于 2022-11-3 11:01 编辑

在cmd下不带后缀可以得到以下帮助
请添加文件名或文件夹名,不带后缀的表示为文件夹。

说明:
此程序是为了备份Keil下不同版本的执行文件而开发。
本程序可放在工程文件下,可通过Option->User,After Build放置"<path>\DoVer xxx.hex"实现。
xxx.hex 为keil输出文件。
其将Keil生成的执行文件搜索,复制过来,并在后面加上版本号。
版本号=某年(默认2022)开始的多少天的第n次编译。
天用16进制表示,n=10进制0-99。

此程序长度=15,360字节。
自行确认文件是否被修改,可联系QQ:14464332。

注意:这个程序要放在输出文件(夹)同级或上级目录中,此程序也可用于Keil以外的执行文件备份,自行建立批处理文件即可。这个程序用VC2015编译,360老是报病毒



ee168 发表于 2022-11-1 11:14

本帖最后由 ee168 于 2022-11-1 14:34 编辑

如果是文件夹
可通过Option->User,After Build放置"<path>\DoVer xxx"实现。
xxx 为keil输出文件夹。


注意这个程序要放在输出文件(夹)同级或上级目录中


另外付版本计算

typedef struct      //
{
      unsigned short int year;      //
      unsigned char month;      // 1-0x0C
      unsigned char day;      // 1-0x1F
}DateX_s;


unsigned int VerYear = 2020;
int GetAbsDays(DateX_s x)
{
      int i;
      int month_day[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
      int year = x.year - 1;      // 因为欲求距离1年1月1日的距离
      int days = year * 365 + year / 4 - year / 100 + year / 400;      // 求得之前闰年的数量并在天数上进行想加
      if ((x.year % 4 == 0 && x.year % 100 != 0) || x.year % 400 == 0)
                month_day++;      // 当前年为闰年,二月加 1
      for (i = 0; i<x.month - 1; i++)
                days += month_day;
      days += x.day - 1;      // 今天应该是不算如天数计数
      return days;
}
unsigned int keil_compile_ver(unsigned char *pAsc)
{
      unsigned char DataStr[] = __DATE__;
      DateX_s sDefaultDay, sToday;
      uint32_t u32tmp;

      // 年
      sscanf((const char*)(&DataStr), "%4u", &u32tmp);
      if (u32tmp < VerYear)
      {
                *pAsc = 0;
                return 0;
      }
      sToday.year = u32tmp;
      // 月
      if                         (memcmp(DataStr, "Jan", 3) == 0)      // 1月
                sToday.month = 1;
      else if (memcmp(DataStr, "Feb", 3) == 0)      // 2月
                sToday.month = 2;
      else if (memcmp(DataStr, "Mar", 3) == 0)      // 3月
                sToday.month = 3;
      else if (memcmp(DataStr, "Apr", 3) == 0)
                sToday.month = 4;
      else if (memcmp(DataStr, "May", 3) == 0)
                sToday.month = 5;
      else if (memcmp(DataStr, "Jun", 3) == 0)
                sToday.month = 6;
      else if (memcmp(DataStr, "Jul", 3) == 0)
                sToday.month = 7;
      else if (memcmp(DataStr, "Aug", 3) == 0)
                sToday.month = 8;
      else if (memcmp(DataStr, "Sep", 3) == 0)
                sToday.month = 9;
      else if (memcmp(DataStr, "Oct", 3) == 0)
                sToday.month = 10;
      else if (memcmp(DataStr, "Nov", 3) == 0)
                sToday.month = 11;
      else if (memcmp(DataStr, "Dec", 3) == 0)
                sToday.month = 12;
      else
      {
                *pAsc = 0;
                return 0;
      }
      sscanf((const char*)(&DataStr), "%2u", &u32tmp);
      if(u32tmp < 1 || u32tmp > 31)
      {
                *pAsc = 0;
                return 0;
      }
      sToday.day = u32tmp;
      sDefaultDay.year = VerYear;
      sDefaultDay.month = 1;
      sDefaultDay.day = 1;
      u32tmp = GetAbsDays(sToday) - GetAbsDays(sDefaultDay);
      if (pAsc)
                sprintf((char*)pAsc,"%04X", u32tmp);
      return u32tmp;
}
页: [1]
查看完整版本: 发布一个Keil下执行文件备份的小程序