加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 裸機 vs 系統(tǒng)
    • OS空閑任務(wù)
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

RTOS沒有執(zhí)行任務(wù),CPU在干嘛?

09/26 12:10
443
閱讀需 5 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

微信公眾號 | strongerHuang

前幾天,有小伙伴問了大概這么一個問題:RTOS有很多任務(wù),如果沒有執(zhí)行任務(wù)了,都在延時等待(如vTaskDelay),或等待事件觸發(fā)(如xQueueReceive),CPU在干嘛?

從裸機轉(zhuǎn)向RTOS的小伙伴,不知道你有沒有過這樣的疑問?

裸機 vs 系統(tǒng)

裸機情況下,就是一個while死循環(huán):

int main(void){  /* 初始化 */  while(1)  {  /* 循環(huán)處理多項事情 */  }}

換上RTOS就是為了提高CPU利用率,使其執(zhí)行多個任務(wù)(多個while):

void?Task1(void){  /* 初始化 */  while(1)  {    /* 處理事情1 */  }}
void Task2(void){  /* 初始化 */  while(1)  {    /* 處理事情2 */  }}
void?Task3(void)void Task4(void)......

通過對比裸機和操作系統(tǒng)的區(qū)別,再結(jié)合開篇的問題,你能聯(lián)想到什么?

裸機情況下,CPU永遠都在while(1)大循環(huán)中。那么,在操作系統(tǒng)下,CPU除了執(zhí)行任務(wù)中的while,其他時間都執(zhí)行到哪兒去了?

答案是:CPU在執(zhí)行操作系統(tǒng)自帶的空閑任務(wù)/線程/進程

OS空閑任務(wù)

我們打開Windows系統(tǒng)的任務(wù)管理器,不操作電腦時,你會發(fā)現(xiàn)一個進程CPU占有率很高:

沒錯,這個進行就是系統(tǒng)空閑進程

在RTOS實時操作系統(tǒng)中,也有一個類似這樣的線程(任務(wù)),叫空閑任務(wù)。

uCOS中空閑任務(wù)叫:OS_TaskIdleFreeRTOS中空閑任務(wù)叫:prvIdleTask

當然你在線調(diào)試帶有RTOS操作系統(tǒng)的項目時,暫停運行代碼,有很大概率CPU會執(zhí)行到空閑任務(wù)。

比如uCOS空閑函數(shù):

void  OS_TaskIdle (void *p_arg){#if OS_CRITICAL_METHOD == 3u                     /* Allocate storage for CPU status register           */    OS_CPU_SR  cpu_sr = 0u;#endif    p_arg = p_arg;                               /* Prevent compiler warning for not using 'p_arg'     */    for (;;) {        OS_ENTER_CRITICAL();        OSIdleCtr++;        OS_EXIT_CRITICAL();        OSTaskIdleHook();                        /* Call user definable HOOK                           */    }}

其實,你會發(fā)現(xiàn)這個系統(tǒng)空閑函數(shù)也沒什么代碼,就是在哪兒“死循環(huán)”。

這里有一個?OSTaskIdleHook();函數(shù)是提供給用戶的,默認情況下,這個函數(shù)也是啥東西沒有,需要用戶根據(jù)自己情況添加代碼。這里可以參看我之前分享的文章:RTOS中鉤子函數(shù)HOOK的用途及用法

所以,回到本文的問題:RTOS沒有執(zhí)行任務(wù),CPU在干嘛?

答案是:默認情況下,啥都沒干!當然,如果你看到CPU太閑了,你也可以讓它干點事。比如在上面的 OSTaskIdleHook() 函數(shù)里面添加一句打印輸出:

printf("CPU在偷懶了...nr");

最后,你對RTOS實時操作系統(tǒng)內(nèi)核了解多少?有多少小伙伴閱讀過內(nèi)核源碼?

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

作者黃工,從事嵌入式軟件開發(fā)工作8年有余,高級嵌入式軟件工程師,業(yè)余維護公眾號『strongerHuang』,分享嵌入式軟硬件、單片機、物聯(lián)網(wǎng)等內(nèi)容。