在MCU开发过程中,有时候我们会使用Keil的内置宏__DATE__和__TIME__这两个宏定义,在MCU上电时将它们通过UART打印出来,具体到编译的时分秒
printf("sys start!\r\n");
printf("Build at: %s %s\r\n",__DATE__, __TIME__);
输出:
sys start!
Build at: Sep 13 2023 09:52:54
我们预期的目的是,每次编译完成,烧录到MCU之后,MCU都能够准确打印出该固件的编译时间。但如果你发现打印的时间不准确,是较早前的时间,而不是真正编译的时间,那么需要注意:
需要确保每次编译时,这两条个宏定义,所在的文件都能够编译。按照Keil的编译逻辑,默认是不编译未修改过的源文件,只链接。
例如这两条打印语句的位置,是在int main(void)函数中,且main函数在main.c文件中,假如本次修改代码,未修改main.c文件,那么Keil是不会重新编译main.c文件的,也就不会将编译时的__DATE__和__TIME__编译进去。
也可以通过以下设置,使得main.c文件,无论是否修改,每次编译时都会重新编译它:
当然每次都编译main.c,并非是最好的代码风格,可以把版本号打印提炼成一个函数,并单独使用一个.c文件进行实现,并将这个.c文件按照以上方法设置。