麻豆精品无码国产在线播放,国产亚洲精品成人AA片新蒲金,国模无码大尺度一区二区三区,神马免费午夜福利剧场

Windows操作系統環境下可調速定時器的實現方法與流程

文檔序號:12549976閱讀:608來源:國知局
Windows操作系統環境下可調速定時器的實現方法與流程

本發明涉及Windows操作系統的中斷處理、高精度定時以及系統軟件開發技術領域。更具體地說,本發明涉及一種利用APIC(Advanced Programmable Interrupt Controller)定時器在Windows操作系統環境下實現高精度可調速的定時器的方法。



背景技術:

Windows操作系統為用戶提供了三類定時器:WM_TIMER消息定時器、多媒體時鐘定時器和高精度時鐘定時器。

1)WM_TIMER定時器:WM_TIMER定時器是Windows最基礎的定時器,通過SetTimer()進行創建和設定間隔,進而采用KillTimer()進行銷毀。WM_TIMER創建后將定時為指定線程發送WM_TIMER消息,并加入消息隊列等待處理。WM_TIMER定時器消息是一種低優先級消息,只有當沒有更高優先級的消息在線程消息隊列中時,WM_TIMER消息才會被投遞。同時WM_TIMER定時器精度很低,平均值大約在15ms左右,不具有高精度特性。

2)多媒體時鐘定時器:多媒體時鐘定時器可以為應用程序提供精度為毫秒的定時事件。使用timeSetEvent()函數注冊用回調函數,并可以通過調用timeKillEvent()函數關閉定時器。多媒體時鐘定時器最高能夠實現最高1ms精度定時,多媒體時鐘無法滿足高于1ms的定時需求.

3)高精度時鐘定時器:當系統中存在高精度性能計數器(High-Resolution Performance Counter)時,應用程序能夠采用QueryPerformanceCounter函數實現納秒級精度的定時。QueryPerformanceCounter內部采用循環制,監測CPU高精度性能計數器的變化,因此該定時器的使用會占用大量CPU資源。

此外,雖然Windows系統所提供的上述三類定時器能夠滿足特定定時精度的需要,但無法動態調整定時器時間間隔與真實系統時間跨度之間的比例關系,即沒有提供動態調整定時器速率的功能。



技術實現要素:

本發明的一個目的是解決上述至少一個問題或缺陷,并提供后面將說明的至少一個優點。

本發明還有一個目的是提供一種Windows操作系統環境下可調速定時器的實現方法,其通過Windows驅動的方式,利用APIC定時器設備,產生百微秒級的時鐘信號,實現了最高精度為100微秒的高精度定時器;通過在運行時修改APIC定時器中初始計數寄存器(initial count register)中的數值,完成對定時器時間間隔的動態調整,改變定時器時間間隔與真實系統時間跨度之間的比例關系,實現定時器的可調速功能,解決現有的Windows系統定時器不可調速的問題,解決系統定時器功能固定、速率單一的問題,滿足Windows程序在不同環境下的應用需求。

為了實現根據本發明的這些目的和其它優點,提供了一種Windows操作系統環境下可調速定時器的實現方法,包括以下步驟:

步驟一、用戶態接口提供:選用APIC定時器,提供一組用戶態接口;

步驟二、用戶態接口封裝:將調速功能和時間相關函數接口封裝為動態鏈接庫,供Windows操作系統中的應用程序使用;

步驟三、動態鏈接庫加載:應用程序加載所述動態鏈接庫,實現所述用戶態接口的調用;

步驟四、新周期值傳入內核:應用程序通過調用所述動態鏈接庫中的用戶態接口,將調整后的APIC定時器周期以DeviceIoControl或者共享內存的方式傳入內核;

步驟五、APIC定時器周期更改:將所述步驟四調整后的APIC定時器周期賦值給初始計數寄存器,實現APIC定時器的周期調整,其中,初始計數寄存器進行了設置,具體設置包括:初始計數寄存器設定公式:計數值=APIC定時器周期×CPU外頻×時間單位/1000,往地址0xFEE00380寫入計數值,設置初始計數寄存器。

優選的是,調速功能包括:時間速率控制、定時器時間凍結和解凍功能,時間速率控制實現步驟包括:往地址0xFEE00380中寫入利用初始計數寄存器設定公式計算所得計數值即可實現1倍速;往0xFEE00380中寫入0.1×計數值即可實現10倍速,往0xFEE00380中寫入10×計數值即可實現0.1倍速;定時器時間凍結實現步驟包括:保存地址0xFEE00380中數據并往地址0xFEE00380寫入0,設置初始計數寄存器為0;解凍功能實現步驟包括:往地址0xFEE00380寫入凍結時保存的數值。

優選的是,所述步驟二中,時間相關函數實現授時功能和任務睡眠功能,授時功能實現步驟包括:通過CreateFile函數加載驅動,通過DeviceIoControl函數或者共享內存獲取調度器中的系統時間,返回獲取的系統時間;任務睡眠功能實現步驟包括:獲取當前線程ThreadId作為后續掛起、喚醒操作的操作對象,計算任務釋放時間,將當前任務線程控制塊TCB插入讓渡隊列Yield_List中,其中,任務釋放時間=定時器系統時間+睡眠時間。

優選的是,APIC定時器進行了相關設置,具體設置包括:Local APIC含有4個用于產生時鐘中斷的寄存器:分頻寄存器、初始計數寄存器、當前計數寄存器與本地向量表寄存器,分頻寄存器用來表示當前系統時間基準和系統總線的倍數關系,將往地址0xFEE003E0寫入0xB,將分頻寄存器設置為1;APIC定時器的計數模式設置:通過本地向量表寄存器設置為單次模式或者周期模式,此處設置為周期模式,在周期模式下,當前計數寄存器自動從初始計數寄存器載入計數值,然后以總線頻率開始遞減,當計數達到0時,觸發本地向量表寄存器中存儲的中斷向量并根據中斷向量從中斷向量表中調用中斷處理函數,然后再次載入初始計數寄存器中數值,往地址0xFEE00320寫入0x300e2,使其指向對應中斷處理函數并設置為周期模式。

優選的是,APIC定時器具有高精度特性,其高精度特性通過以下步驟實現:設置APIC定時器:設置初始計數寄存器、分頻寄存器和本地向量表寄存器,使其能產生微秒級的時鐘信號供調度器使用;內核態函數接口封裝:借助于系統服務描述符表,利用已知的Windows接口特征碼,搜索系統內存指令,獲取調度器所需的函數地址,并根據系統函數原型,利用內聯匯編進行調用,供調度器使用;實現調度器:利用上一步所封裝的內核態函數接口,完成調度器的編寫,在調度器內維護定時器時間和任務隊列。

優選的是,調度器內維護定時器時間和任務隊列中,所述調度器實現的具體步驟包括:通過用戶態接口將需要周期性喚醒的任務的線程控制塊TCB插入讓渡隊列Yield_List并計算任務喚醒時間;系統時間增加APIC周期時間;遍歷讓渡隊列Yield_List,一旦發現存在任務就通過掛起函數地址掛起該任務,并將該任務線程控制塊TCB插入等待隊列Waiting_List;遍歷等待隊列Waiting_List檢查是否有任務已經到達喚醒時間,如果到達釋放時間,就將該任務線程控制塊TCB從等待隊列Waiting_List中刪除并插入就緒隊列Ready_List;遍歷就緒隊列Ready_List檢查是否有任務需要喚醒,一旦隊列中存在任務,就通過恢復函數地址將該任務喚醒。

優選的是,掛起函數地址為NtSuspendThread函數地址,恢復函數地址為NtResumeThread函數地址。

優選的是,所述調度器通過APIC定時器產生高精度時鐘信號中斷插入延遲過程調用DPC來觸發。

本發明至少包括以下有益效果:

1、利用APIC定時器實現高精度可調速的定時器,解決現有的Windows系統定時器不可調速的問題,解決系統定時器功能固定、速率單一的問題,滿足Windows程序在不同環境下的應用需求;

2、定時器提供一組用戶態接口,開發人員在需要調試軟件時調用定時器所提供的接口即可,方便使用;

3、利用處理器的APIC定時器產生高精度時鐘信號,觸發實現的調度器,并通過在用戶態動態修改初始計數寄存器數值,在Windows操作系統下實現了一個高精度可調速的定時器,經測試,定時器精度可以達到微秒級,滿足大多數Windows系統定時要求,同時定時器實現了0.001倍速到10倍速的速率調整功能,滿足應用程序對定時器速率調整的需求。

本發明的其它優點、目標和特征將部分通過下面的說明體現,部分還將通過對本發明的研究和實踐而為本領域的技術人員所理解。

附圖說明

圖1為本發明的一個實施例中Windows操作系統環境下可調速定時器的實現方法的流程示意圖;

圖2說明的是Windows操作系統環境下可調速定時器的實現方法的軟件架構示意圖;

圖3為調速功能邏輯時間控制程序示意圖;

圖4說明的是APIC定時器的寄存器設置示意圖;

圖5說明的是APIC定時器高精度特性實現流程圖;

圖6說明的是調度器調度流程示意圖;

圖7說明的是系統服務描述符表示意圖。

具體實施方式

下面結合附圖對本發明做進一步的詳細說明,以令本領域技術人員參照說明書文字能夠據以實施。

圖1示出了根據本發明的一種實現形式,示出了Windows操作系統環境下可調速定時器的實現方法。其中包括:

步驟一、用戶態接口提供:選用APIC定時器,提供一組用戶態接口;

步驟二、用戶態接口封裝:將調速功能和時間相關函數接口封裝為動態鏈接庫,供Windows操作系統中的應用程序使用;

步驟三、動態鏈接庫加載:應用程序加載所述動態鏈接庫,實現所述用戶態接口的調用;

步驟四、新周期值傳入內核:應用程序通過調用所述動態鏈接庫中的用戶態接口,將調整后的APIC定時器周期以DeviceIoControl或者共享內存的方式傳入內核;

步驟五、APIC定時器周期更改:將所述步驟四調整后的APIC定時器周期賦值給初始計數寄存器,實現APIC定時器的周期調整,其中,初始計數寄存器進行了設置,具體設置包括:初始計數寄存器設定公式:計數值=APIC定時器周期×CPU外頻×時間單位/1000,往地址0xFEE00380寫入計數值,設置初始計數寄存器。

其中,加載方式和驅動應用程序接口靠Windows操作系統提供。

圖2示出了Windows操作系統環境下可調速定時器的實現方法的軟件架構示意圖,該軟件架構包括兩個模塊:內核驅動部分和用戶接口部分。內核驅動部分通過Windows驅動方式加載,負責定時器時間維護與任務隊列維護。用戶接口部分,負責實現定時器調速功能和相關時間函數接口。

利用處理器的APIC定時器產生高精度時鐘信號,觸發實現的調度器,并通過在用戶態接口把時間輸入內核,動態修改初始計數寄存器數值,在Windows操作系統下實現了一個高精度可調速的定時器。經測試,定時器精度可以達到微秒級,滿足大多數Windows系統定時要求。同時定時器實現了0.001倍速到10倍速的速率調整功能,滿足應用程序對定時器速率調整的需求。

其中,內核態驅動部分實施如下:

1、內核態接口封裝

Windows下時間相關操作,例如任務睡眠,必然涉及到線程的掛起和恢復操作。Windows本身并沒有直接對外提供內核態的上述API,需要手動查找掛起函數NtSuspendThread和恢復函數NtResumeThread函數地址供調度器使用。

因為Windows用戶態函數通過系統服務描述符表(System Service Descriptor Table)對應到內核態函數。利用已知Windows內核態函數特征碼,搜索系統內存指令,即可獲取到系統內核態函數操作地址。獲取到該入口地址后根據系統函數原型,利用內聯匯編進行調用,即可完成內核態API的封裝。

系統服務描述符表,將ring 3用戶態的Win32 API和ring 0內核態的API聯系起來,是一個地址索引表。每一個用戶態的Win32 API都對應一個特定的服務號,這個服務號作為用戶態Win32 API所對應內核態API相對于地址索引基地址的偏移量,如圖7所示。

在Windows 7 SP1 x86環境下,系統掛起函數NtSuspendThread和恢復函數NtResumeThread的服務號分別是0x16f和0x130,掛起函數的特征碼是0xe8,0x66,0x00,恢復函數特征碼是0xe8,0x92,0x06。

2、調度器實現

在定時器中,時間維護和任務隊列維護由調度器完成,利用APIC Timer產生高精度時鐘信號中斷插入DPC延遲過程調用(Deferred Procedure Call)來觸發調度器。

調度器實現如下:

1)通過用戶態接口將需要周期性喚醒的任務的TCB(Thread Control Block)插入讓渡隊列Yield_List并計算任務喚醒時間

2)系統時間SystemTime增加APIC周期Time。

3)遍歷讓渡隊列Yield_List,一旦發現存在任務就通過之前獲取掛起函數地址掛起該任務,并將該任務TCB插入Waiting_List.

4)遍歷等待隊列Waiting_List檢查是否有任務已經到達喚醒時間。如果到達釋放時間,就將該任務TCB從Waiting_List中刪除并插入Ready_List。

5)遍歷就緒隊列Ready_List檢查是否有任務需要喚醒,一旦隊列中存在任務,就通過之前獲取的恢復線程函數地址將該任務喚醒,過程如圖6所示。

3、APIC Timer周期設置:

在定時器中,APIC定時器(APIC Timer)負責產生高精度的時鐘信號。

Local APIC含有4個用于產生時鐘中斷的寄存器:

1)分頻寄存器(divide configuration register)

2)初始計數寄存器(initial count register)

3)當前計數寄存器(current count register)

4)本地向量表寄存器(LVT register)

設置APIC timer步驟如下:

1)分頻寄存器用來表示當前系統時間基準和系統總線的倍數關系,首先將往地址0xFEE003E0寫入0xB,將分頻寄存器設置為1。

a)APIC Timer初始計數寄存器設定公式如下:

計數值Value=APIC Timer周期Time×CPU外頻Frequency×時間單位Type/1000。

2)往地址0xFEE00380寫入Value,設置初始計數寄存器。

3)計數器模式可以通過本地向量表寄存器設置為單次模式或者周期模式,此處設置為周期模式。在周期模式下,當前計數寄存器自動從初始計數寄存器載入數值,然后以總線頻率開始遞減,當計數達到0時,觸發本地向量表寄存器中存儲的中斷向量并根據中斷向量從中斷向量表中調用中斷處理函數,然后再次載入初始計數寄存器中數值。往地址0xFEE00320寫入0x300e2,使其指向對應中斷處理函數并設置為周期模式。步驟如圖4所示。

用戶接口部分實施如下:

用戶接口實現

在高精度可調速定時器中,用戶接口實現調速功能、授時功能和任務睡眠功能。

1)調速功能

調速功能如下:時間速率控制和定時器時間凍結、解凍功能。

1)時間速率控制實現:

a)往地址0xFEE00380中寫入利用公式計算所得Value即可實現1倍速。

b)往0xFEE00380中寫入0.1*Value即可實現10倍速,10*Value即可實現0.1倍速。

2)凍結功能實現:保存地址0xFEE00380中數據并往地址0xFEE00380寫入0,設置初始計數寄存器為0。

3)解凍功能實現:往地址0xFEE00380寫入凍結時保存的數值,程序如圖3所示。

2)時間相關函數

1)授時功能實現:

a)通過CreateFile函數加載驅動。

b)通過DeviceIoControl函數或者共享內存獲取調度器中的SystemTime。

c)返回獲取的SystimeTime。

2)任務睡眠功能實現如下:

a)獲取當前線程ThreadId作為后續掛起、喚醒操作操作對象。

b)計算任務釋放時間ReleaseTime=定時器系統時間SystemTime+睡眠時間SleepTime。

c)將當前任務TCB插入Yield_List隊列。

圖5示出了APIC定時器高精度特性實現流程圖

其高精度特性通過以下步驟實現:

1)設置APIC定時器:設置初始計數寄存器、分頻寄存器和本地向量表寄存器,使其能產生微秒級的時鐘信號供調度器使用;

2)內核態函數接口封裝:借助于系統服務描述符表,利用已知的Windows接口特征碼,搜索系統內存指令,獲取調度器所需的函數地址,并根據系統函數原型,利用內聯匯編進行調用,供調度器使用;

3)實現調度器:利用上一步所封裝的內核態函數接口,完成調度器的編寫,在調度器內維護定時器時間和任務隊列。

這里說明的模塊數量和處理規模是用來簡化本發明的說明的。對本發明的Windows操作系統環境下可調速定時器的實現方法的應用、修改和變化對本領域的技術人員來說是顯而易見的。

如上所述,根據本發明,通過Windows驅動的方式,利用APIC Timer實現高精度可調速的定時器。定時器提供一組用戶態接口,開發人員在需要調試軟件時調用定時器所提供的接口即可,利用APIC Timer設備,產生百微秒級的時鐘信號,實現了最高精度為100微秒的高精度定時器;通過在運行時修改APIC Timer中初始計數寄存器(initial count register)中的數值,完成對定時器時間間隔的動態調整,改變定時器時間間隔與真實系統時間跨度之間的比例關系,實現定時器的可調速功能,以解決現有的Windows系統定時器不可調速的問題,解決系統定時器功能固定、速率單一的問題,滿足Windows程序在不同環境下的應用需求。

盡管本發明的實施方案已公開如上,但其并不僅僅限于說明書和實施方式中所列運用。它完全可以被適用于各種適合本發明的領域。對于熟悉本領域的人員而言,可容易地實現另外的修改。因此在不背離權利要求及等同范圍所限定的一般概念下,本發明并不限于特定的細節和這里示出與描述的圖例。

當前第1頁1 2 3 
網友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
主站蜘蛛池模板: 洮南市| 虞城县| 当阳市| 庆云县| 彰化县| 金秀| 沈丘县| 绥化市| 汉源县| 崇明县| 绥江县| 镶黄旗| 阳西县| 绥芬河市| 麦盖提县| 宁德市| 普定县| 临城县| 阳新县| 邯郸市| 永安市| 雷州市| 福海县| 巴林右旗| 莲花县| 永福县| 凤山县| 白玉县| 喀喇| 繁峙县| 青冈县| 乌拉特中旗| 且末县| 额济纳旗| 日照市| 兴安盟| 东乡| 中卫市| 澳门| 九龙城区| 鄂托克前旗|