FreeRTOS空闲任务
生活随笔
收集整理的這篇文章主要介紹了
FreeRTOS空闲任务
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
空閑任務(wù)在啟動調(diào)度器的時(shí)候被創(chuàng)建
/* 啟動調(diào)度器 */ void vTaskStartScheduler( void ) {BaseType_t xReturn;#if (configSUPPORT_STATIC_ALLOCATION == 1){......}#else{/* 創(chuàng)建空閑任務(wù) */xReturn = xTaskCreate(prvIdleTask, configIDLE_TASK_NAME, configMINIMAL_STACK_SIZE, (void *)NULL, portPRIVILEGE_BIT, &xIdleTaskHandle);}#endif....if(xReturn == pdPASS){....../* 啟動調(diào)度器 */if(xPortStartScheduler() != pdFALSE){}else{}}else{......}...... }?
?
空閑任務(wù)的作用包括:保證系統(tǒng)至少有一個任務(wù)在運(yùn)行、檢查等待終結(jié)列表中是否有任務(wù)并釋放它們。
/* 空閑任務(wù) */ static portTASK_FUNCTION(prvIdleTask, pvParameters) {(void)pvParameters;portTASK_CALLS_SECURE_FUNCTIONS();for(;;){/* 檢查等待終結(jié)任務(wù)列表,釋放所有等待終結(jié)的任務(wù) */prvCheckTasksWaitingTermination();#if (configUSE_PREEMPTION == 0){taskYIELD();}#endif#if ((configUSE_PREEMPTION == 1) && (configIDLE_SHOULD_YIELD == 1)){/* 空閑任務(wù)優(yōu)先級所在就緒列表中,還有其他任務(wù) */if(listCURRENT_LIST_LENGTH(&(pxReadyTasksLists[tskIDLE_PRIORITY])) > (UBaseType_t)1){/* 能運(yùn)行到空閑任務(wù),說明高優(yōu)先級的任務(wù)都不在就緒態(tài) *//* 如果有和空閑任務(wù)優(yōu)先級一樣的任務(wù),不切換的話,就要等系統(tǒng)節(jié)拍器去切換 *//* 在這里直接申請切換,效率更高 */taskYIELD();}else{mtCOVERAGE_TEST_MARKER();}}#endif#if (configUSE_IDLE_HOOK == 1){extern void vApplicationIdleHook(void);vApplicationIdleHook();}#endif#if (configUSE_TICKLESS_IDLE != 0){TickType_t xExpectedIdleTime;xExpectedIdleTime = prvGetExpectedIdleTime();if(xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP){vTaskSuspendAll();{configASSERT(xNextTaskUnblockTime >= xTickCount);xExpectedIdleTime = prvGetExpectedIdleTime();configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING(xExpectedIdleTime);if(xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP){traceLOW_POWER_IDLE_BEGIN();portSUPPRESS_TICKS_AND_SLEEP(xExpectedIdleTime);traceLOW_POWER_IDLE_END();}else{mtCOVERAGE_TEST_MARKER();}}(void)xTaskResumeAll();}else{mtCOVERAGE_TEST_MARKER();}}#endif} }?
?
其中prvCheckTasksWaitingTermination()函數(shù),負(fù)責(zé)檢查等待終結(jié)列表并釋放所有等待終結(jié)的任務(wù)
/* 檢查等待終結(jié)任務(wù)列表,釋放所有等待終結(jié)的任務(wù) */ static void prvCheckTasksWaitingTermination(void) {#if (INCLUDE_vTaskDelete == 1){TCB_t *pxTCB;/* 將所有等待終結(jié)的線程都釋放掉 */while(uxDeletedTasksWaitingCleanUp > (UBaseType_t)0U){/* 進(jìn)入臨界區(qū) */taskENTER_CRITICAL();{/* 從等待終結(jié)列表中獲取任務(wù) */pxTCB = listGET_OWNER_OF_HEAD_ENTRY((&xTasksWaitingTermination));/* 將任務(wù)從等待終結(jié)列表中移除 */(void)uxListRemove(&(pxTCB->xStateListItem));/* 當(dāng)前任務(wù)數(shù)減一 */--uxCurrentNumberOfTasks;/* 等待終結(jié)的任務(wù)數(shù)減一 */--uxDeletedTasksWaitingCleanUp;}/* 退出臨界區(qū) */taskEXIT_CRITICAL();/* 釋放任務(wù)TCB */prvDeleteTCB(pxTCB);}}#endif }?
?
任務(wù)被刪除的時(shí)候,如果一個任務(wù)刪除另外一個任務(wù),被刪除任務(wù)的堆棧和TCB立即釋放。如果一個任務(wù)刪除自己,則會將任務(wù)掛接到檢查等待終結(jié)列表,有空閑任務(wù)負(fù)責(zé)釋放。
/* 刪除任務(wù) */ void vTaskDelete(TaskHandle_t xTaskToDelete) {TCB_t *pxTCB;/* 進(jìn)入臨界區(qū) */taskENTER_CRITICAL();{/* 通過任務(wù)句柄獲取任務(wù)TCB */pxTCB = prvGetTCBFromHandle(xTaskToDelete);/* 將任務(wù)從狀態(tài)列表中移除,狀態(tài)列表中沒有掛接任何任務(wù) */if(uxListRemove(&(pxTCB->xStateListItem)) == (UBaseType_t)0){/* 將該優(yōu)先級從當(dāng)前任務(wù)優(yōu)先級記錄中清除 */taskRESET_READY_PRIORITY(pxTCB->uxPriority);}else{mtCOVERAGE_TEST_MARKER();}/* 任務(wù)被掛接到事件列表 */if(listLIST_ITEM_CONTAINER(&(pxTCB->xEventListItem)) != NULL){/* 將任務(wù)從事件列表中移除 */(void)uxListRemove(&(pxTCB->xEventListItem));}else{mtCOVERAGE_TEST_MARKER();}/* 任務(wù)id號加一 */uxTaskNumber++;/* 該任務(wù)為當(dāng)前任務(wù) */if(pxTCB == pxCurrentTCB){/* 任務(wù)掛接到等待終結(jié)列表 */vListInsertEnd(&xTasksWaitingTermination, &(pxTCB->xStateListItem));/* 等待終結(jié)任務(wù)數(shù)加一 */++uxDeletedTasksWaitingCleanUp;portPRE_TASK_DELETE_HOOK(pxTCB, &xYieldPending);}else{/* 當(dāng)前任務(wù)數(shù)減一 */--uxCurrentNumberOfTasks;/* 刪除任務(wù)TCB */prvDeleteTCB(pxTCB);/* 更新下一個要解除阻塞的時(shí)間,防止該任務(wù)是先需要解除的任務(wù) */prvResetNextTaskUnblockTime();}traceTASK_DELETE(pxTCB);}/* 退出臨界區(qū) */taskEXIT_CRITICAL();/* 調(diào)度器正在運(yùn)行 */if(xSchedulerRunning != pdFALSE){/* 該任務(wù)為當(dāng)前任務(wù) */if(pxTCB == pxCurrentTCB){configASSERT(uxSchedulerSuspended == 0);/* 請求切換任務(wù) */portYIELD_WITHIN_API();}else{mtCOVERAGE_TEST_MARKER();}} }?
總結(jié)
以上是生活随笔為你收集整理的FreeRTOS空闲任务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 难以理解的软件工程师:几千行代码能搞定为
- 下一篇: 面试了8家公司,他们问了我这些机器学习题