實(shí)時(shí)數(shù)據(jù)的發(fā)送常采用軟件定時(shí)器的方法來實(shí)現(xiàn)。在VC++6.0的環(huán)境下,分別采用WM_TIMER定時(shí)器,多媒體定時(shí)器以及通過利用系統(tǒng)計(jì)數(shù)器三種途徑,完成實(shí)時(shí)數(shù)據(jù)的發(fā)送,比較其在實(shí)現(xiàn)方法,優(yōu)先級,定時(shí)精度以及穩(wěn)定性等方面的差別。通過比較得到:在多線程,多任務(wù)的數(shù)據(jù)發(fā)送過程中或穩(wěn)定性較高,周期較短情況下,采用多媒體定時(shí)器可以獲得較高的定時(shí)精度,最小可達(dá)到1ms。
【關(guān)鍵詞】定時(shí)器 數(shù)據(jù)發(fā)送 穩(wěn)定性 定時(shí)精度
1 引言
通過相關(guān)的資料和在實(shí)際系統(tǒng)中的使用發(fā)現(xiàn),在VC+ + 6. 0 環(huán)境下,實(shí)時(shí)數(shù)據(jù)發(fā)送采用不同的軟件定時(shí)器,在發(fā)送頻率較慢的情況下,不同定時(shí)器的定時(shí)精度差別不大,當(dāng)發(fā)送頻率變快,不同定時(shí)器的定時(shí)精度差別較大,尤其是在測控程序在完成多線程的任務(wù)時(shí),這種差別會(huì)更加明顯。本文通過對3 種軟件定時(shí)器的實(shí)際使用的比較,研究和討論了WM_ TIMER ,多媒體定時(shí)器以及通過利用系統(tǒng)計(jì)數(shù)器這三 種實(shí)現(xiàn)定時(shí)的方法和定時(shí)精度的比較。
2 三種定時(shí)方法的比較
2.1 WM_ TIMER 定時(shí)器的實(shí)現(xiàn)
WM_ TIMER 是由VC+ + 提供的一種比較常用的定時(shí)器,它是系統(tǒng)定時(shí)器。它的實(shí)現(xiàn)原理是采用Set Timer () 函數(shù)進(jìn)行初始化,Kill Timer ( ) 函數(shù)關(guān)閉定時(shí)器,用戶定時(shí)向消息隊(duì)列發(fā)送并在WM_ TIMER 響應(yīng)函數(shù)中實(shí)現(xiàn)信號的
定時(shí)采集。Set Timer () 函數(shù)的聲明如下:
UINT_PTR Set Timer (
UINI_PTR nIDEvent ,
UINT nElap se ,
Void ( CALLBACK * lpfnTimer ) HWND , UINT , UINT _
PTR ,DWORD)
) ;
WM_ TIMER消息1秒之內(nèi)最多可以打斷18.2次,也就是說最少可以55毫秒取一次數(shù)據(jù),它是一個(gè)低優(yōu)先級的消息,當(dāng)消息隊(duì)列中有多個(gè)WM_ TIMER消息時(shí),系統(tǒng)要進(jìn)行消息合并。在實(shí)際的應(yīng)用中需要一個(gè)WM_ TIMER消息進(jìn)行定時(shí)對對話框進(jìn)行刷屏,所以不能用另一個(gè)WM_ TIMER消息進(jìn)行數(shù)據(jù)的發(fā)送。
2.2 多媒體定時(shí)器的實(shí)現(xiàn)
多媒體定時(shí)器是由Windows 系統(tǒng)提供的多媒體定時(shí)器資源。他的實(shí)現(xiàn)步驟是設(shè)置多媒體定時(shí)器參數(shù),應(yīng)用程序可調(diào)用timeGetDevCaps () 函數(shù)來確定定時(shí)器服務(wù)所支持的最小和最大精度;啟動(dòng)定時(shí)器,在事件中展開各種應(yīng)用,如數(shù)據(jù)采集等;刪除定時(shí)器釋放系統(tǒng)資源。常用的一些函數(shù)和表示意義如下:
timeBeginPeriod( ) 設(shè)置最小定時(shí)器分辨率;
timeEndPeriod( ) 清除上一個(gè)函數(shù)建立的最小定時(shí)器
分辨率;
timeSet Event ( ) 產(chǎn)生一個(gè)在指定時(shí)間周期內(nèi)執(zhí)行的
定時(shí)器時(shí)間;
timeKillEvent ( ) 刪除前面設(shè)定的定時(shí)器事件;
多媒體定時(shí)器的接口函數(shù)包含于mmsystem. dll 的動(dòng)態(tài)鏈接庫中,VC+ + 提供響應(yīng)的頭文件。多媒體定時(shí)器具體的實(shí)現(xiàn)方法是:
2.2.1 設(shè)置定時(shí)器分辨率:對定時(shí)器的參數(shù)進(jìn)行設(shè)置
MMRESUL T timeGetDevCaps ( lp TIMECAPS &ptc ,UINTcbtc)
調(diào)用timeGetDevCaps 函數(shù)來判斷定時(shí)器最大和最小的分辨率,然后調(diào)用timeBeginPeriod (UINTuPeriod) 來設(shè)定定時(shí)器的分辨率,參數(shù)UINTuPeriod 為定時(shí)器分辨率的值。
2.2.2 設(shè)定定時(shí)器的觸發(fā)事件
MMRESUL TtimeSet Event (UINT uDelay ,
/ / uDlelay :采樣的事件間隔
UINT uResolution ,
/ / uResolution :時(shí)間精度,缺省默認(rèn)為1 ms
L PTIMECALLBACK lp TimeProc ,
/ / lp TimeProc :用戶定義的回調(diào)函數(shù)
DWORD dwUser , UINT fuEvent) ;
/ / dwUser :用戶提供的回調(diào)函數(shù)
/ / UINT fuEvent :事件觸發(fā)方式,采用TIMEPERIODIC 為每隔一定時(shí)間觸發(fā)一次
2.2.3 聲明一個(gè)全局回調(diào)函數(shù)
void CALLBACK TimerCallBackProc ( UINT wTimer ID ,UINT mMsg ,DWORD dwUser ,DWORD dw1 ,DWORD dw2)
其中,wTimer ID 是定時(shí)器標(biāo)識;mMsg 保留; dwUser用戶使用參;dw1 ,dw2 保留。
2.2.4 自定義消息處理函數(shù): 用來接受多媒體定時(shí)器的事件通知
多媒體定時(shí)器服務(wù)使應(yīng)用程序可以調(diào)度時(shí)間周期或一次中斷事件。它與消息序列傳遞WM—TIMER 消息的定時(shí)器服務(wù)不一樣。它提供硬件中斷服務(wù);它不傳送任何消息,而是調(diào)用回調(diào)函數(shù);定時(shí)器中斷服務(wù)提供了改善了的分辨率和精度(基于Intel 系統(tǒng)的精度是:最多16 毫秒,基于MIPS 系統(tǒng)的精度最多10 毫秒)。
2.3 利用系統(tǒng)計(jì)數(shù)器實(shí)現(xiàn)定時(shí)
(1)利用系統(tǒng)計(jì)數(shù)器可以實(shí)現(xiàn)0.1ms的定時(shí)。在窗口初始化的函數(shù)OnInitDlg()中寫如下程序:
#include window.h #include kernel132.libendprint
Typedef union _LARGE_INTEGER
{
Struct{
DWORD LowPart;
LONG HighPart;
}
LONG QuadPart;
} LARGE_INTEGER
測試
LARGE_INTEGER PT_litmp;
LONGLONG PT_QPart1, PT_QPart2;
Double PT_dfMinus, PT_dfFreq, PT_dfTim;
QueryPerformanceFrequency(&PT_litmp);
PT_dfFreq=(double)PT_litmp.QuadPart;
QueryPerformanceCounter(&PT_litmp);
PT_QPart1= PT_litmp.QuadPart;
for(i=0;i QueryPerformanceCounter(&PT_litmp); PT_QPart2= PT_litmp.QuadPart; PT_dfMinus=(double)(PT_QPart2-PT_QPart1); PT_dfTim= PT_dfMinus/ PT_dfFreq; PT_dfTim*=1000; PT_dfTim*=1000000; (2)在窗口定時(shí)刷新函數(shù)OnTimer()中 Sprintf(buf, "%5.2f", PT_dfTim); m_us=buf; (3)測試結(jié)果如下 當(dāng)計(jì)數(shù)值numble為1000時(shí),得到的定時(shí)時(shí)間為0.00623ms; 當(dāng)計(jì)數(shù)值numble為10000時(shí),得到的定時(shí)時(shí)間為0.057ms; 當(dāng)計(jì)數(shù)值numble為100000時(shí),得到的定時(shí)時(shí)間為0. 57ms; 當(dāng)計(jì)數(shù)值numble為1000000時(shí),得到的定時(shí)時(shí)間為5.84ms; 當(dāng)計(jì)數(shù)值numble為10000000時(shí),得到的定時(shí)時(shí)間為57.03ms; 因?yàn)橛?jì)數(shù)值與時(shí)間值不是線形的比例關(guān)系,所以當(dāng)我們需要一個(gè)準(zhǔn)確的時(shí)間,如2.5 ms時(shí),一般很難確定numble值。 3 討論與結(jié)論 WM_ TIMER定時(shí)器在Windows中的最大缺點(diǎn)是計(jì)時(shí)器的最大分辨率是55ms,就是說應(yīng)用程序每秒最多能接收到18個(gè)消息。從系統(tǒng)響應(yīng)的優(yōu)先權(quán)來說,Windows 是一個(gè)消息驅(qū)動(dòng)的非搶先優(yōu)先式的多任務(wù)操作系統(tǒng),消息隊(duì)列中總有大量的消息在等待處理;而WM_ TIMER是一個(gè)優(yōu)先級很低的消息,只有當(dāng)所有消息(除消息WM_ PAINT) 被處理后才能被響應(yīng),而不能立即被系統(tǒng)響應(yīng),并且當(dāng)消息隊(duì)列中有多個(gè)WM_ TIMER 消息時(shí),系統(tǒng)要進(jìn)行消息合并,因此定時(shí)精度并不高。 從運(yùn)行基理來看,多媒體定時(shí)器提供的是硬件中斷服務(wù),不傳送任何消息,優(yōu)先級很高多媒體定時(shí)器使用自己獨(dú)立的線程,調(diào)用回調(diào)函數(shù),這種定時(shí)器的中斷服務(wù)可以提供基于Intel系統(tǒng)的精度最多為16ms,最小定時(shí)精度可達(dá)1ms。 利用系統(tǒng)計(jì)數(shù)器進(jìn)行定時(shí),雖然可以達(dá)到微秒級,但是因計(jì)數(shù)值與時(shí)間值不是線形的比例關(guān)系,所以當(dāng)我們需要一個(gè)準(zhǔn)確的時(shí)間,如2.5ms,一般很難確定計(jì)數(shù)值。 參考文獻(xiàn) [1]李凈,楊俊武,錢旭.用多媒體定時(shí)器精確控制采樣頻率[J].計(jì)算機(jī)應(yīng)用,2000,12(12):67268. [2]鄭存紅,胡榮強(qiáng),趙瑞峰.用VC實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)采集[J].計(jì)算機(jī)應(yīng)用研究,2002,21(04):1032108. [3]于勇,雷志勇.Windows下實(shí)時(shí)測控系統(tǒng)的實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2005,28(05):22223. [4]王偉,徐國華.多媒體定時(shí)器在工業(yè)控制中的應(yīng)用[J].微型機(jī)與應(yīng)用,2001(12):8210. 作者簡介 賈耀輝(1983-),男,2010年畢業(yè)于重慶大學(xué),工程師,主要從事發(fā)射裝置隨動(dòng)控制技術(shù)研究工作。 作者單位 中國船舶重工集團(tuán)公司第七一三研究所 河南省鄭州市 450015