空閒任務在啟動排程器的時候被建立
/* 啟動排程器 */
void vtaskstartscheduler( void )
#else
#endif
....
if(xreturn == pdpass)
else
}else
......
}
空閒任務的作用包括:保證系統至少有乙個任務在執行、檢查等待終結列表中是否有任務並釋放它們。
/* 空閒任務 */
static porttask_function(prvidletask, pvparameters)
#endif
#if ((configuse_preemption == 1) && (configidle_should_yield == 1))
else
}#endif
#if (configuse_idle_hook == 1)
#endif
#if (configuse_tickless_idle != 0)
else
}(void)xtaskresumeall();
}else
}#endif
}}
其中prvchecktaskswaitingtermination()函式,負責檢查等待終結列表並釋放所有等待終結的任務
/* 檢查等待終結任務列表,釋放所有等待終結的任務 */
static void prvchecktaskswaitingtermination(void)
/* 退出臨界區 */
taskexit_critical();
/* 釋放任務tcb */
prvdeletetcb(pxtcb);
} }#endif
}
/* 刪除任務 */
void vtaskdelete(taskhandle_t xtasktodelete)
else
/* 任務被掛接到事件列表 */
if(listlist_item_container(&(pxtcb->xeventlistitem)) != null)
else
/* 任務id號加一 */
uxtasknumber++;
/* 該任務為當前任務 */
if(pxtcb == pxcurrenttcb)
else
tracetask_delete(pxtcb);
} /* 退出臨界區 */
taskexit_critical();
/* 排程器正在執行 */
if(xschedulerrunning != pdfalse)
else
}}
FreeRtos 空閒任務與空閒任務鉤子函式
以下基礎知識 自正點原子pdf資料。前面例子中建立的任務大部份時間都處於阻塞態。這種狀態下所有的任務都不可執行,所以也不能被排程器選中。但處理器總是需要 來執行 所以至少要有乙個任務處於執行態。為了保證這 一點,當呼叫 vtaskstartscheduler 時,排程器會自動建立乙個空閒任務。空閒任...
FreeRTOS 空閒任務與阻塞延遲實現
在裸機執行中,我們是使用軟體延時來實現延時的功能 delay 即是讓cpu空等來達到延時的目的。使用rtos的很大優勢就是榨乾cpu效能,永遠不讓他閒著,任務需要延時也就不需要讓cpu空等來實現延時的效果。rtos中的延時叫做阻塞延時,即任務需要延時的時候,任務會放棄cpu的使用權,cpu可以去幹其...
freeRTOS 空閒任務與阻塞延時 1
rtos中的延時是在需要延時的時間內任務放棄cpu的使用權,超過延時時間後重新獲得cpu的使用權。叫做 阻塞延時。空閒任務是在啟動排程器後建立的,是cpu空閒時候執行的,是優先順序最低的。空閒任務主要做一些清理記憶體的的任務。空閒任務是不允許阻塞的。如何實現空閒任務?1.在main.c定義空閒任務棧...