建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块

mculover66...

发帖: 28粉丝: 2

级别 : 版主

Rank: 7Rank: 7Rank: 7

发消息 + 关注

发表于2020-2-2 09:57:12 154 2 楼主 显示全部楼层
[技术干货] LiteOS操作系统中,编译出的程序为什么能打印出当前时间?

![](https://img-blog.csdnimg.cn/20200202094937735.png) # 1. 做实验引发的思考 在之前学习LiteOS操作系统时,我发现一个比较有趣的现象: **串口打印的日志中竟然包含着当前时间!并且,我每天做实验时,这个日期都会变化,还能保持和当前时间一致!** 我的好奇心被引发了,系统会不会偷偷配置了RTC,不然它怎么知道现在几点了? 怀揣着问题,我决定要去探索一下。 # 2. 系统打印出的当前时间 LiteOS的日志,不仅能打印出当前日期,还能精确到时分秒: ![](https://img-blog.csdnimg.cn/2020020209065887.png) # 3. 揭晓谜底 其实,这些系统之所以准确的打印出当前时间,和板子硬件没有任何关系,更不会使用的RTC,只是在代码里巧妙的利用了C语言的一个不常用知识点 —— **编译器内置宏定义**。 C语言编译器中内置了一些宏定义,这些内置宏定义可以巧妙地帮我们输出非常有用的调试信息,比如打印时间就用到了下面这两个宏定义: - `__DATE__`:在源文件中**当前的编译日期; - `__TIME__`:在源文件中**当前编译时间; 编写一个简单的C程序测试一下: ```c #include <stdio.h> int main(void) { printf("_DATE_ is:%s\r\n", __DATE__); printf("_TIME_ is:%s\r\n", __TIME__); return 0; } ``` 编译运行,测试结果如下: ![](https://img-blog.csdnimg.cn/20200202091734250.png#pic_center) 看看LiteOS的源码实现,是不是也用`__TIME__`和`__DATE__`这两个宏定义实现: ```c static char s_link_mainversion[64]; const char *linkmain_version() { snprintf(s_link_mainversion,64,"V%d.%d.%d AT %s ON %s",CN_LINK_VERSION_MAJOR,\ CN_LINK_VERSION_MINOR,CN_LINK_VERSION_FEATURE,__TIME__,__DATE__); return s_link_mainversion; } ``` **接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』。** ![](https://img-blog.csdnimg.cn/20200202092055136.png)
举报
分享

分享文章到朋友圈

分享文章到微博

llb90

发帖: 17粉丝: 4

级别 : 注册会员

Rank: 2

发消息 + 关注

发表于2020-2-4 18:15:25 沙发 显示全部楼层

内容挺好,。只是文章开头写的思考给人造成误解了,其实就是打印个编译时间而已,

但是写了那么多,还扯上了RTC,开篇说的太玄了,容易让人理解成是内核打印日志真的会自动追加上时间似的


点赞 评论 引用 举报

mculover66...

发帖: 28粉丝: 2

级别 : 版主

Rank: 7Rank: 7Rank: 7

发消息 + 关注

发表于2020-2-6 11:12:22 板凳 显示全部楼层

回复:llb90 发表于 2020-2-4 18:15 内容挺好,。只是文章开头写的思考给人造成误解了,其实就是打印个编译时间而已,但是写了那么多,还扯上了RTC,开篇说的太玄了,容易让人理解成是内核打印日志真的会自

感谢指正

点赞 评论 引用 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册