1處理時間被劃分多個片段,到達一定時間就會觸發系統滴答定時器(systick)中斷進行上下文切換,但由於systick中斷是最高端的,會使其他事件中斷延時。故每到systick中斷是讓pendsv中斷掛起,由於pendsv優先順序最低,只有所有中斷都執行完畢了才會執行pendsv中斷,在此進行任務切換。
2區系統滴答定時器(systick)中斷與執行系統呼叫的兩種任務切換途徑,相同點是,本質最終都是使向中斷控制和狀態暫存器的bit28置1掛起pendsv中斷。區別在於前者是在系統滴答定時器中斷進行操作,後者在一些函式呼叫中進行操作。
3查詢下乙個需要執行的任務:設定相關巨集選用不同方法①通用方法。查任務就緒列表陣列,乙個優先順序乙個列表,找到非空的列表就能羅列出所有就緒任務及其優先順序,然後尋找最高的優先順序任務執行切換。②硬體方法。把所有優先順序任務以存在置1不存在置0記錄在乙個32位的暫存器中。兩種方法的區別明顯,前者不限制優先順序數目,適用於大多數情況但每次都需要呼叫函式去更新任務就緒情況;後者把就緒任務排列在暫存器中每次都能直接快速的找到需要執行的最高優先順序任務。但限制32個優先級數。
找到最高優先順序任務的列表後,再呼叫相關函式獲取下個列表項,把該任務的任務控制塊賦值給pxcurrenttcb即可切換任務。
4時間片排程:系統執行時間被系統滴答定時器劃分未n個時間片,時間片時間段固定,對於相同優先順序的多個任務每乙個時間片結束必定任務切換下個就緒任務無論正在執行的任務有木有執行完,等時間片用完再切換下乙個,一直輪迴。若時間片沒用完任務結束了,那強制任務切換,剩下的時間片由下乙個就緒任務繼續使用。此輪迴直到該優先順序的所有任務完成才結束,或被系統打斷。
另外由於時間片週期是系統滴答定時器中斷週期,一般情況下該中斷會強制任務切換(切換到下乙個優先順序),所以要用時間片排程的話需要置相關巨集為1,使滴答定時器中斷任務排程有條件,而不是必須任務排程。
5任務輔助api函式:如查詢任務狀態查詢任務名字等等的輔助api函式,因為一般都是在除錯時使用,所以用到時一般要修改相關巨集為1(大部分預設情況下是0)。而且大多數情況查詢的資訊都存放在乙個陣列裡,所以要定義並建立陣列記憶體。
FreeRTOS任務切換
任務切換一共兩種方式 系統節拍器中斷 呼叫portyield。但是,最終都是產生pendsv中斷。systick異常處理入口 void xportsystickhandler void 開啟中斷 vportclearbaseprifromisr 請求排程 define portyield 系統節拍器...
freertos學習之任務排程切換
freertos 的任務具有如下幾種狀態 執行running 就緒ready 阻塞blocked 掛起suspended 除了執行狀態之外的狀態統稱為非執行狀態。因為 freertos 是為單cpu設計的系統,在任何時刻最多只能允許乙個任務處在執行狀態,哪怕看起來好像有多個任務同時在執行 這只是多個...
FreeRTOS 任務不切換可能的問題
1 時間片排程沒有開啟 freertos.h 檔案中巨集定義 configuse time slicing 沒有定義為1 解決方案 ifndef configuse time slicing define configuse time slicing 1 endif2 中斷函式中定義了,svc ha...