RT-Thread、LiteOS這些操作系統(tǒng)中,編譯出的程序?yàn)槭裁茨艽蛴〕霎?dāng)前時(shí)間?
掃描二維碼
隨時(shí)隨地手機(jī)看文章
1. 做實(shí)驗(yàn)引發(fā)的思考
在之前學(xué)習(xí)RT-Thread操作系統(tǒng)時(shí),我發(fā)現(xiàn)一個(gè)比較有趣的現(xiàn)象:
串口打印的日志中竟然包含著當(dāng)前時(shí)間!并且,我每天做實(shí)驗(yàn)時(shí),這個(gè)日期都會(huì)變化,還能保持和當(dāng)前時(shí)間一致!
我的好奇心被引發(fā)了,系統(tǒng)會(huì)不會(huì)偷偷配置了RTC,不然它怎么知道現(xiàn)在幾點(diǎn)了?
懷揣著問(wèn)題,我決定要去探索一下。
2. 系統(tǒng)打印出的當(dāng)前時(shí)間
這是RT-Thread剛上電時(shí)控制臺(tái)默認(rèn)打印的內(nèi)容,可以看到日期在今天:
再來(lái)看看LiteOS的,不僅能打印出當(dāng)前日期,還能精確到時(shí)分秒:
3. 揭曉謎底
其實(shí),這些系統(tǒng)之所以準(zhǔn)確的打印出當(dāng)前時(shí)間,和板子硬件沒(méi)有任何關(guān)系,更不會(huì)使用的RTC,只是在代碼里巧妙的利用了C語(yǔ)言的一個(gè)不常用知識(shí)點(diǎn) —— 編譯器內(nèi)置宏定義。
C語(yǔ)言編譯器中內(nèi)置了一些宏定義,這些內(nèi)置宏定義可以巧妙地幫我們輸出非常有用的調(diào)試信息,比如打印時(shí)間就用到了下面這兩個(gè)宏定義:
-
__DATE__
:在源文件中插入當(dāng)前的編譯日期; -
__TIME__
:在源文件中插入當(dāng)前編譯時(shí)間;
編寫(xiě)一個(gè)簡(jiǎn)單的C程序測(cè)試一下:
#include <stdio.h>
int main(void)
{
printf("_DATE_ is:%s\r\n", __DATE__);
printf("_TIME_ is:%s\r\n", __TIME__);
return 0;
}
編譯運(yùn)行,測(cè)試結(jié)果如下:
RT-Thread的源碼實(shí)現(xiàn)如下,是不是用__DATE__
這個(gè)宏定義實(shí)現(xiàn):
void rt_show_version(void)
{
rt_kprintf("\n \\ | /\n");
rt_kprintf("- RT - Thread Operating System\n");
rt_kprintf(" / | \\ %d.%d.%d build %s\n",
RT_VERSION, RT_SUBVERSION, RT_REVISION, __DATE__);
rt_kprintf(" 2006 - 2019 Copyright by rt-thread team\n");
}
再來(lái)看看LiteOS的源碼實(shí)現(xiàn),是不是也用__TIME__
和__DATE__
這兩個(gè)宏定義實(shí)現(xiàn):
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;
}
本文授權(quán)轉(zhuǎn)載自公眾號(hào)“mculover666”,作者mculover666
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!