嵌入式模擬時間片輪詢調度演算法

模擬時間片輪轉調度演算法-vtor3478

 

【01】傳統while做法

在一般的裸機程式中,一般是while(1)作為main中最後的一段語句

如下圖中,就是while(1)內一直運行taskHandle以處理邏輯事務

 

在這時,如果希望加上一個led作為指示燈,說明程式正在運行,

修改成如下所示,led1每隔500毫秒變化一次狀態,問題隨之而來,

taskHandle的響應時間最大為1000ms,不利已處理實時性很高的事務。

  

再進一步優化,使用dWhileCntwhile進行計數,且taskHandle實時性大大提高,最大只有1毫秒的響應時間,

好像解決了問題,但如果還有led2需要間隔2秒變化一次呢,

如果還有串口要求1分鐘列印一條消息呢,很明顯,這個框架就不適用了

 

 

【02】模擬時間片輪詢法

【0201】時間片結構體

 

其參數依次為,當前模擬時間片(以下簡稱時間片)的回調函數

當前時間片的運行間隔

當前時間片的時間,如果大於等於時間間隔,那麼即將啟動本時間片

當前時間片回調函數是否該運行

當前時間片回調函數的運行次數

【0202】時間片任務示範

 

 

此處共有6個時間片,其中TaskBask是時間片基,用於調度其他時間片,在下文會有講解。

【0203】時間片基

在此模擬時間片輪詢法中,需要一個穩定的定時器,在本方案中使用tim2產生1毫秒中斷,並進入時間片基函數TaskBase以調度其他時間片

 

 

如圖所示,在定時器回調函數HAL_TIM_PeriodElapsedCallback內,執行了TaskBase時間基,

TaskBase時間基內,對其他時間片的curTime進行累加,如果curTime大於interval

說明該任務需要納入到運行任務的隊列內,同時將curTime清零,再將runFlag1

【0204】運行時間片

 

如圖所示,在main函數的while(1)內,需要對其他時間片進行輪詢判斷

如果其runFlag1,說明將要執行此任務,

先將runFlag清零,防止重複執行此任務

再將runCnt次數加1,可以用於以後統計任務次數

最後是執行handle函數,handle函數如下,分別執行了不同占空比的pwm輸出,實現了led間隔1000毫秒翻轉狀態,實現了oled顯示部分資訊。

 

 

 

【03】總結

經過驗證,此方案能很好地在裸機上實現時間片功能,能非常方便地添加時間片,

且能基本保證各個時間片的運行次數,能基本均勻調度各個任務,且都達到實時性要求。

以上是《模擬時間片輪詢調度演算法》,2022915日星期四,全文完。

 

Tags: