嵌入式模擬時間片輪詢排程演演算法

2022-09-15 15:00:11

模擬時間片輪轉排程演演算法-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日星期四,全文完。