新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于VxWorks操作系統的通用定時器設計

        基于VxWorks操作系統的通用定時器設計

        作者: 時間:2014-05-13 來源:網絡 收藏

        摘要 操作系統以其強實時性、可剪裁性等特點得到了廣泛應用,但其并未提供通用的模塊。為解決某機載發射裝置控制盒中系統的精確定時問題,文中在分析多種定時方式的基礎上,利用輔助時鐘中斷,通過創建定時節點,構造節點鏈表,設計了基于輔助時鐘的通用模塊。經測試表明,該模塊實現了毫秒級定時,滿足了某發射裝置的定時需求,并為今后類似系統的精確定時需求提供了方便。

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

        當前,無人機技術發展迅猛。為滿足我國察打一體無人機的裝備需求,基于現有小型制導武器和無人機平臺進行集成,填補該領域空白。在某型空地制導武器和某型無人機的集成中,由于二者具有不同的數字通訊方式和電氣接口等,需在機載發射裝置中加裝控制盒,以滿足飛機與武器的交聯需求。該控制盒采用操作系統設計軟件,具有實時性強、穩定性高等特點。

        VxWorks操作系統自1987年由美國風河公司成功推出以來,已被廣泛應用于通信、軍事、航空、航天等高精尖及實時性要求較高領域。

        1 VxWorks幾種常用的定時方式

        在實時性要求高的應用系統中,經常會被用到。VxWorks提供了多樣的定時器接口函數,但沒有通用定時器。在VxWorks提供的定時器接口函數中,taskDelay()、WatchDog和sleep/nanosleep都以tick為基準,定時誤差較大,無法滿足高精度的定時要求,若把系統cloc krate(默認為60)提高,系統會被頻繁的時鐘中斷打斷,效率降低。另外,時間戳sysTimeStamp()雖可實現高精度定時,但該定時方式較占用系統資源,只適合短時間定時。

        輔助時鐘是利用目標板CPU內除系統時鐘外的另一個定時器中斷實現,VxWorks提供了一系列與系統時鐘相同的操作接口,可以通過掛接用戶自己中斷服務程序的方式實現精確延時,當輔助時鐘的定時周期到時,即觸發中斷服務程序。本文針對多任務長時間工作的高精度定時需求提出了基于輔助時鐘的通用定時器機制。

        2 基于輔助時鐘的定時機制設計

        2.1 輔助時鐘的使用

        在VxWorks下要利用輔助時鐘,首先要對輔助時鐘的使用進行配置,以確保輔助時鐘可以被正常使用,然后分別調sysAuxClkConnect()函數將中斷服務程序與輔助時鐘中斷掛接、sysAuxClkRate()函數設置輔助時鐘中斷周期、sysAuxClkEnable()/sysAuxClkDisable()函數允許和禁止輔助時鐘。

        通過對輔助時鐘的使用方式進行研究發現,如果能在與輔助時鐘中斷掛接的中斷服務程序中對定時節點的剩余時間進行更新,當節點剩余時間變為0則說明該節點定時時間到,此時進行相應的操作,從而達到精確定時的目的。可通過同步信號量來調用定時節點處理任務來處理已經定時到的節點。以下是輔助時鐘使用的基本原理

         

         

        由此可看出,通過中斷服務程序,將輔助時鐘與定時任務聯系起來,為精確定時提供了可能。

        2.2 定時節點鏈表的創建

        根據上述特點,可將所有的定時任務通過一個定時任務鏈表與基于輔助時鐘設置的定時器關聯起來,每當程序應用層添加一個定時任務,就往該定時任務鏈表添加一個定時任務節點。通常的添加方法是,插入時從鏈表頭節點開始遍歷,根據各個節點的剩余時間來確定插入位置,即將所要插入的定時任務節點按照相對其前一節點剩余時間的差由小到大排列。這樣,當輔助時鐘中斷到來時只需對定時任務鏈表中的第一個節點剩余時間進行修改即可,而不必對整個鏈表進行遍歷,從而減小了對實時性的影響。

        假設系統中存在A、B、C三個定時任務,分別提交了定時周期為20 ms、40 ms和25 ms的定時任務,任務間提交的時間間隔為2 ms,則定時任務鏈表節點的插入和排列情況如圖1所示。其中,第一步插入后,鏈表中為A任務的20 ms定時節點;第二步插入為第一步操作2 ms后,此時鏈表中A節點的剩余時間變為18 ms,而新插入B任務的定時周期為4 0ms,大于A節點剩余時間,故插入鏈表后B任務剩余時間變為22 ms;同理,2 ms后第三步新插入C任務的25 ms定時節點剩余時間變為9 ms,B任務剩余時間變為13 ms。

         

         

        2.3 定時器實現

        定時任務鏈表中的每個節點都對應一個定時任務,其結構如下

         

         

        通用定時器的實現主要提供了以下4個函數接口供應用層使用,以及一個系統中斷程序和一個自動加載并啟動的任務。

        未找到引用源。定時模塊初始化函數ComTimerInit(int precision)定時模塊初始化函數主要用來初始化定時節點鏈表、創建信號量、設置輔助時鐘、創建定時中斷處理任務,其中參數precision為定時器的分辨率,最小為1 ms。

        定時節點添加函數int TimerIncrease(int val,void*pFunc,void*arg,SEM_ID sem)主要用于設置定時器。該函數首先從定時節點鏈表中獲取一個空閑節點,然后根據要添加的定時節點參數初始化該節點,最后將該節點重新添加到鏈表中。其中,函數參數val為所要定時的時間,pFunc為定時到之后要執行的函數,arg為pFunc的參數,sem為定時時間到后要釋放的信號量,函數返回值為定時節點的ID號。需要注意的是,當節點鏈表不為空時要開啟輔助時鐘。

        定時節點刪除函數TimerCanele(int ID)主要用于取消一個激活的定時節點,該函數的傳輸參數為要取消的定時節點ID。

        定時模塊銷毀函數ComTimerDes()主要用于從系統中銷毀定時模塊,包括刪除信號量、釋放鏈表內存。

        輔助時鐘中斷服務程序AuxClkSvr()是實現精確定時的基礎,其通過函數sysAuxClkConnect()連接到輔助時鐘中斷上。為保證定時精確性,應使此中斷程序最短執行。為此建立有序的定時節點鏈表,每次中斷時只需從鏈表節點首開始遍歷找到第一個未休眠的節點,然后將該節點的timeLeft減1,若此時timeLeft為0,則釋放中斷處理任務的同步信號量;另外,為使得輔助時鐘的中斷次數最小,可將輔助時鐘的分辨率precision設為所需定時任務定時時間的最大公約數,從而函數TimerIncrease()的參數val為所需定時時間與precision的倍數。此函數的執行過程如圖2。


        上一頁 1 2 下一頁

        關鍵詞: VxWorks 定時器

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 汉源县| 华坪县| 多伦县| 无棣县| 莲花县| 梅河口市| 凤翔县| 兴化市| 剑河县| 微山县| 醴陵市| 武鸣县| 五大连池市| 渝中区| 博湖县| 桦南县| 曲周县| 镇江市| 宣化县| 读书| 朝阳区| 花莲县| 松桃| 麻江县| 宜良县| 云安县| 永济市| 克拉玛依市| 仪陇县| 古田县| 东乡| 鹤壁市| 双柏县| 临湘市| 咸阳市| 郴州市| 昌都县| 二手房| 西丰县| 福州市| 义马市|