利用KEIL内置的__DATE__和__TIME__宏自动生成软件版本

使用KEIL开发项目时,手动更改版本号会比较繁琐,而且经常容易错漏,为了减少这类繁琐的操作,可以利用KEIL内置的 DATE 和__TIME__这两个宏来获取编译时的日期和时间,这两个宏是字符串形式,可以直接打印,

printf(__DATE__); //日期
printf(__TIME__); //时间

输出结果是

Mar 15 2021  11:51:32

直接用日期作为软件版本号,长度太长,不利于显示。我们进行一下转换,只要2个字节就可以存放,方法:第1字节高4位存放年份的最后一个数字,低4位存放月份,1到12月用1~C表示,第2字节存放日期。
日期: Mar 15 2021 转换成版本是:13.15,21年3月15号
如果1天还有多个版本,可以把时间加上
转换代码如下:

/************************************************************
Copyright (C), 2013-2021
FileName: 
Author  : 祥子  QQ:570525287
Version : 1.0
Date    : 2022-3-22
Description: 
Function List:
History    : 
<author> <time> <version > <desc>

2022.3.22
1、以日期作为的版本标识
***********************************************************/
//----------------------版本------------------
typedef struct 
{
    u8 ver;             //大的版本号,用于升级识别:A0 A1 A2 A3 A4...AF  B0 B1...BF 十六进制显示
    u8 year_month;      //年月,高4位是年,低4位是月,2A 表示2022年10月 十六进制显示 
    u8 dat;             //日 十六进制显示 
    u8 hour;
    u8 minute;
    u8 secode;
}REVISION_TypeDef;

extern REVISION_TypeDef revision;
void revision_make(void);


//---------------------日期 时间---------------------------
//月份 Jan  Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
const u8 str_date[12] = __DATE__; //示例 "Mar 23 2022"  
const u8 str_time[10] = __TIME__;
REVISION_TypeDef revision;

/*----------------------------------------------------------------------
Function   :revision_make
Description:生成版本号
Input      :无
Retrun     :
--------------------------------------------------------------------------*/
void revision_make(void)
{
    u8 year,month;
    u8 d1,d2;
    revision.ver = SOFTWARE_VER;
    
    d1 = str_date[4] - '0'; //日期 十位
    d2 = str_date[5] - '0'; //日期 个位
    revision.dat = d1 << 4 | d2; //
    
    //月份字符串转换成 1~C:先判断第3个字母,再判第2个字母,得到对应月份
    switch(str_date[2])
    {
        case 'n': //Jan和jun
            month = str_date[1] == 'a' ? 1 : 6; //判断1月还是6月
            break;

        case 'b': //Feb
            month = 2;
            break;

        case 'r': //Mart和Apr
            month = str_date[1] == 'a' ? 3 : 4; //判断3月还是4月
            break;

        case 'y': //May
            month = 5;
            break;

        case 'l': //Jul
            month = 7;
            break;

        case 'g': //Aug
            month = 8;
            break;

        case 'p': //Sep
            month = 9;
            break;

        case 't': //Oct
            month = 0x0A; //10
            break;

        case 'v': //Nov
            month = 0x0B; //11
            break;

        case 'c': //Dec
            month = 0x0C; //12
            break;
    }

    year = str_date[10] - '0';    //年份
    revision.year_month = year << 4 | month;
}

注意,每次编译时,要把这个函数重新编译才能生成当前日期。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: keil __main是Keil软件中的一个C语言程序的入口函数。在C语言中,每一个程序都必须有一个入口函数来启动程序的执行。在Keil软件中,这个入口函数被命名为__main。 当我们在Keil软件中编写C语言程序时,我们需要在程序中定义一个名为__main的函数。当程序被加载到嵌入式系统中运行时,系统就会自动调用这个函数来开始执行程序。 __main函数的作用类似于传统C语言中的main函数,它是程序的入口,是程序开始执行的地方。我们可以在__main函数中编写程序的初始化代码,例如配置系统的硬件资源、初始化变量、设置中断等等。同时,我们也可以在__main函数中编写程序的主要逻辑,例如循环、判断等等。 总之,keil __main是Keil软件中的C语言程序入口函数,它的作用是开始执行程序并初始化系统资源。 ### 回答2: Keil是一款功能强大的集成开发环境(IDE),被广泛用于嵌入式系统开发。__main是Keil IDE中的一个主函数,也是程序的入口点。在C或C++语言中,程序执行时会从main函数开始执行。因此,我们编写的嵌入式程序通常会在main函数中定义并调用其他功能函数,来实现特定的功能。 在Keil IDE中,__main函数会根据我们的项目设置,在适当的时机自动被调用。我们可以在__main函数中做一些初始化操作,例如设置时钟频率、配置外设等,然后开始执行程序的其他部分。在嵌入式系统中,__main函数起到了一个整个程序的框架的作用,它提供了程序的入口和出口,我们需要将程序的关键功能逻辑放置在__main函数之中。 Keil IDE提供了丰富的开发工具和调试功能,可以帮助我们方便地进行软件开发和调试。我们可以在Keil IDE中进行代码编写、编译、调试和下载等操作。编写完程序后,Keil IDE会根据我们的项目设置自动生成可执行文件或固件文件,方便我们将程序烧录到目标硬件上运行。 总而言之,__main是Keil IDE中的主函数,用于定义程序的入口和出口,我们可以在__main函数中进行初始化操作,并编写其他功能函数来实现嵌入式系统的特定功能。Keil IDE为我们提供了一站式的开发和调试工具,方便我们进行软件开发和测试。 ### 回答3: "__main__" 是一个特殊的内置变量,它在Python中的使用场景主要用于判断当前的脚本是否作为主程序执行。 当一个Python文件被直接运行时,也就是作为主程序执行时,该文件中的__name__变量的值被自动设置为"__main__"。这样可以方便地判断一个模块是被导入执行还是直接运行。 为了更清晰地理解这个概念,我们可以举一个例子。假设我们有一个python文件名为"example.py",其中包含以下代码: ``` def hello_world(): print("Hello, World!") print("I am example.py") print("__name__ value:", __name__) if __name__ == "__main__": hello_world() ``` 当我们直接执行这个文件时,如`python example.py`,输出结果为: ``` I am example.py __name__ value: __main__ Hello, World! ``` 可以看到,当该文件被作为主程序执行时,__name__变量的值为"__main__",并且`hello_world()`函数也被正常地执行了。 相反,如果我们在另一个python文件中导入"example.py"并且调用其中的函数时,如: ``` import example example.hello_world() ``` 那么输出结果为: ``` I am example.py __name__ value: example Hello, World! ``` 可以看到,在这种情况下,__name__变量的值为"example",证明该文件是作为模块被导入执行,而不是直接作为主程序执行。 总之,__main__变量的使用使我们可以方便地判断一个模块是被导入执行还是直接运行,并可以在需要时做出相应的处理。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值