MCU小型調度OS之三:任務調度機制

一、結構體類型:

        圖1

          圖2

        如上圖1,task_list是任務節點的結構體,具體參數如下:

        1、task_id是任務ID,一般對某個任務操作時用來區分具體哪個任務;

        2、stat是任務的當前狀態,狀態類型如圖2,三種狀態依次爲掛起休眠,就緒運行,超時;

        3、pointer是當前運行指針,一般當做狀態機來用,區分當前運行到具體哪個位置;

        4、task_timer是任務定時器,上個篇章說過,每個任務都會掛在一個定時器的節點,該定時器的主要功能就是爲了處理當前任務的信號量超時、隊列超時、定時喚醒能業務功能;

        5、function是任務回調函數,一般當前任務狀態就緒時,會調用;

        6、p_arg是運行任務回調函數時傳入的參數;

        7、next是任務鏈表裏的下一個任務節點。

二、初始化

         圖3

          圖4

         如上圖3,每個任務創建的時候,做以下動作:

         1、該任務的stat賦值就緒運行狀態,創建好之後就會進入任務回調函數;

         2、每個任務創建時候,會創建相應關聯的定時器,該定時器ID改成任務ID+0xff00,跟硬定時器ID錯開;

         3、該任務關聯的定時器初始化時,超時函數都是同一個,TaskOverTimerCallback,該數據傳入的參數是初始化時綁定的任務結構體(後面會有介紹),定時器超時時把所綁定任務結構體狀態改成OS_STAT_TIMEOUT,這個主要作用就是爲了實現後面的每個任務信號量超時、隊列超時、定時喚醒能業務功能。

三、任務調度

         圖5

         如上圖5,主程序裏面遍歷任務節點鏈表,如果當前任務節點的stat不是OS_STAT_SUSPEND(可能是OS_STAT_RDY或者OS_STAT_TIMEOUT)都運行該任務函數,然後遍歷下一個任務節點。

         圖6

         如上圖6,遍歷每個任務節點鏈表,判斷當前stat,如果非suspend就運行,在其他地方可以通過任務ID對任何一個任務的狀態進行修改,假設信號量或者休眠定時喚醒某一個任務時,比如圖4,把該ID的任務狀態改成OS_STAT_SUSPEND,並開啓定時器,如果這段時間沒有其他打斷,在超時函數裏對該任務stat進行修改,修改爲超時,下一次輪詢任務stat時就會運行。如果在超時期間,有其他工作打斷,比如信號量或者突然喚醒等,會停止該定時器。如下圖7:

         圖7

         這樣我們就可以任意掛起與喚醒任意任務,並且有超時阻塞的功能。至於具體的信號量與隊列的使用和原理,下面會進行詳解。

        調度系統下載鏈接如下: https://download.csdn.net/download/moonlinux20704/12073629

        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章