打印

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

[复制链接]
578|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ee168|  楼主 | 2022-11-1 11:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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老是报病毒



DoVer.rar

6.96 KB

使用特权

评论回复

相关帖子

沙发
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]++;        // 当前年为闰年,二月加 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[7]), "%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[4]), "%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;
}

DoVer.rar

6.96 KB

使用特权

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

本版积分规则

112

主题

196

帖子

2

粉丝