发布一个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 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]