日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

FreeRTOS空闲任务

發(fā)布時(shí)間:2025/3/15 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。