<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > VxWorks共享看門(mén)狗定時(shí)機制的設計與實(shí)現

VxWorks共享看門(mén)狗定時(shí)機制的設計與實(shí)現

作者: 時(shí)間:2012-12-13 來(lái)源:網(wǎng)絡(luò ) 收藏

0 引言

本文引用地址:http://dyxdggzs.com/article/148192.htm

是目前應用最多的嵌入式實(shí)時(shí)操作系統之一,廣泛應用于工業(yè)控制、醫療器械、通信、航空航天以及武器裝備等領(lǐng)域。是32位實(shí)時(shí)嵌入式操作系統,自20世紀80年代由風(fēng)河公司推出以來(lái),其良好的實(shí)時(shí)性、對多任務(wù)的支持、體積精簡(jiǎn)、可剪裁等優(yōu)點(diǎn)得到眾多公司、開(kāi)發(fā)者及用戶(hù)的喜愛(ài)。

在實(shí)時(shí)性要求高的應用系統中,器是經(jīng)常被用到的重要器件。而對于操作系統本身來(lái)說(shuō),并未提供一個(gè)通用、高效的器組件。文章所提出的就是針對這種情況的一種通用型定時(shí)器組件。

1 VxWorks定時(shí)的方法

1.1 使用taskDely函數

函數原型為:STATUS taskDelay(int ticks)該函數提供一種簡(jiǎn)單的任務(wù)休眠,常用于需要不精確定時(shí)或延時(shí)的應用中,其定時(shí)的單位為tick,默認情況下60(ticks)為1s (利用sysClkRateSet函數可以修改系統默認的時(shí)鐘速率)。在任務(wù)中調用taskDelay函數可以在指定的ticks期間空出CPU的使用權,同時(shí)改變該任務(wù)的狀態(tài)為DELAY.由于經(jīng)常受到任務(wù)調度的影響,該定時(shí)并不精確。

1.2 狗watchDog

VxWorks提供了一個(gè)狗定時(shí)器(watchDog timer),它由以下四個(gè)函數維護:

wdCreate( ) 創(chuàng )建并初始化一個(gè)看門(mén)狗定時(shí)器;wdDelete( ) 終止并刪除一個(gè)看門(mén)狗定時(shí)器;wdStart( ) 啟動(dòng)看門(mén)狗定時(shí)器;wdCancel( ) 暫停當前看門(mén)狗定時(shí)器運行。

利用wdCreate函數,在任何任務(wù)中都可以創(chuàng )建一個(gè)看門(mén)狗定時(shí)器,經(jīng)過(guò)設置的時(shí)間段后,指定的C函數。

watchDog定時(shí)器作為系統時(shí)鐘中斷服務(wù)程序的一部分來(lái)維護。因此看門(mén)狗所定時(shí)執行的程序工作在系統中斷級別具有很高的優(yōu)先級,該程序必須遵守一般ISR程序的規定,不能使用任何可能被阻塞的程序。文章所介紹的高效定時(shí)器就是在看門(mén)狗定時(shí)器的基礎上的。

1.3 POSIX標準的timer

VxWorks同時(shí)也提供IEEE的POSIX 1003.1b標準定時(shí)器接口。POSIX標準保證了應用程序與操作系統之間接口的簡(jiǎn)易性,利用這些接口編程,可以使得應用程序很輕松地從一個(gè)操作系統移植到另外的操作系統。使用該定時(shí)機制,在指定時(shí)間段后,任務(wù)將向自身發(fā)送SIGNAL,該定時(shí)器是建立在時(shí)鐘和信號之上。POSIX標準的timer定時(shí)器常常用來(lái)編寫(xiě)跨平臺、需要在多個(gè)操作系統下運行、易移植的程序。

2 基于看門(mén)狗定的高效定時(shí)機制

2.1 看門(mén)狗高效定時(shí)器

在一些基于嵌入式實(shí)時(shí)系統的項目中,經(jīng)常使用定時(shí)器來(lái)某一時(shí)間段后執行某一段程序或函數,而往往計時(shí)長(cháng)度都存在差異,定時(shí)器的使用也往往來(lái)自不同任務(wù),既要求實(shí)時(shí)性,又要保證資源竟爭的有序性。鑒于這些特點(diǎn),經(jīng)常采用的一個(gè)定時(shí)任務(wù)使用一個(gè)看門(mén)狗定時(shí)器的模式已不再適用,如果按照這種模式構建定時(shí)器機制,在定時(shí)任務(wù)較多的情況下,由于看門(mén)狗定時(shí)器運行在中斷級別,資源消耗就會(huì )變得很大,從而對系統的實(shí)時(shí)性產(chǎn)生影響。

看門(mén)狗定時(shí)器的定時(shí)機制可以解決這種資源嚴重浪費的現象。共享看門(mén)狗定時(shí)機制,顧名思義,就是多個(gè)定時(shí)任務(wù)通過(guò)共享同一個(gè)看門(mén)狗定時(shí)器來(lái)實(shí)現定時(shí)操作,其優(yōu)點(diǎn)是資源消耗小、實(shí)時(shí)性好、無(wú)須產(chǎn)生額外的定時(shí)任務(wù)。

2.2 定時(shí)算法

共享看門(mén)狗高效定時(shí)器的基本原理是動(dòng)態(tài)改變看門(mén)狗的定時(shí)任務(wù)。

如圖1所示,系統中存在A(yíng)、B、C三個(gè)定時(shí)任務(wù)。首先A任務(wù)提交一個(gè)500ms的定時(shí)任務(wù),200ms后B提交一個(gè)200ms的定時(shí)任務(wù),再100ms后C提交一個(gè)150ms的定時(shí)任務(wù)。除此之外再無(wú)其他計時(shí),A、B、C運行情況如圖1所示。

圖1 共享看門(mén)狗定時(shí)器計時(shí)機制

圖1 共享看門(mén)狗定時(shí)器計時(shí)機制(參見(jiàn)下頁(yè))定時(shí)器A在時(shí)間軸50ms處向共享定時(shí)器發(fā)起定時(shí)申請,共享定時(shí)器在其維護的定時(shí)列表中加入A的時(shí)延與執行程序的函數指針,并計算出定時(shí)器下一執行時(shí)刻TA(系統運行時(shí)間加上A的定時(shí)時(shí)延),此時(shí)由于還沒(méi)有其他定時(shí)器申請定時(shí)任務(wù),該列表中只存在A(yíng)的定時(shí)信息。當時(shí)間軸到達250ms時(shí),定時(shí)器B發(fā)起定時(shí)申請,由于定時(shí)器A的時(shí)延為500ms,B的時(shí)延為200ms,也就是說(shuō)B將在時(shí)間軸450ms處執行,比A提前了100ms(550ms減去450ms),此時(shí)定時(shí)列表將完成兩件事情,一是修改下一執行時(shí)刻TB為系統運行時(shí)間加上B的時(shí)延,二是針對執行時(shí)刻TA、TB對列表進(jìn)行從小到大的順序排序。此時(shí)列表中B為表頭,A在B之后。同樣的道理當時(shí)間軸到達350ms時(shí),定時(shí)器C發(fā)起定時(shí)申請,定時(shí)任務(wù)C被加入到定時(shí)列表,計算得出TC為系統運行時(shí)刻加上C的時(shí)延,然后依據TA、TB、TC重新進(jìn)行排序,此時(shí)列表順序為B、C、A.當時(shí)間軸執行到450ms時(shí),定時(shí)器B的ISR將被執行,同時(shí)B定時(shí)任務(wù)將從定時(shí)列表中刪除;同理,500ms、550ms時(shí)C任務(wù)與A任務(wù)將分別從列表中刪除。

此時(shí)所有定時(shí)任務(wù)執行結束,定時(shí)列表為空,共享看門(mén)狗定時(shí)器進(jìn)入休眠狀態(tài)。

2.3 定時(shí)器實(shí)現

2.3.1 定時(shí)器軟件結構

共享定時(shí)器軟件結構如圖2所示:

圖2 共享看門(mén)狗定時(shí)器計時(shí)機制

CWatchDogTimer類(lèi)完成了對看門(mén)狗定時(shí)器的封裝,它由一些通用的函數來(lái)維護一個(gè)看門(mén)狗定時(shí)器。其中Create()函數用來(lái)創(chuàng )建一個(gè)看門(mén)狗定時(shí)器;Delete()用來(lái)刪除該定時(shí)器;Start()用來(lái)啟動(dòng)定時(shí)任務(wù);Cancel()用來(lái)暫停定時(shí)器工作,此時(shí)再使用Start()函數可以恢復定時(shí)器的運行。

TimerInfo數據結構由tExe與tInterval兩個(gè)屬性構成,tExe記錄定時(shí)器的執行時(shí)間,tInterval表示定時(shí)器的時(shí)間間隔。

TimerList用來(lái)維護多個(gè)TimerInfo結構的變量,每個(gè)TimerInfo變量記錄一個(gè)定時(shí)器參數信息。

CEfficientTimer類(lèi)完成對多個(gè)定時(shí)任務(wù)的管理,包括RegistTimer()函數實(shí)現注冊一個(gè)定時(shí)器;UnRegistTimer()用來(lái)注銷(xiāo)一個(gè)定時(shí)器;ClearTimerList()用來(lái)清空定時(shí)器列表中所有定時(shí)器任務(wù);IsEmpty()用來(lái)判斷定時(shí)器列表是否為空。

2.3.2 看門(mén)狗定時(shí)模塊實(shí)現

看門(mén)狗定時(shí)模塊處理流程如圖3所示。

圖3 看門(mén)狗定時(shí)模塊處理流程

看門(mén)狗定時(shí)器模塊是共享定時(shí)器的基礎,它實(shí)現了單一定時(shí)器的建立、啟動(dòng)、刪除、取消等功能。首先通過(guò)Create()函數建立一個(gè)看門(mén)狗定時(shí)器,同時(shí)設定定時(shí)器時(shí)延、定時(shí)次數等參數;然后通過(guò)Start()函數啟動(dòng)定時(shí)器;看門(mén)狗程序判斷是否到達時(shí)間間隔,如果到達則開(kāi)始執行ISR程序,如果沒(méi)有到達則繼續等待;當執行完ISR程序后,定時(shí)器將判斷當前執行次數是否到達執行總次數,如果是則結束該次定時(shí)任務(wù),若不是程序將跳轉到重新啟動(dòng)定時(shí)器后依次執行。

2.3.3 定時(shí)器管理模塊實(shí)現

定時(shí)器管理模塊是共享定時(shí)機制的核心,用來(lái)維護定時(shí)器的注冊、注銷(xiāo)以及定時(shí)器鏈表的排序、刪除、清空等操作。

定時(shí)器的注冊流程如圖4所示,首先使用RegistTimer()函數注冊一個(gè)新的定時(shí)器任務(wù), 并將該定時(shí)器的TimerInfo結構插入鏈表中維護,然后針對該結構中的tExe變量對鏈表按照升序排列,執行時(shí)間最小的將置于表頭;若在插入該定時(shí)器任務(wù)之前鏈表中為空,則定時(shí)器處于休眠狀態(tài),此時(shí)置定時(shí)器狀態(tài)為運行;若插入前鏈表中已存在其他定時(shí)器任務(wù),則無(wú)須重啟定時(shí)器。

圖4 看門(mén)狗定時(shí)器注冊流程

定時(shí)器的注銷(xiāo)流程如圖5所示, 首先使用UnRegistTimer ()函數注銷(xiāo)一個(gè)已注冊的定時(shí)器任務(wù),并將該定時(shí)器的TimerInfo結構從鏈表中刪除,然后針對該結構中的tExe變量對鏈表按照升序排列,執行時(shí)間最小的將置于表頭;若在刪除該定時(shí)器任務(wù)之前鏈表中除了該定時(shí)任務(wù)沒(méi)有其他定時(shí)任務(wù)時(shí),則置定時(shí)器為休眠狀態(tài);反之,則無(wú)須重置定時(shí)器狀態(tài)。

圖5 看門(mén)狗定時(shí)器注銷(xiāo)流程

3 結束語(yǔ)

共享定時(shí)器提供了簡(jiǎn)單、高效、通用的定時(shí)方法,使用者可以?huà)侀_(kāi)管理諸多看門(mén)狗定時(shí)器的煩惱,從而專(zhuān)心于系統其他方面的。作為一個(gè)通用的系統組件,開(kāi)發(fā)人員不僅可以直接使用,縮短開(kāi)發(fā)時(shí)間,也可以繼承此定時(shí)器類(lèi),實(shí)現更多豐富的功能,提供了良好的擴展性與靈活性。

該機制在VxWorks的網(wǎng)絡(luò )報文應答、設備狀態(tài)監控等方面得到了廣泛應用,在有效節省系統資源的同時(shí)提高了系統定時(shí)機制的靈活性。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>