FreeRTOS 支援時間片

2021-10-02 22:41:16 字數 2254 閱讀 5417

所謂時間片就是同乙個優先順序任務下可以有多個任務,每個任務輪流的享有相同的cpu時間,享有cpu的時間我們叫做時間片。在rtos中,最小的時間單位是乙個tick,即 systick 的中斷週期。對於freertos,時間片只能是乙個tick。與其說freertos支援時間片,倒不如說他的時間片就是正常的任務排程。

之 所 以 在 同 一 個 優 先 級 下 可 以 有 多 個 任 務 , 最 終 還 是 得 益 於taskreset_ready_priority()和taskselect_highest_priority_task()這兩個函函式的實現方法。接下來我們分析下這兩個函式是如何在同乙個優先順序下有多個任務的時候起作用的。

系統在任務切換的時候總會從就緒列表中尋找優先順序最高的任務來執行,尋找優先順序最高的任務這個功能由taskselect_highest_priority_task()函式來實現,該函式在task.c 中定義。

taskselect_highest_priority_task()函式

#define taskselect_highest_priority_task()\

(1) : 尋 找 就 緒 任 務 的 最 高 優 先 級 。 即 根 據 優 先 級 位 圖 表

uxtopreadypriority 找到就緒任務的最高優先順序,然後將優先順序暫存在 uxtoppriority。

(2): 獲取優先順序最高的就緒任務的 tcb,然後更新到 pxcurrenttcb。

目前我們的實驗是在優先順序 2 上有任務 1 和任務 2,假設任務 1 執行了乙個 tick,那接下來再從對應優先順序 2 的就緒列表上選擇任務來執行就應該是選擇任務 2?怎麼選擇,**上怎麼實現?奧妙就在 listget_owner_of_next_entry()函式中,該函式在 list.h 中定義。

listget_owner_of_next_entry()函式

#define listget_owner_of_next_entry( pxtcb, pxlist )\

\ /* 獲取節點的 owner,即 tcb */\

( pxtcb )

=( pxconstlist )

->pxindex->pvowner;\

}

listget_owner_of_next_entry()函式的妙處在於它並不是獲取鍊錶下的第乙個節點的 owner,而是用於獲取下乙個節點的 owner。有下乙個那麼就會有上乙個的說法,怎麼理解?假設當前鍊錶有 n 個節點,當第 n 次呼叫該函式時, pxindex 則指向第 n個節點, 即每呼叫一次, 節點遍歷指標 pxindex 則會向後移動一次,用於指向下乙個節點。

本實驗中,優先順序 2 下有兩個任務,當系統第一次切換到優先順序為 2 的任務(包含了任務 1 和任務 2,因為它們的優先順序相同) 時, pxindex 指向任務 1, 任務 1 得到執行。 當任務 1 執行完畢,系統重新切換到優先順序為 2 的任務時, 這個時候 pxindex 指向任務 2,任務 2 得到執行, 任務 1 和任務 2 輪流執行,享有相同的 cpu 時間, 即所謂的時間片。

本實驗中,任務 1 和任務 2 的主體都是無限迴圈,那如果任務 1 和任務 2 都會呼叫將自己掛起的函式(實際運用中,任務體都不能是無限迴圈的,必須呼叫能將自己掛起的函式) ,比如 vtaskdelay()。 呼叫能將任務掛起的函式中,都會先將任務從就緒列表刪除,然 後 將 任 務 在 優 先 級 位 圖 表 uxtopreadypriority 中 對 應 的 位 清 零 , 這 一 功 能 由taskreset_ready_priority()函式來實現, 該函式在 task.c 中定義。

taskreset_ready_priority()函式

#define taskreset_ready_priority( uxpriority )\

\ }

taskreset_ready_priority() 函 數 的 妙 處 在 於 清 除 優 先 級 位 圖 表uxtopreadypriority 中相應的位時候,會先判斷當前優先順序鍊錶下是否還有其它任務,如果有則不清零。 假設當前實驗中,任務 1 會呼叫 vtaskdelay(),會將自己掛起,只能是將任務 1 從就緒列表刪除,不能將任務 1 在優先順序位圖表 uxtopreadypriority 中對應的位清 0,因為該優先順序下還有任務 2,否則任務 2 將得不到執行。

參考:[野火®]《freertos 核心實現與應用開發實戰—基於stm32》

時間片輪詢

2002年初,筆者著手寫乙個 ic卡預付費電表的工作程式,該電表使用 philips 公司的8位51 擴充套件型微控制器 87lpc764 要求實現很多功能,包括熄顯示 負荷計算與控制 指示閃爍以及電表各種引數的查詢等,總之,要使用時間的單元很多。筆者當時使用 asm51 完成了這個程式的編寫,完成...

時間片輪轉

時間片輪轉排程演算法,這種演算法是將程序控制塊按照進入就緒佇列的先後次序排成佇列。關於就緒佇列的操作就是從隊頭摘下乙個程序控制塊和從隊尾掛入乙個程序控制塊。單處理器系統中程序控制塊分成乙個正在執行程序的程序控制塊 就緒程序的程序控制塊組織成的就緒佇列和等待程序的程序控制塊組成的等待佇列。由於實驗模擬...

時間片輪轉法

時間片輪轉法 round robin,rr 主要用於分時系統中的程序排程。為了實現輪轉排程,系統把所有就緒程序按先入先出的原則排成乙個佇列。新來的程序加到就緒佇列末尾。每當執行程序排程時,程序排程程式總是選出就緒佇列的隊首程序,讓它在 cpu上執行乙個時間片的時間。時間片是乙個小的時間單位,通常為 ...