目錄
1、任務建立和刪除api函式
1.1、任務建立
1.1.1、動態建立
1.1.2、靜態建立
1.2、任務刪除
1.3、動態建立與刪除**實現:
1.4、靜態建立與刪除**實現:
2、任務掛起和恢復 api 函式
2.1、任務掛起
2.2 任務恢復
2.3、中斷恢復
注意:這裡我只是簡單地介紹freertos任務的建立、刪除等過程,並沒有對原始碼進行分析,有興趣的朋友可以深入了解一下!
使用函式 xtaskcreate()來建立任務的話那麼這些所需的 ram 就會自動的從 freertos 的堆中分配, 因此必須提供記憶體管理檔案,預設我們使用heap_4.c 這個記憶體管理檔案,而且巨集 configsupport_dynamic_allocation 必須為 1。
basetype_t xtaskcreate( taskfunction_t pxtaskcode, //任務函式
const char * const pcname, //任務名稱
const uint16_t usstackdepth, //堆疊大小 x4
void * const pvparameters, //傳遞函式的引數
ubasetype_t uxpriority, //優先順序,範圍0~31
taskhandle_t * const pxcreatedtask ) //任務控制代碼,標誌
//返回值:
// pdpass: 任務建立成功。
// errcould_not_allocate_required_memory: 任務建立失敗,因為堆記憶體不足!
使用此函式建立的任務所需 的 ram 需 要 用 用 戶 來 提 供 。 如 果 要 使 用 此 函 數 的 話 需 要 將 巨集configsupport_static_allocation 定義為 1。
taskhandle_t xtaskcreatestatic( taskfunction_t pxtaskcode, //任務函式
const char * const pcname, //任務名稱
const uint32_t ulstackdepth, //任務堆疊大小,一般是個陣列
void * const pvparameters, //傳遞函式的引數
ubasetype_t uxpriority, //優先順序,範圍0~31
stacktype_t * const puxstackbuffer, //任務堆疊,一般為陣列
//陣列型別要為stacktype_t 型別
statictask_t * const pxtaskbuffer ) //任務控制塊
//返回值:
// null: 任務建立失敗, puxstackbuffer 或 pxtaskbuffer 為 null 的時候會導致這個錯誤的發生。
// 其他值:任務建立成功,返回任務的任務控制代碼
刪除後的任務不再存在,也就是不會進入執行狀態,也就不能再使用此任務的任務句,xtaskcreate()建立的,那麼在此任務被刪除以後此任務之前申請的堆疊和控制塊記憶體會在空閒任務中被釋放掉,因此當呼叫函式 vtaskdelete()刪除,任務以後必須給空閒任務一定的執行時間,如果是手動分配的就得在任務刪除後手動釋放記憶體,否則會導致記憶體洩漏。
//要刪除的任務的任務控制代碼 無返回值
vtaskdelete( taskhandle_t xtasktodelete )
步驟:
①freertosconfig.h中巨集configsupport_dynamic_allocation為1
②呼叫動態建立任務函式xtaskcreate();(在task.c內)
③開始任務函式vtaskcode()的建立與實現(名字可修改,一般寫為start_task(),在task.h官方已給出模板)
④宣告、定義、建立開始函式引數
⑤同樣在開始函式內建立其他任務函式
⑥宣告、定義、編寫任務函式
步驟
①freertosconfig.h中,巨集configsupport_static_allocation 定義為 1,沒有就新增
②編寫空閒任務所需記憶體函式和定時器所需記憶體函式
③呼叫靜態建立任務函式xtaskcreatestatic();(在task.c內)
③開始任務函式vtaskcode()的建立與實現(名字可修改,一般寫為start_task(),在task.h官方已給出 模板)
④宣告、定義、建立開始函式引數
⑤同樣在開始函式內建立其他任務函式
⑥宣告、定義、編寫任務函式
注意:在我們的一般使用中,最常用的方法是使用動態建立任務函式
此函式用於將某個任務設定為掛起態, 進入掛起態的任務永遠都不會進入執行態。退出掛起態的唯一方法就是呼叫任務恢復函式 vtaskresume()或 xtaskresumefromisr()。函式原型如下:
//xtasktosuspend引數是任務控制代碼,可以通過函式 xtaskgethandle()來根據任務名字來獲取某個任務的任務控制代碼。
//注意! 如果引數為 null 的話表示掛起任務自己。
void vtasksuspend( taskhandle_t xtasktosuspend)
將乙個任務從掛起態恢復到就緒態, 只有通過函式 vtasksuspend()設定為掛起態的任務才可以使用 vtaskrexume()恢復!函式原型如下:
//xtasktoresume: 任務控制代碼。
void vtaskresume( taskhandle_t xtasktoresume)
此函式是 vtaskresume()的中斷版本,用於在中斷服務函式中恢復乙個任務。函式原型如下:
//xtasktoresume任務控制代碼
//返回值:
// pdtrue: 恢復執行的任務的任務優先順序等於或者高於正在執行的任務(被中斷打斷的任務), 這意味著在退出中斷服務函式以後必須進行一次任務切換(就是執行一次該任務排程)。
// pdfalse: 恢復執行的任務的任務優先順序低於當前正在執行的任務(被中斷打斷的任務),這意味著在退出中斷服務函式的以後不需要進行任務切換
basetype_t xtaskresumefromisr( taskhandle_t xtasktoresume)
FreeRTOS任務相關API函式一
basetype t xtaskcreate taskfunction t pxtaskcode,任務實現函式指標 函式名 const char const pcname,任務名稱,用於追蹤除錯,名字長度不超過configmax name len const uint16 t usstackdept...
FreeRTOS的多工處理
1.freertos 多任務排程支援 時間片段,搶占式 和 和做式 任務侁先級可以在排程器啟動後呼叫 vtaskpriorityset api 函式進行修改 任意數量的任務可以共享同乙個優先順序 以保證最大設計彈性。當然,如果需要的話,你也可以為每個任務指定唯一的優先順序 就如同某些排程演算法的要求...
FreeRTOS學習(五) 任務相關API函式
宣告及感謝 跟隨正點原子資料學習,在此作為學習的記錄和總結 環境 keil stm32f103 api函式預覽 1.ubasetype t uxtaskpriorityget taskhandle t xtask 獲取某個任務的優先順序 引數 xtask 傳入任務控制代碼 unsigned port...