MCU小型調度OS之二:定時器

一、結構體類型:

       

       如上圖所示,timer_list就是定時器的結構體,其中timer_id是定時器ID;enable是該定時器是否啓動;expires是定時時間長度,function是定時器超時函數,p_arg是定時器傳參數;next是下一個定時器節點。

二、硬定時器:

       定時器分爲硬定時器和軟定時器,區別爲:

       1、硬定時器超時直接執行,無需等待,超時函數內不能阻塞,一般都只是修改狀態變量等;

       2、軟定時器在主任務創建一個隊列,定時器超時後寫入隊列,隊列分別執行定時器超時處理函數; 

       初始化:

       

      初始化硬定時器,建立一個鏈表,鏈表頭是TimerHead,初始化完一系列硬定時器後,開啓1ms一次ticket定時中斷的定時器,在超時中斷裏進行定時器調度。     

       定時器使用:

       

       如上圖,開啓定時器,停止定時器,都是根據TimerId來確認對哪個定時器節點操作,enable代表停止和關閉,expires就是定時週期時間。

       定時調度:

       

       如上圖,在1ms一次定時中斷處理函數裏,對提前註冊好的定時器節點依次訪問,如果使能過後,對時間expires--,如果到時間的話執行中斷處理函數。

       

二、軟定時器:

      軟定時器跟硬定時器不同的地方在於:在主任務創建一個隊列,定時器超時後寫入隊列,隊列分別執行定時器超時處理函數。

      優點是即使阻塞也不會佔用中斷,造成大規模影響,缺點是相應不夠實時。

      初始化:

      

      如上圖,App_Timer_Create初始化軟定時器,所有的軟定時器都是依賴於硬定時器來操作,軟定時器的硬定時超時函數都是同一個,SoftTimerCallBack,該超時函數裏就一個操作,把pTimer參數以隊列的形式傳送到timer_sched_Queue裏面,該隊列在開始的時候也初始化了(隊列的實現以及具體細節下面章節會詳解解釋),具體實現如下:

      

      

      上面說的在定時中斷裏面向隊列寫入pTimer參數,該參數是個結構體,裏面有兩個內容,一個函數handler,一個參數data,從而實現軟定時的功能,通常系統內部定時任務以及實時性高、處理短的定時器用硬定時,普通業務都用軟定時。

      

二、任務定時器:

       

       在初始化任務的時候,每個任務下面都會掛個定時器的節點,其實這個定時器做的主要功能就是爲了處理每個任務的信號量超時、隊列超時、定時喚醒能業務功能,因爲系統調用實時性要求高,因此使用硬定時器,下面章節會詳解分析。

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

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