專利名稱:Windows操作系統(tǒng)Pentium Ⅳ架構下高精度低CPU占用率定時器的實現(xiàn)方法
技術領域:
本發(fā)明涉及利用8254中斷定時器在Windows操作系統(tǒng)Pentium IV架構下實現(xiàn)高精度低CPU占用率的定時器,涉及Windows操作系統(tǒng)的定時器軟件開發(fā)技術領域。
背景技術:
Windows操作系統(tǒng)提供給用戶很多API來實現(xiàn)定時器功能,從原理上大致分為如下三種定時器:WM_TIMER消息定時器,多媒體定時器,Windows時間戳定時器。下面分別從實現(xiàn)方法和性能上介紹這三種定時器。(1)WM_HMER 定時器WM_TIMER定時器是Windows最簡單的定時器,它得用SetTimerO函數(shù)設定定時器的間隔時間,然后定時為指定的線程發(fā)送WMJIMER消息,WMJIMER消息加入消息隊列后等待處理。KillTimerO函數(shù)具有銷毀定時器的功能。這種定時器的優(yōu)點是使用簡單,資源占用率小。但是WM_HMER消息被處理的優(yōu)先級是很低的。如果窗口的消息隊列中不停的有其它消息發(fā)送過來,WMJIMER消息就一直被推遲投遞,也就是說,當調(diào)用SetTimer時所傳入的uElapse參數(shù)是得不到保障的,因此WMJIMER定時器的精度很低,平均值大約在15ms左右,這使得這種定時器非常不適合應用在高精度定時任務中。(2)多媒體定時器Windows下有一個多媒體定時器,用法為一組API函數(shù)的調(diào)用,它們是:MMRESULT timeBeginPeriod(UINT uPeriod);MMRE SULT timeSetEvent (UINT u D e I a y , UINT uResolution,LPTIMECALLBACKlpTimeProc, DWORD dwUser, UINT fuEvent);void CALLBACK TimeProc(UINT uID,UINT uMsg,DWORD dwUser,DWORD dwI,DWORDdw2);MMRESULT timeKiIIEvent(UINT uTimerID);MMRESULT timeEndPeriod(UINT uPeriod);其中timeBeginPeriod是用來設置最高定時精度的,最高精度為Ims,如果要產(chǎn)生間隔為Ims的中斷,必須調(diào)用timeBeginPeriod(l);當定時器用完之后就要用timeEndPeriod (I);來恢復默認的精度。具體使用方法為在timeBeginPeriod (I)調(diào)用之后用timeSetEvent O注冊一個回調(diào)函數(shù),即一個中斷處理過程。它還可以向回調(diào)函數(shù)傳遞一個參數(shù),通常可以傳送一個窗口句柄之類的東西。而回調(diào)函數(shù)TimeProc則從dwwUser參數(shù)中取出傳遞的參數(shù)使用。在Windows下,可以用這種方法進行Ims精度的定時數(shù)據(jù)采集,數(shù)據(jù)發(fā)送,但要保證Ims能完成所有的操作和運算。經(jīng)過實踐證明,用它來實現(xiàn)控制的精度是足夠的。但是由于多媒體定時器是一個獨立的線程在監(jiān)視系統(tǒng)時鐘,所以在多線程下,由于CPU時間片的切換,多媒體定時器也不能完成Ims的定時。(3)時間戳定時器
時間戳定時器的原理是用一個獨立的線程,時刻監(jiān)視CPU時間戳計數(shù)器的增量變化,當增量變化大于設定的時間間隔,則跳入處理過程。Windows提供兩個有關CPU時間戮的API函數(shù):QueryPerformanceFrequency O獲得當前CPU計數(shù)器頻率和QueryPerformanceCounterO獲得當前CPU計數(shù)器計數(shù)值。時間戳定時器內(nèi)要有一個循環(huán),作用就是時刻監(jiān)視CPU計數(shù)器的變化,因此時間戳定時器占用的CPU資源非常多。從理論上講時間戳定時器可以達到很短時間(甚至ns單位)的定時,前提是定時器的處理過程時間要小于定時器間隔時間。但是在Windows操作系統(tǒng)多任務機制下,如果其它線程與其共用CPU資源,那么在其它線程占用CPU時間片的時候,時間戳定時器停止監(jiān)視CPU計數(shù)器計數(shù)增量變化,這個時候時間戳定時器無效,這造成時間戳定時器無法按預計的定時時間間隔工作,從而影響了時間戳定時器的工作效果。Windows所提供的定時器基本上采用的是消息機制,多線程,輪詢監(jiān)視這幾種方法,在Windows多任務分時工作時很難達到高精度低CPU資源占用率。
發(fā)明內(nèi)容
本發(fā)明的目的是設計一種高精度、同時CPU占用的資源又很少的定時器,以解決現(xiàn)在Windows多任務分時工作時很難達到高精度低CPU資源占用率的技術問題。本發(fā)明為解決上述技術問題采取的技術方案是:一種Windows操作系統(tǒng)Pentium IV架構下高精度低CPU占用率定時器的實現(xiàn)方法,所述方法的具體實現(xiàn)過程為:步驟一、利用Pentium IV架構PC機芯片組內(nèi)的8254芯片,通過編寫8254中斷定時器的驅(qū)動程序,對8254內(nèi)部寄存器進行配置,使能了 8254芯片的內(nèi)部計數(shù)功能;步驟二、通過編寫的可編程中斷控制器APIC驅(qū)動程序,在可編程中斷控制器APIC中為8254PIT設定對應的中斷向量;步驟三、修改Windows IDT (中斷描述表),定義中斷處理函數(shù),改變中斷描述符表中的中斷門結構,并將自定義的中斷處理函數(shù)的指針賦給門結構的值,對用戶自定義中斷處理函數(shù)的調(diào)用,實現(xiàn)了一個基于中斷的硬時鐘定時器。在步驟二中,所述的可編程中斷控制器APIC由本地高級中斷控制器(LAPIC)和I/O高級中斷控制器(IOAPIC)兩部分組成,本地高級中斷控制器位于CPU中,1/0高級中斷控制器位于南橋芯片上,用于連接各個產(chǎn)生中斷的設備??删幊讨袛嗫刂破鰽PIC的工作過程為:收到來自IOAPIC的中斷消息后,LAPIC及對應CPU通過中斷請求寄存器IRR、當前中斷服務寄存器ISR、任務優(yōu)先級寄存器TPR、處理器優(yōu)先級寄存器PPR以及中斷結束寄存器EOI處理該中斷。LAPIC的ISR、IRR均為256bit寄存器,對應Pentium IV平臺上的256個中斷向量;IRR中相應位置I,代表LAPIC已接收中斷,但還未交CPU處理;ISR中相應位置1,代表CPU已開始處理中斷,但還未完成;iCPU正在處理某中斷時,同類型中斷如果發(fā)生,相應的IRR bit會再次置I ;如果某中斷被掛起在IRR中,同類型的中斷發(fā)生,則ISR中相應的bit被直I ;在APIC系統(tǒng)中,冋一類型中斷最多可以被計數(shù)兩次;對于Pentium IV系列CPU,中斷消息被LAPIC拒絕。LAPIC需要軟件寫EOI來通知中斷處理的完成,LAPIC中的EOI是一個32bit寄存器,對EOI寫O表示中斷處理完成。所述定時器的中斷處理過程為:中斷是通過中斷描述符表(IDT)處理的,IOAPIC上有24個中斷號引腳,每個中斷號對應的設備發(fā)出中斷后,IOAPIC都會向CPU發(fā)送一個中斷消息,消息內(nèi)部包括一個重要的值,就是中斷向量,指定中斷號的中斷向量由RTE表中的0-7位確定,中斷向量對應的中斷門信息在IDT表中存儲;改變中斷描述符表中的中斷門結構,將用戶自定義中斷處理函數(shù)的指針賦給門結構的值,在8254的每一個中斷到來時,CPU便會執(zhí)行用戶自定義的中斷服務程序,實現(xiàn)了基于8254PIT的高精度定時器。在步驟一中,8254中斷定時器驅(qū)動程序主要包含下列功能函數(shù):void pit8254_timerinit (ULONG ICW),按控制字初始化定時器;void pit8253_timerset (USHORT I, USHORT h),設定計數(shù)值;void pit8253_timerget (USHORT*I, USH0RT*h),讀取計數(shù)值。本發(fā)明的有益效果是:在使用單片機上或DSP等智能芯片時,為了避免輪詢造成的CPU資源浪費,大都采用中斷的方式?,F(xiàn)代PC機的芯片組內(nèi),都有一片中斷定時器芯片,它可以發(fā)出定時中斷或控制PC蜂鳴器發(fā)聲,它的時鐘信號可達IMHz以上,理論上可以實現(xiàn)US級定時。本發(fā)明就是利用該芯片在Windows下實現(xiàn)一個基于中斷的硬時鐘定時器。本發(fā)明利用Pentium IV架構PC機的芯片組內(nèi)的8254芯片,通過編寫8254中斷定時器驅(qū)動程序、APIC驅(qū)動程序,在Windows下實現(xiàn)一個基于中斷的硬時鐘定時器;定義中斷處理函數(shù),改變中斷描述符表中的中斷門結構,并將自定義的中斷處理函數(shù)的指針賦給門結構的值,實現(xiàn)對用戶自定義中斷處理函數(shù)的調(diào)用,實現(xiàn)了可應用的定時器;經(jīng)測試,定時精度可達到亞毫米級,在定時為IOOus時,定時偏移小于7us,且CPU占用率極低,滿足大多數(shù)windows系統(tǒng)定時應用要求。在中斷處理函數(shù)中,通過獲取CPU計數(shù)器的值,計算相鄰兩次執(zhí)行中斷處理的時間差,測試中斷定時精度,結果可達到亞毫米級,多次統(tǒng)計結果顯示,在定時為IOOus時,定時偏移小于7us,且CPU占用率極低,滿足大多數(shù)windows系統(tǒng)定時應用要求。
圖1是基于Pentium IV架構的PC機的芯片圖;圖2是典型的具有多個處理器的PC平臺的結構框圖(APIC模式);圖3是本發(fā)明方法的中斷過程的調(diào)用原理框圖(中斷過程的調(diào)用);圖4是IDTR寄存器(IDTR Regisger)原理框圖;圖5是IOOus中斷定時間隔測試結果圖,圖6是500us中斷定時間隔測試結果圖,圖7是Ims中斷定時間隔測試結果圖。
具體實施例方式如圖1 4所示,本實施方式所述的Windows操作系統(tǒng)Pentium IV架構下高精度低CPU占用率定時器的實現(xiàn)方法,在Windows實現(xiàn)高精度定時器主要包括三步:步驟一、初始化8254芯片,設置內(nèi)部寄存器,使能8254內(nèi)部計數(shù)器:利用PentiumIV架構PC機芯片組內(nèi)的8254芯片,通過編寫8254中斷定時器的驅(qū)動程序,對8254內(nèi)部寄存器進行配置,使能了 8254芯片的內(nèi)部計數(shù)功能;
步驟二、在可編程中斷控制器APIC中,為8254PIT設定對應的中斷向量:通過編寫的可編程中斷控制器APIC驅(qū)動程序,在可編程中斷控制器APIC中為8254PIT設定對應的中斷向量;步驟三、修改Windows IDT (中斷描述表),讓中斷觸發(fā)后,進入自定義中斷處理函數(shù):修改Windows IDT (中斷描述表),定義中斷處理函數(shù),改變中斷描述符表中的中斷門結構,并將自定義的中斷處理函數(shù)的指針賦給門結構的值,對用戶自定義中斷處理函數(shù)的調(diào)用,實現(xiàn)了一個基于中斷的硬時鐘定時器。8254中斷定時器設置過程:基于Pentium IV架構的PC機的芯片組內(nèi),有8254PIT定時器芯片。8254芯片內(nèi)部具有三個獨立的16位計數(shù)器,它可用程序設置成多種工作方式,按十進制計數(shù)或二進制計數(shù),最高計數(shù)頻率可達IOMHz。如圖1所示。8254的三個計數(shù)器是獨立的16位減法計數(shù)器。計數(shù)器的工作方式由工作方式寄存器確定。8254控制字格式如表1:D7 D6 D5 D4 D3 D2 Dl DO
權利要求
1.一種Windows操作系統(tǒng)Pentium IV架構下高精度低CPU占用率定時器的實現(xiàn)方法,其特征在于:所述方法的具體實現(xiàn)過程為: 步驟一、利用Pentium IV架構PC機芯片組內(nèi)的8254芯片,通過編寫8254中斷定時器的驅(qū)動程序,對8254內(nèi)部寄存器進行配置,使能了 8254芯片的內(nèi)部計數(shù)功能; 步驟二、通過編寫的可編程中斷控制器APIC驅(qū)動程序,在可編程中斷控制器APIC中為8254PIT設定對應的中斷向量; 步驟三、修改Windows IDT,定義中斷處理函數(shù),改變中斷描述符表中的中斷門結構,并將自定義的中斷處理函數(shù)的指針賦給門結構的值,對用戶自定義中斷處理函數(shù)的調(diào)用,實現(xiàn)了一個基于中斷的硬時鐘定時器。
2.根據(jù)權利要求1所述的一種Windows操作系統(tǒng)PentiumIV架構下高精度低CPU占用率定時器的實現(xiàn)方法,其特征在于:在步驟二中,所述的可編程中斷控制器APIC由本地高級中斷控制器和I/O高級中斷控制器兩部分組成,本地高級中斷控制器位于CPU中,I/O高級中斷控制器位于南橋芯片上,用于連接各個產(chǎn)生中斷的設備。
3.根據(jù)權利要求2所述的一種Windows操作系統(tǒng)PentiumIV架構下高精度低CPU占用率定時器的實現(xiàn)方法,其特征在于:可編程中斷控制器APIC的工作過程為:收到來自IOAPIC的中斷消息后,LAPIC及對應CPU通過中斷請求寄存器IRR、當前中斷服務寄存器ISR、任務優(yōu)先級寄存器TPR、處理器優(yōu)先級寄存器PPR以及中斷結束寄存器EOI處理該中斷。
LAPIC的ISR、IRR均為256bit寄存器,對應Pentium IV平臺上的256個中斷向量;IRR中相應位置I,代表LAPIC已接收中斷,但還未交CPU處理;ISR中相應位置I,代表CPU已開始處理中斷,但還未完成 ;當CPU正在處理某中斷時,同類型中斷如果發(fā)生,相應的IRR bit會再次置I ;如果某中斷被掛起在IRR中,同類型的中斷發(fā)生,則ISR中相應的bit被置I ;在APIC系統(tǒng)中,冋一類型中斷最多可以被計數(shù)兩次;對于Pentium IV系列CPU,中斷消息被LAPIC拒絕。
LAPIC需要軟件寫EOI來通知中斷處理的完成,LAPIC中的EOI是一個32bit寄存器,對EOI寫O表示中斷處理完成。
4.根據(jù)權利要求3所述的一種Windows操作系統(tǒng)PentiumIV架構下高精度低CPU占用率定時器的實現(xiàn)方法,其特征在于:所述定時器的中斷處理過程為: 中斷是通過中斷描述符表處理的,IOAPIC上有24個中斷號引腳,每個中斷號對應的設備發(fā)出中斷后,IOAPIC都會向CPU發(fā)送一個中斷消息,消息內(nèi)部包括一個重要的值,就是中斷向量,指定中斷號的中斷向量由RTE表中的0-7位確定,中斷向量對應的中斷門信息在IDT表中存儲;改變中斷描述符表中的中斷門結構,將用戶自定義中斷處理函數(shù)的指針賦給門結構的值,在8254的每一個中斷到來時,CPU便會執(zhí)行用戶自定義的中斷服務程序,實現(xiàn)了基于8254PIT的高精度定時器。
5.根據(jù)權利要求1、2、3或4所述的一種Windows操作系統(tǒng)PentiumIV架構下高精度低CPU占用率定時器的實現(xiàn)方法,其特征在于:在步驟一中,8254中斷定時器驅(qū)動程序主要包含下列功能函數(shù): void pit8254_timerinit (UL0NG ICW),按控制字初始化定時器; void pit8253_timerset (USH0RT I,USHORT h),設定計數(shù)值;void pit82 53_timerget (USH0RT*1, USH0RT*h),讀取計數(shù)值。
全文摘要
Windows操作系統(tǒng)Pentium IV架構下高精度低CPU占用率定時器的實現(xiàn)方法,涉及Windows操作系統(tǒng)的定時器軟件開發(fā)技術領域。本發(fā)明的目的是設計一種高精度、同時CPU占用的資源又很少的定時器,以解決現(xiàn)在Windows多任務分時工作時很難達到高精度低CPU資源占用率的技術問題。利用Pentium IV架構PC機的芯片組內(nèi)的8254芯片,通過編寫8254中斷定時器驅(qū)動程序、APIC驅(qū)動程序,在Windows下實現(xiàn)一個基于中斷的硬時鐘定時器;定義中斷處理函數(shù),改變中斷描述符表中的中斷門結構,并將自定義的中斷處理函數(shù)的指針賦給門結構的值,實現(xiàn)對用戶自定義中斷處理函數(shù)的調(diào)用,實現(xiàn)了可應用的定時器;經(jīng)測試,定時精度可達到亞毫米級,在定時為100us時,定時偏移小于7us,且CPU占用率極低,滿足大多數(shù)windows系統(tǒng)定時應用要求。
文檔編號G06F9/48GK103197971SQ20131014090
公開日2013年7月10日 申請日期2013年4月22日 優(yōu)先權日2013年4月22日
發(fā)明者魏長安, 楊京禮, 李龍華, 李驥, 姜守達 申請人:哈爾濱工業(yè)大學