關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 設計應用 > μC/OSII中軟件定時器的優缺點與改進

        μC/OSII中軟件定時器的優缺點與改進

        作者: 時間:2011-04-18 來源:網絡 收藏

        μ具有小巧、性能穩定、開源等眾多優點,并且μ大部分用ANSI C語言編寫,系統的移植非常容易。在μ I2.81及以后的版本中[2],加入了對的支持,使得μC/OSII操作系統更加完善。

        本文引用地址:http://www.104case.com/article/162162.htm

          μC/OSII是一種基于優先級的搶占式操作系統,實時性很強。而系統中沒有優先級,回調函數順序執行,這樣就降低了系統的實時性。因此,本文對進行,定時器中加入優先級,回調函數按優先級執行,從而提高系統的實時性。

          1 對軟件定時器的介紹

          μC/OSII系統中的時間管理功能包括任務延時與軟件定時器,而軟件定時器的主要作用是,對函數周期性或者一次性執行的定時,利用軟件定時器控制塊與“定時器輪”管理軟件定時器。定時器控制塊的結構如同任務控制塊,創建一個定時器時,從空閑定時器控制塊鏈表中得到一個空閑控制塊,并對其賦值。

          軟件定時器也需要一個時鐘節拍驅動,而這個驅動一般是硬件實現的,一般使用μC/OSII操作系統中任務延時的時鐘節拍來驅動軟件定時器。每個時鐘節拍OSTmrCtr(全局變量,初始值為0)增1, 當OSTmrCtr的值等于為OS_TICKS_PER_SEC /OS_TMR_CFG_TICKS_PER_SEC(此兩者的商決定軟件定時器的頻率)時,調用函數OSTmrSignal(),此函數發送信號量OSTmrSemSignal(初始值為0,決定軟件定時器掃描任務OSTmr_Task的運行)。也就是說,對定時器的處理不在時鐘節拍中斷函數中進行,而是以發生信號量的方式激活任務OSTmr_Task(具有很高的優先級)。任務OSTmr_Task對定時器進行檢測處理,包括定時器定時完成的判斷、回調函數的執行。

          μC/OSII 2.86中與軟件定時器相關的函數包括:

          ① 軟件定時器內部靜態函數。獲取與釋放定時器控制塊函數OSTmr_Alloc()、OSTmr_Free();定時器插入相應“時間輪”組函數OSTmr_Link();從相應“時間輪”組中刪除定時器函數OSTmr_Unlink();軟件定時器任務初始化函數OSTmr_InitTask();定時器掃描任務OSTmr_Task;定時器上鎖與解鎖函數OSTmr_Lock()與OSTmr_Unlock()(在μC/OSII 2.91中,此兩函數被任務調度鎖定與解鎖函數代替)。

          ② 定時器外部接口函數。定時器創建與刪除函數OSTmrCreate()、OSTmrDel();定時器啟動與停止函數OSTmrStart()、OSTmrStop();定時器剩余時間與當前狀態查詢函數OSTmrRemainGet()、OSTmrStateGet();軟件定時器的初始化OSTmr_Init();發送信號量OSTmrSemSignal函數OSTmrSignal();定時器名稱查詢函數OSTmrNameGet()。

          由于軟件定時器的回調函數的執行都是在任務OSTmr_Task中執行,如果多個定時器同時定時完成,則在定時器任務中執行多個定時器的回調函數,因此定時器任務的執行時間不確定。而且定時器回調函數是順序執行的,如果某個定時器回調函數需要盡快執行以實現精確定時,就難以實現了。由于各個定時器沒有優先級,因此了影響系統的實時性。

          2 對軟件定時器的

          為提高軟件定時器回調函數執行的實時性,給每個定時器賦予一個優先級。當定時完成時,并且定時器的回調函數不為空,則把定時器的優先級寫于軟件定時器就緒表中。任務OSTmr_Task對相應“時間輪”檢查結束后,如果在掃描各個定時器前軟件定時器就緒表為零而掃描之后不為零,則發送信號量激活回調函數任務OSTmr_TaskCallback。在此任務中,回調函數根據軟件定時器就緒表中的優先級執行相應的回調函數,這樣就提高了系統的實時性。

          2.1 對軟件定時器相關數據結構

          ① 定義結構體OS_TMR_CALL,存儲定時器的回調函數、函數的參數、定時器指針,形式如下:

          typedefstructos_tmr_call {

          OS_TMR_CALLBACKOSTmrCallback; /*回調函數*/

          void *OSTmrCallbackArg;/*回調函數指針*/

          OS_TMR *OSTmr; /*定時器指針*/

          } OS_TMR_CALL;

          在頭文件ucos_ii.h中,定義OSTmrCallbackTbl[OS_TMR_CFG_MAX],OS_TMR_CFG_MAX表示系統中配置的軟件定時器數量。

          ② 在軟件定時器控制塊中加入成員變量OSTmrPrio(定時器優先級),刪去變量OSTmrCallback(回調函數)、OSTmrCallbackArg(回調函數參數),為了測試的方便,可暫不刪除這兩個變量。

          ③ 定義定時器就緒表:

          INT8UOSTmrRdyGrp;

          INT8UOSTmrRdyTbl[OS_TMR_CFG_MAX/8 + 1];

          當定時器定時完成時,把定時器優先級寫入就緒表,回調函數任務根據優先級執行回調函數。

          ④ 定義信號量OSTmrSemCallback(初始值0 ),當定時完成后,發送此信號量,激活回調函數任務,以執行回調函數。


        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 彰武县| 图们市| 郑州市| 塔城市| 康乐县| 长寿区| 农安县| 黄陵县| 湖口县| 邛崃市| 昌吉市| 卢龙县| 平湖市| 老河口市| 宣威市| 湾仔区| 黄龙县| 合水县| 博湖县| 弥勒县| 普兰县| 澄江县| 邓州市| 郓城县| 呼伦贝尔市| 成安县| 盐津县| 宣恩县| 东光县| 略阳县| 德格县| 平和县| 银川市| 东海县| 家居| 龙州县| 马公市| 象山县| 都昌县| 金堂县| 拜城县|