模擬時間片輪轉排程演演算法-vtor3478
【01】傳統while做法
在一般的裸機程式中,一般是while(1)作為main中最後的一段語句
如下圖中,就是while(1)內一直執行taskHandle以處理邏輯事務
在這時,如果希望加上一個led作為指示燈,說明程式正在執行,
修改成如下所示,led1每隔500毫秒變化一次狀態,問題隨之而來,
taskHandle的響應時間最大為1000ms,不利已處理實時性很高的事務。
再進一步優化,使用dWhileCnt對while進行計數,且taskHandle實時性大大提高,最大隻有1毫秒的響應時間,
好像解決了問題,但如果還有led2需要間隔2秒變化一次呢,
如果還有串列埠要求1分鐘列印一條訊息呢,很明顯,這個框架就不適用了
【02】模擬時間片輪詢法
【0201】時間片結構體
其引數依次為,當前模擬時間片(以下簡稱時間片)的回撥函數
當前時間片的執行間隔
當前時間片的時間,如果大於等於時間間隔,那麼即將啟動本時間片
當前時間片回撥函數是否該執行
當前時間片回撥函數的執行次數
【0202】時間片任務示範
此處共有6個時間片,其中TaskBask是時間片基,用於排程其他時間片,在下文會有講解。
【0203】時間片基
在此模擬時間片輪詢法中,需要一個穩定的定時器,在本方案中使用tim2產生1毫秒中斷,並進入時間片基函數TaskBase以排程其他時間片
如圖所示,在定時器回撥函數HAL_TIM_PeriodElapsedCallback內,執行了TaskBase時間基,
在TaskBase時間基內,對其他時間片的curTime進行累加,如果curTime大於interval時
說明該任務需要納入到執行任務的佇列內,同時將curTime清零,再將runFlag置1
【0204】執行時間片
如圖所示,在main函數的while(1)內,需要對其他時間片進行輪詢判斷
如果其runFlag為1,說明將要執行此任務,
先將runFlag清零,防止重複執行此任務
再將runCnt次數加1,可以用於以後統計任務次數
最後是執行handle函數,handle函數如下,分別執行了不同佔空比的pwm輸出,實現了led間隔1000毫秒翻轉狀態,實現了oled顯示部分資訊。
【03】總結
經過驗證,此方案能很好地在裸機上實現時間片功能,能非常方便地新增時間片,
且能基本保證各個時間片的執行次數,能基本均勻排程各個任務,且都達到實時性要求。
以上是《模擬時間片輪詢排程演演算法》,2022年9月15日星期四,全文完。