FreeRTOS 優先順序繼承機制 學習筆記

2021-09-11 07:02:54 字數 1699 閱讀 1442

僅為個人理解,個人筆記

xtaskpriorityinherit和xtaskprioritydisinherit

例:若任務a的優先順序大於任務b(假設任務a優先順序為2,任務b優先順序為1),但是同一互斥量被任務b先獲取,在任務b獲取該互斥量後執行的過程中任務a恢復執行搶占任務b,且任務a嘗試獲取該互斥量並且設定了最長等待時間,在任務a因獲取不到該互斥量而進入阻塞之前會先判斷任務b是否應該繼承任務a的優先順序

basetype_t xtaskpriorityinherit(taskhandle_t const pxmutexholder)

else

// 若已經獲取該互斥量的任務是被嘗試獲取該互斥量的任務搶占執行,在例中任務b還在就緒列表中

if (listis_contained_within(&(pxreadytaskslists[pxmutexholdertcb->uxpriority]), &(pxmutexholdertcb->xstatelistitem)) != pdfalse)

// 不適用優化的硬體排程方法

else

// 將任務b的優先順序設定為任務a的優先順序,並且將任務b的tcb的狀態列表項掛載到相應優先順序的就緒列表上

pxmutexholdertcb->uxpriority = pxcurrenttcb->uxpriority;

prvaddtasktoreadylist(pxmutexholdertcb);

}// 如果已經獲取該互斥量的任務不是被嘗試獲取該互斥量的任務搶占執行,在該例中不為這樣的情況

else

// 除錯資訊

tracetask_priority_inherit(pxmutexholdertcb, pxcurrenttcb->uxpriority);

// 任務b已經繼承了任務a的優先順序,記錄函式的返回值

xreturn = pdtrue;

}else

else}}

else

return xreturn;

}

在已獲取互斥量的任務釋放互斥量時會用到,該函式主要判斷釋放互斥量的任務是否繼承了優先順序以及是否取消優先順序繼承

basetype_t xtaskprioritydisinherit(taskhandle_t const pxmutexholder)

else

// 除錯資訊

tracetask_priority_disinherit(pxtcb, pxtcb->uxbasepriority);

// 恢復該任務的基礎優先順序

pxtcb->uxpriority = pxtcb->uxbasepriority;

// 重置該任務tcb的事件列表項

listset_list_item_value(&(pxtcb->xeventlistitem), (ticktype_t)configmax_priorities - (ticktype_t)pxtcb->uxpriority);

// 將該任務tcb的狀態列表項掛載到基礎優先順序對應的就緒列表上

prvaddtasktoreadylist(pxtcb);

// 記錄返回值

xreturn = pdtrue;

}else

}else

}else

return xreturn;

}

FreeRTOS優先順序翻轉

舉例 高優先順序任務的任務函式 void high task void pvparameters 中等優先順序任務的任務函式 void middle task void pvparameters 低優先順序任務的任務函式 void low task void pvparameters xsemaph...

FreeRTOS 任務優先順序說明

freertos任務優先順序與unix程序優先順序不同 freertos 任務優先 任務優先順序數值越小,任務優先順序越低。unix 任務優先 程序優先順序數值越小,程序優先順序越高。下面對 freertos 優先順序相關的幾個重要知識點進行下說明,這些知識點在以後的使用中務必要掌握牢固。freer...

FreeRTOS優先順序配置說明

1 中斷優先順序和任務優先順序沒有任何關係,中斷的優先順序高於任何任務的優先順序,即任務在執行的過程中,中斷來了就開始執行中斷服務程式。2 中斷優先順序數值越小,優先順序就越高。freertos的任務優先順序是,任務優先順序數值越小,優先順序越低。1 nvic的全稱是nested vectoredi...