为啥这里一直是灰的,魔法棒也点不了,破解说是成功了,也写了程序了,就是灰的
C语言编译器生成目标代码时,会生成常量字符串:__DATE__ 、__TIME__,分别表示编译的日期与时间。将这两个字符串作为版本号的一部分,每次编译时都会自动变化,这样就达到了版本号与代码编译版本唯一对应的目的。
例如,如下代码通过调试打印接口输出版本号及设备UID等信息:
printf("\r\n******************************************************************\r\n");
printf(" 欢迎使用XXXX流量计算机\r\n");
printf(" 固件编译时间:%s %s\r\n", __DATE__, __TIME__);
printf(" UID: %08X %08X %08X\r\n", UID[0], UID[1], UID[2]);
printf("******************************************************************\r\n");
问题就这么轻松愉快地解决了?没有这么简单!
多编译运行几次,你会发现,并不是每次编译时, __DATE__ 、__TIME__ 都会变化。只有引用了这两个宏的代码所在的源文件有修改,进行了重新编译,__DATE__ 、__TIME__才会变化。这与我们的期望还是有一定差距。我们期望的是只要整个工程有任何源文件被编辑、编译、链接,都能够更新__DATE__ 、__TIME__,这样才能保证版本号与编译版本的一一对应。
解决办法有两个:
一种办法是每次编译都使用build-all选项,将所有源文件重新编译,这有点太笨了,费时费力也不讨好,当然不是我想说的。
另一种办法是设置需要输出__DATE__ 、__TIME__作为子版本号的代码所在源文件在每次执行编译操作时都能被重新编译,这才是聪明的办法,而且至少在keil开发环境中很容易实现。步骤如下:
使用其它开发环境的同学不妨探索一下如何设置达到同样的目的,我认为这是很实用的一个小技巧。