專利名稱:定時方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及嵌入式軟件開發(fā)領(lǐng)域,尤其是涉及該領(lǐng)域中的定時方法和裝置。
背景技術(shù):
在軟件開發(fā)過程中,很多軟件模塊需要用到定時器?,F(xiàn)有技術(shù)中存在多種不同的 操作系統(tǒng),且每個操作系統(tǒng)中的定時器均依賴于本系統(tǒng)的信號觸發(fā)及處理,并且,對于依賴 本系統(tǒng)的定時器而言,每個進(jìn)程中能夠使用的定時器數(shù)目是固定的,因此,定時器除受信號 的限制外,還受到進(jìn)程中定時器數(shù)目的限制。例如,在Linux操作系統(tǒng)中,主要使用三種定 時器,分別是alarm ()、P0SIX:XSI間隔定時器setitimer (),POSIX TMR間隔定時器timer_ create (),這些定時器都建立在Linux操作系統(tǒng)的信號觸發(fā)、處理的基礎(chǔ)上,并且有定時器 個數(shù)和信號的限制。
發(fā)明內(nèi)容
本發(fā)明提供一種定時方法,用以解決現(xiàn)有技術(shù)中存在定時器受到所在操作系統(tǒng)的 信號的限制,以及每個進(jìn)程中定時器數(shù)目的限制的問題,包括接收軟件模塊發(fā)送的定時器調(diào)用請求;為所述軟件模塊分配空閑的定時器,并利用被分配的定時器進(jìn)行計時;當(dāng)所述被分配的定時器的計時時間到達(dá)對應(yīng)的預(yù)設(shè)定時時間時,向所述軟件模塊 發(fā)送定時器到時消息。較佳的,向所述軟件模塊發(fā)送定時器到時消息之后,還包括將所述被分配的定時 器恢復(fù)為空閑狀態(tài),并釋放所述被分配的定時器占用的資源。較佳的,所述利用被分配的定時器進(jìn)行計時,包括獲取所述被分配的定時器的預(yù)設(shè)定時時間,并確定時鐘滴答數(shù)組中游標(biāo)當(dāng)前指向 的第一成員,所述成員代表設(shè)定的時間長度值;根據(jù)所述預(yù)設(shè)定時時間,估測所述被分配的定時器的計時時間到達(dá)所述預(yù)設(shè)定時 時間時所述游標(biāo)指向的第二成員,并將所述被分配的定時器掛載到所述第二成員下;根據(jù)所述預(yù)設(shè)定時時間,預(yù)測所述游標(biāo)遍歷所述時鐘滴答數(shù)組的次數(shù)N,其中,N 等于所述預(yù)設(shè)定時時間與所述時鐘滴答數(shù)組的總時長的比值向下取整;移動所述游標(biāo)進(jìn)行計時,當(dāng)所述游標(biāo)第N+1次移動到指向第二成員時,所述被分 配的定時器的計時時間到達(dá)所述預(yù)設(shè)定時時間。較佳的,還包括當(dāng)所述時鐘滴答數(shù)組的一個成員下掛載至少一個定時器時,采用雙向鏈表方式將該成員下的至少一個定時器的標(biāo)識串聯(lián);在所述雙向鏈表中,每個定時器的標(biāo)識對應(yīng)一前置變量WPreNode和一后置變量 wNextNode,其中,所述wPreNode用于指向該標(biāo)識標(biāo)志的定時器的前一個定時器的標(biāo)識,所 述WNextNode用于指向該標(biāo)識標(biāo)志的定時器的后一個定時器的標(biāo)識。
較佳的,還包括在已掛載至少一個定時器的成員下增加定時器時,將增加的定時器的標(biāo)識放到所 述雙向鏈表的表頭,利用所述增加的定時器的標(biāo)識的后置變量鏈接所述雙向鏈表的原表頭 對應(yīng)的定時器的標(biāo)識。較佳的,所述為所述軟件模塊分配定時器,包括在空閑結(jié)點(diǎn)表中查詢空閑的定時器在定時器共享內(nèi)存中的位置信息,所述定時器 共享內(nèi)存按數(shù)組方式存儲已被分配的定時器和空閑的定時器,每個定時器是其所在的存儲 數(shù)組的一個成員;
根據(jù)查詢到的位置信息在定時器共享內(nèi)存中確定對應(yīng)的空閑的定時器;將確定的空閑的定時器分配給所述軟件模塊。較佳的,所述空閑結(jié)點(diǎn)表具有指向所述空閑結(jié)點(diǎn)表表頭的頭變量wFreeHead和指 向所述空閑結(jié)點(diǎn)表表尾的尾變量wFreeTail,且當(dāng)所述wFreeHead和所述wFreeTail指向的 成員的數(shù)值均大于所述存儲數(shù)組的最大值時,設(shè)置所述WFreeHead和所述wFreeTail返回 并指向所述存儲數(shù)組的第一位成員;為所述軟件模塊分配一個空閑的定時器之后,設(shè)置所述wFreeHead在所述存儲數(shù) 組中后移一位;釋放一個被分配的定時器占用的資源之后,設(shè)置所述WFreeTail在所述存儲數(shù)組 中后移一位。較佳的,還包括當(dāng)所述被分配的定時器的計時時間未到達(dá)對應(yīng)的預(yù)設(shè)定時時間時,接收定時器取 消請求,通知被分配的定時器停止計時。本發(fā)明還提供了一種定時裝置,用以解決現(xiàn)有技術(shù)中存在定時器受到所在操作系 統(tǒng)的信號的限制,以及每個進(jìn)程中定時器數(shù)目的限制的問題,包括接收模塊,用于接收軟件模塊發(fā)送的定時器調(diào)用請求;分配模塊,用于為所述軟件模塊分配空閑的定時器,并利用被分配的定時器進(jìn)行 計時;發(fā)送模塊,用于當(dāng)所述被分配的定時器的計時時間到達(dá)對應(yīng)的預(yù)設(shè)定時時間時, 向所述軟件模塊發(fā)送定時器到時消息。較佳的,還包括釋放模塊,用于向所述軟件模塊發(fā)送定時器到時消息之后,將所述被分配的定時 器恢復(fù)為空閑狀態(tài),并釋放所述被分配的定時器占用的資源。較佳的,所述分配模塊包括獲取子模塊,用于獲取所述被分配的定時器的預(yù)設(shè)定時時間,并確定時鐘滴答數(shù) 組中游標(biāo)當(dāng)前指向的第一成員,所述成員代表設(shè)定的時間長度值;估測子模塊,用于估測所述被分配的定時器的計時時間到達(dá)所述預(yù)設(shè)定時時間時 所述游標(biāo)指向的第二成員,并將所述被分配的定時器掛載到所述第二成員下;預(yù)測子模塊,用于根據(jù)所述預(yù)設(shè)定時時間,預(yù)測所述游標(biāo)遍歷所述時鐘滴答數(shù)組 的次數(shù)N,其中,N為> 0的整數(shù),且N等于所述預(yù)設(shè)定時時間與所述時鐘滴答數(shù)組的總時長 的比值向下取整;
計時子模塊,用于移動所述游標(biāo)進(jìn)行計時,當(dāng)所述游標(biāo)第N+1次移動到指向第二 成員時,所述被分配的定時器的計時時間到達(dá)所述預(yù)設(shè)定時時間。較佳的,所述分配模塊還包括串聯(lián)子模塊,用于當(dāng)所述時鐘滴答數(shù)組的一個成員下掛載至少一個定時器時,采 用雙向鏈表方式將該成員下的至少一個定時器的標(biāo)識串聯(lián);在所述雙向鏈表中,每個定時 器的標(biāo)識對應(yīng)一前置變量wPreNode和一后置變量wNextNode,其中,所述wPreNode用于指 向該標(biāo)識標(biāo)志的定時器的前一個定時器的標(biāo)識,所述WNextNode用于指向該標(biāo)識標(biāo)志的定 時器的后一個定時器的標(biāo)識。較佳的,所述分配模塊包括查詢子模塊,用于在空閑結(jié)點(diǎn)表中查詢空閑的定時器在定時器共享內(nèi)存中的位置 信息,所述定時器共享內(nèi)存按數(shù)組方式存儲已被分配的定時器和空閑的定時器,每個定時 器是其所在的存儲數(shù)組的一個成員;確定子模塊,用于根據(jù)查詢到的位置信息在定時器共享內(nèi)存中確定對應(yīng)的空閑的 定時器;分配子模塊,用于將確定的空閑的定時器分配給所述軟件模塊。采用本發(fā)明,根據(jù)軟件模塊的定時器調(diào)用請求分配空閑的定時器,而不是使用所 在操作系統(tǒng)自帶的定時器進(jìn)行計時,當(dāng)被分配的定時器的計時時間到達(dá)對應(yīng)的預(yù)設(shè)定時時 間時,向軟件模塊發(fā)送定時器到時消息,能夠避免了操作系統(tǒng)自帶定時器依賴于本系統(tǒng)的 信號觸發(fā)及處理、受到本系統(tǒng)信號的限制,以及受到進(jìn)程中定時器數(shù)目的限制,以及,不影 響軟件模塊自身的信號觸發(fā)及處理,也不會影響軟件模塊正在處理的進(jìn)程,避免進(jìn)程執(zhí)行 過程中信號突然中止的問題。
圖1為本發(fā)明實(shí)施例提供的定時方法的流程圖;圖2為本發(fā)明實(shí)施例提供的利用被分配的定時器進(jìn)行計時的流程圖;圖3為本發(fā)明實(shí)施例提供的時鐘滴答數(shù)組的結(jié)構(gòu)示意圖;圖4為本發(fā)明實(shí)施例提供的定時器利用時鐘滴答數(shù)組進(jìn)行計時的示意圖;圖5為本發(fā)明實(shí)施例提供的雙向鏈表的結(jié)構(gòu)示意圖;圖6為本發(fā)明實(shí)施例提供的定時器共享內(nèi)存的結(jié)構(gòu)示意圖;圖7為本發(fā)明實(shí)施例提供的空閑結(jié)點(diǎn)表的結(jié)構(gòu)示意圖;圖8為本發(fā)明實(shí)施例提供的定時器計時及到時后的處理流程圖;圖9為本發(fā)明實(shí)施例提供的利用空閑結(jié)點(diǎn)表管理空閑的定時器的流程圖;圖10為本發(fā)明實(shí)施例提供的定時器到達(dá)預(yù)設(shè)定時時間或者被取消后的處理流程 圖;圖11為本發(fā)明實(shí)施例提供的第一種定時裝置的結(jié)構(gòu)示意圖;圖12為本發(fā)明實(shí)施例提供的第二種定時裝置的結(jié)構(gòu)示意圖;圖13為本發(fā)明實(shí)施例提供的第一種分配模塊的結(jié)構(gòu)示意圖;圖14為本發(fā)明實(shí)施例提供的第二種分配模塊的結(jié)構(gòu)示意圖;圖15為本發(fā)明實(shí)施例提供的第三種分配模塊的結(jié)構(gòu)示意圖16為本發(fā)明實(shí)施例提供的第四種分配模塊的結(jié)構(gòu)示意圖;圖17為本發(fā)明實(shí)施例提供的查詢子模塊的結(jié)構(gòu)示意圖;圖18為本發(fā)明實(shí)施例提供的第三種定時裝置的結(jié)構(gòu)示意圖。
具體實(shí)施例方式為解決現(xiàn)有技術(shù)提到的,定時器依賴于所在操作系統(tǒng),受到所在操作系統(tǒng)的信號 限制,以及受到每個進(jìn)程中定時器數(shù)目的限制的問題,本發(fā)明實(shí)施例提供了一種定時方法, 具體處理流程如圖1所示,包括步驟101、接收軟件模塊發(fā)送的定時器調(diào)用請求;步驟102、為軟件模塊分配空閑的定時器,并利用被分配的定時器進(jìn)行計時;步驟103、當(dāng)被分配的定時器的計時時間到達(dá)對應(yīng)的預(yù)設(shè)定時時間時,向軟件模塊 發(fā)送定時器到時消息。在本發(fā)明實(shí)施例中,步驟103在實(shí)施之后,被分配的定時器停止計時,并將被分配 的定時器恢復(fù)為空閑狀態(tài),釋放其占用的資源,以便利用釋放的資源為其他軟件模塊分配 定時器。在一個實(shí)施例中,如圖1所示流程,步驟102在實(shí)施時,利用被分配的定時器進(jìn)行 計時,計時方式可以有多種,例如,利用鏈表方式進(jìn)行計時,也可以利用數(shù)組方式進(jìn)行計時, 其中,鏈表或數(shù)組的任意兩個成員之間可代表設(shè)定的時間長度值?,F(xiàn)以時鐘滴答數(shù)組為例 進(jìn)行說明,此時,利用被分配的定時器進(jìn)行計時的具體處理流程如圖2所示,包括步驟201、獲取被分配的定時器的預(yù)設(shè)定時時間,并確定時鐘滴答數(shù)組中游標(biāo)當(dāng)前 指向的第一成員;步驟202、根據(jù)預(yù)設(shè)定時時間,估測被分配的定時器的計時時間到達(dá)預(yù)設(shè)定時時間 時所述游標(biāo)指向的第二成員,并將被分配的定時器掛載到第二成員下;步驟203、根據(jù)預(yù)設(shè)定時時間,預(yù)測游標(biāo)遍歷時鐘滴答數(shù)組的次數(shù)N,其中,N等于 預(yù)設(shè)定時時間與時鐘滴答數(shù)組的總時長的比值向下取整;步驟204、移動游標(biāo)進(jìn)行計時,當(dāng)游標(biāo)第N+1次移動到指向第二成員時,被分配的 定時器的計時時間到達(dá)預(yù)設(shè)定時時間。在本例中,時鐘滴答數(shù)組的大小T IMER_MAX_TMCB_NUM是可以配置的,當(dāng)然, TIMER_MAX_TMCB_NUM只能夠取彡0的整數(shù),例如,TIMER_MAX_TMCB_NUM可以取值為30000。 實(shí)施時,時鐘滴答數(shù)組中每個成員代表一個已預(yù)先設(shè)定的時間段,各個成員的位置序號按 順序依次為0-(TIMER_MAX_TMCB_NUM_l),在時鐘滴答數(shù)組中有一個游標(biāo)wScanPos指向數(shù) 組中的某個成員,代表當(dāng)前所處的時間,具體結(jié)構(gòu)如圖3所示。當(dāng)計時的時間到達(dá)游標(biāo)當(dāng)前 所指成員代表的時間段時,游標(biāo)指向該成員的下一個成員。游標(biāo)每走一步的時間是通過延 時函數(shù)來實(shí)現(xiàn),例如在Iinux操作系統(tǒng)中使用usle印()函數(shù)時間。通常將被被分配的定時器掛載到其到時時刻對應(yīng)的時鐘滴答數(shù)組成員下,當(dāng)游標(biāo) 移動到指向該成員時,就代表了該定時器到時。實(shí)施時,每個成員代表的已設(shè)定的時間段 USP_OSS_TIMER_SLEEP (后文可簡稱TIMER_SLEEP)可以是相同的,也可以是不同的,根據(jù) 實(shí)際情況而定,例如,在時鐘滴答數(shù)組中,每個成員都代表10ms,也可以設(shè)置為第一個成員 代表10ms,第二個成員代表5ms,第三個成員代表7ms,等等?,F(xiàn)以一個具體實(shí)施例進(jìn)行說明,在本例中,TIMER_MAX_TMCB_NUM取值30000,時鐘滴答數(shù)組中每個成員代表10ms,為軟 件模塊分配了一個預(yù)設(shè)定時時間為30ms的定時器,游標(biāo)需要前移3個成員時,定時器才會 超時,這時,向分配了該定時器的軟件模塊發(fā)送消息,告知被分配的定時器已經(jīng)到時,如圖4 所示,游標(biāo)當(dāng)前位置指向成員7,定時器的預(yù)設(shè)定時時間為30ms,每個成員代表10ms,游標(biāo) 需要移動并指向成員9時才到時,因此,將預(yù)設(shè)定時時間為30ms的定時器掛載在成員9下。 注意,游標(biāo)指向成員7時,成員7所代表的IOms時間段并沒有被納入計時,在計時時應(yīng)先計 成員7的10ms。對于大于10X30000ms的定時時間,游標(biāo)會回到時鐘滴答數(shù)組開頭,循環(huán)往
復(fù)。若被分配的定時器的預(yù)設(shè)定時時間大于時鐘滴答數(shù)組的總時長時,除確定被分 配的定時器的計時時間到達(dá)對應(yīng)的預(yù)設(shè)定時時間,游標(biāo)在時鐘滴答數(shù)組中指向的成員,還 需要確定被分配的定時器在時鐘滴答數(shù)組上循環(huán)的次數(shù)。例如,時鐘滴答數(shù)組的總時長為 10 X 30000ms,為軟件模塊分配一個定時器A,定時的時間為10 X 60000ms,游標(biāo)當(dāng)前指向成 員200,那么A位置的計算過程如下到時時游標(biāo)應(yīng)移動的成員數(shù)dwDly = 10*60000/10 ;到時時游標(biāo)對應(yīng)的成員dwTime = 200+dwDly-l ;在時鐘滴答數(shù)組上的循環(huán)次數(shù)dwTimerCounter = (dwDly-1)/30000 ;偏移量 wPos = dwTime % 30000 ;根據(jù)上述數(shù)據(jù)可以計算出dwTimerCounter = 1,wPos = 199,所以定時器A應(yīng)掛 載在時鐘滴答數(shù)組中成員199下,游標(biāo)第二次移動到指向成員199,定時器A到達(dá)預(yù)設(shè)定時 時間,計時結(jié)束。實(shí)施時,游標(biāo)指向的成員下可能掛載多個定時器,此時,只需要將游標(biāo)指向的成員 下掛載的到時的定時器通知使用這些定時器的軟件模塊,未到時的不需要通知。實(shí)施時,為方便管理,當(dāng)時鐘滴答數(shù)組的一個成員下掛載至少一個定時器時,需 要采用某些方式對至少一個定時器進(jìn)行處理,例如,一種較佳的實(shí)施方式為采用雙向鏈表 方式將該成員下的至少一個定時器串聯(lián),在雙向鏈表中,每個定時器的標(biāo)識對應(yīng)一前置變 量wPreNode和一后置變量wNextNode,其中,wPreNode用于指向該標(biāo)識標(biāo)志的定時器的 前一個定時器的標(biāo)識,WNextNode用于指向該標(biāo)識標(biāo)志的定時器的后一個定時器的標(biāo)識, 具體結(jié)構(gòu)如圖5所示,成員9下掛載著定時器1與定時器2,兩者的標(biāo)識通過wPreNode和 WNextNode鏈接成雙向鏈表。一種較優(yōu)的處理方式為在已掛載至少一個定時器的成員下 增加定時器時,將增加的定時器的標(biāo)識放到雙向鏈表的表頭,利用增加的定時器的標(biāo)識的 后置變量鏈接雙向鏈表的原表頭對應(yīng)的定時器。當(dāng)然,將增加的定時器的標(biāo)識放在雙向鏈 表的表頭是一種較優(yōu)的實(shí)施方式,在實(shí)際應(yīng)用中,也可以將增加的定時器的標(biāo)識放在雙向 鏈表的表尾或其他位置,根據(jù)具體情況而定。在一個實(shí)施例中,如圖1所示流程,步驟101在實(shí)施之后,步驟102在實(shí)施之前,還 包括查詢空閑的定時器在定時器共享內(nèi)存中的位置,定時器共享內(nèi)存按數(shù)組方式存儲已被 分配的定時器和空閑的定時器,每個定時器是其所在的存儲數(shù)組的一個成員,其序號依次
為0、1、2、.......(TIMER_MAX_TIMERS-1),具體結(jié)構(gòu)如圖6所示。一種較優(yōu)的實(shí)施方式是
利用空閑結(jié)點(diǎn)表,將空閑的定時器在定時器共享內(nèi)存中的位置均記錄在空閑結(jié)點(diǎn)表中,具 體處理流程如下在空閑結(jié)點(diǎn)表中查詢空閑的定時器在定時器共享內(nèi)存中的位置信息,根據(jù)查詢到的位置信息在定時器共享內(nèi)存中確定對應(yīng)的空閑的定時器,將確定的空閑的定時 器分配給軟件模塊。為方便空閑結(jié)點(diǎn)表中進(jìn)行查詢分配等相關(guān)操作,空閑結(jié)點(diǎn)表具有指向空閑結(jié)點(diǎn)表 表頭的頭變量WFreeHead和空閑結(jié)點(diǎn)表表尾的尾變量wFreeTail,在應(yīng)用過程中,在為軟 件模塊分配一個空閑的定時器之后,設(shè)置wFreeHead在存儲數(shù)組中后移一位;釋放一個被 分配的定時器占用的資源之后,設(shè)置WFreeTail在存儲數(shù)組中后移一位。初始時刻,空閑 結(jié)點(diǎn)表中記錄的空閑定時器就是定時器共享內(nèi)存中的所有定時器,此時,WFreeHead = 0, wFreeTail = TIMER_MAX_TIMERS_1,具體結(jié)構(gòu)如圖7所示。實(shí)施過程中,為軟件模塊分配一 個空閑的定時器之后,wFreeHead在存儲數(shù)組中后移一位,釋放一個被分配的定時器占用的 資源之后,wFreeTail在存儲數(shù)組中后移一位。當(dāng)wFreeHead和wFreeTail指向的成員的 數(shù)值大于存儲數(shù)組的最大值TIMER_MAX_TIMERS-1時,wFreeHead和wFreeTail返回并指向 存儲數(shù)組的第一位成員0,即wFreeHead和wFreeTail在空閑結(jié)點(diǎn)表上循環(huán)移動。實(shí)施時,定時器的個數(shù)也是可配置的(用TIMER_MAX_TIMERS表示),一般的情況下 100個定時器已經(jīng)足夠使用了,由于定時器是采用靜態(tài)分配內(nèi)存的,考慮到有的設(shè)備內(nèi)存較 小,可以將定時器個數(shù)配置成較小的定時器個數(shù),這樣就節(jié)省了內(nèi)存空間。在本發(fā)明實(shí)施例提供的定時方法中,當(dāng)被分配的定時器的計時時間未 到達(dá)對應(yīng)的 預(yù)設(shè)定時時間時,接收定時器取消請求,通知被分配的定時器停止計時。即,可以在定時器 沒有到時的情況下取決定時器計時,靈活性高。由于本發(fā)明實(shí)施例提供的定時方法是根據(jù)軟件模塊的定時器調(diào)用請求分配空閑 的定時器,而不是使用所在操作系統(tǒng)自帶的定時器進(jìn)行計時,因此,避免了操作系統(tǒng)自帶定 時器依賴于本系統(tǒng)的信號觸發(fā)及處理、受到本系統(tǒng)信號的限制,以及受到進(jìn)程中定時器數(shù) 目的限制。根據(jù)本發(fā)明實(shí)施例提供的定時方法,掃描時鐘滴答數(shù)組,確定定時器是否到時,以 及到時后的相關(guān)處理的具體處理流程如圖8所示,包括步驟801、延時 TIMER_SLEEP 時間;步驟802、判斷游標(biāo)wScanPos所指時鐘滴答數(shù)組的成員下是否掛載有定時器,若 有,執(zhí)行步驟803,若否,返回步驟801 ;步驟803、搜索該成員下的雙向鏈表中的定時器;步驟804、判斷dwCountTimer是否為0,若是,執(zhí)行步驟805,若否,執(zhí)行步驟809 ;步驟805、定時到時,向使用定時器的軟件模塊發(fā)送消息,通知定時到時;步驟806、釋放該定時器,調(diào)整該成員下的雙向鏈表;步驟807、將該定時器添加到空閑結(jié)點(diǎn)表中;步驟808、判斷是否到達(dá)雙向鏈表的鏈表尾,若是,執(zhí)行步驟801,若否,執(zhí)行步驟 803 ;步驟809、dwCountTimer 減 1,流程結(jié)束。根據(jù)本發(fā)明實(shí)施例提供的定時方法,利用空閑結(jié)點(diǎn)表管理空閑的定時器,其具體 處理流程如圖9所示步驟901、查詢空閑結(jié)點(diǎn)表,確認(rèn)當(dāng)前存在空閑定時器;步驟902、判斷wFreeHead是否等于wFreeTail,若否,執(zhí)行步驟903,若是,執(zhí)行步驟 908 ;步驟903、將空閑結(jié)點(diǎn)表中wFreeHead所指的定時器分配給請求定時器的軟件模塊;步驟904、將分配的定時器標(biāo)識為已用;步驟905、wFreeHead 向后移一位;步驟906、根據(jù)預(yù)定定時時間將分配的定時器掛載在對應(yīng)的時鐘滴答數(shù)組的成員 下;步驟907、調(diào)整該成員下的雙向鏈表,將分配的定時器添加到表頭;步驟908、通知請求定時器的軟件模塊沒有空閑的定時器。根據(jù)本發(fā)明實(shí)施例提供的定時方法,當(dāng)定時器到達(dá)預(yù)設(shè)定時時間或者被取消,具 體處理流程如圖10所示步驟1001、將到達(dá)預(yù)設(shè)定時時間或者被取消的定時器設(shè)置為空閑;步驟1002、修改空閑結(jié)點(diǎn)表,將wFreeTail指向該定時器,在空閑結(jié)點(diǎn)表中后移一 位;步驟1003、調(diào)整該定時器所在的雙向鏈表,將該定時器前后定時器串聯(lián)起來。基于同一發(fā)明構(gòu)思,本發(fā)明實(shí)施例還提供了一種定時裝置,具體結(jié)構(gòu)如圖11所 示,包括接收模塊1101,用于接收軟件模塊發(fā)送的定時器調(diào)用請求;分配模塊1102,用于為軟件模塊分配空閑的定時器,并利用被分配的定時器進(jìn)行 計時;發(fā)送模塊1103,用于當(dāng)被分配的定時器的計時時間到達(dá)對應(yīng)的預(yù)設(shè)定時時間時, 向軟件模塊發(fā)送定時器到時消息。在一個實(shí)施例中,如圖12所示結(jié)構(gòu),定時裝置還可以包括釋放模塊1201,用于向軟件模塊發(fā)送定時器到時消息之后,將被分配的定時器恢 復(fù)為空閑狀態(tài),并釋放被分配的定時器占用的資源。在一個實(shí)施例中,如圖13所示結(jié)構(gòu),分配模塊1102可以包括獲取子模塊1301,用于獲取被分配的定時器的預(yù)設(shè)定時時間,并確定時鐘滴答數(shù) 組中游標(biāo)當(dāng)前指向的第一成員;估測子模塊1302,用于估測被分配的定時器的計時時間到達(dá)預(yù)設(shè)定時時間時游標(biāo) 指向的第二成員,并將被分配的定時器掛載到第二成員下;預(yù)測子模塊1303,用于根據(jù)預(yù)設(shè)定時時間,預(yù)測游標(biāo)遍歷時鐘滴答數(shù)組的次數(shù)N, 其中,0的整數(shù),且N等于預(yù)設(shè)定時時間與時鐘滴答數(shù)組的總時長的比值向下取整;計時子模塊1304,用于移動游標(biāo)進(jìn)行計時,當(dāng)游標(biāo)第N+1次移動到指向第二成員 時,被分配的定時器的計時時間到達(dá)預(yù)設(shè)定時時間。在一個實(shí)施例中,如圖14所示結(jié)構(gòu),分配模塊1102還可以包括串聯(lián)子模塊1401,用于當(dāng)時鐘滴答數(shù)組的一個成員下掛載至少一個定時器時,采 用雙向鏈表方式將該成員下的至少一個定時器的標(biāo)識串聯(lián);在雙向鏈表中,每個定時器的 標(biāo)識對應(yīng)一前置變量wPreNode和一后置變量wNextNode,其中,wPreNode用于指向該標(biāo)識 標(biāo)志的定時器的前一個定時器的標(biāo)識,wNextNode用于指向該標(biāo)識標(biāo)志的定時器的后一個定時器的標(biāo)識。在一個實(shí)施例中,如圖15所示結(jié)構(gòu),分配模塊1102還可以包括增加子模塊1501,用于在已掛載至少一個定時器的成員下增加定時器時,將增加 的定時器的標(biāo)識放到雙向鏈表的表頭,利用增加的定時器的標(biāo)識的后置變量鏈接雙向鏈表 的原表頭對應(yīng)的定時器的標(biāo)識。在一個實(shí)施例中,如圖16所示結(jié)構(gòu),分配模塊1102可以包括查詢子模塊1601,用于在空閑結(jié)點(diǎn)表中查詢空閑的定時器在定時器共享內(nèi)存中的 位置信息,定時器共享內(nèi)存按數(shù)組方式存儲已被分配的定時器和空閑的定時器,每個定時 器是其所在的存儲數(shù)組的一個成員;確定子模塊1602,用于根據(jù)查詢到的位置信息在定時器共享內(nèi)存中確定對應(yīng)的空 閑的定時器;分配子模塊1603,用于將確定的空閑的定時器分配給所述軟件模塊。在一個實(shí)施例中,如圖17所示結(jié)構(gòu),查詢子模塊1601還可以包括設(shè)置單元1701,用于當(dāng)空閑結(jié)點(diǎn)表具有指向空閑結(jié)點(diǎn)表表頭的頭變量wFreeHead 和指向空閑結(jié)點(diǎn)表表尾的尾變量wFreeTai 1,且當(dāng)wFreeHead和所述wFreeTai 1指向的成員 的數(shù)值均大于存儲數(shù)組的最大值時,設(shè)置WFreeHead和所述wFreeTail返回并指向存儲數(shù) 組的第一位成員;第一后移單元1702,用于為軟件模塊分配一個空閑的定時器之后,設(shè)置 wFreeHead在存儲數(shù)組中后移一位;第二后移單元1703,用于釋放一個被分配的定時器占用的資源之后,設(shè)置 wFreeTail在存儲數(shù)組中后移一位。在一個實(shí)施例中,如圖18所示結(jié)構(gòu),定時裝置還可以包括取消模塊1801,用于當(dāng)被分配的定時器的計時時間未到達(dá)對應(yīng)的預(yù)設(shè)定時時間 時,接收定時器取消請求,通知被分配的定時器停止計時。在本發(fā)明實(shí)施例中,根據(jù)軟件模塊的定時器調(diào)用請求分配空閑的定時器,而不是 使用所在操作系統(tǒng)自帶的定時器進(jìn)行計時,當(dāng)被分配的定時器的計時時間到達(dá)對應(yīng)的預(yù)設(shè) 定時時間時,向軟件模塊發(fā)送定時器到時消息,能夠避免了操作系統(tǒng)自帶定時器依賴于本 系統(tǒng)的信號觸發(fā)及處理、受到本系統(tǒng)信號的限制,以及受到進(jìn)程中定時器數(shù)目的限制,以 及,不影響軟件模塊自身的信號觸發(fā)及處理,也不會影響軟件模塊正在處理的進(jìn)程,避免進(jìn) 程執(zhí)行過程中信號突然中止的問題。進(jìn)一步,在當(dāng)被分配的定時器的計時時間未到達(dá)對應(yīng)的預(yù)設(shè)定時時間時,接收定 時器取消請求,通知被分配的定時器停止計時。即,可以在定時器沒有到時的情況下取決定 時器計時,靈活性高。進(jìn)一步,向軟件模塊發(fā)送定時器到時消息之后,釋放被分配的定時器占用的資源, 能夠大幅度地節(jié)省內(nèi)存資源,提高內(nèi)存的利用率。顯然,本領(lǐng)域的技術(shù)人員可以對本發(fā)明進(jìn)行各種改動和變型而不脫離本發(fā)明的精 神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍 之內(nèi),則本發(fā)明也意圖包含這些改動和變型在內(nèi)。
權(quán)利要求
一種定時方法,其特征在于,包括接收軟件模塊發(fā)送的定時器調(diào)用請求;為所述軟件模塊分配空閑的定時器,并利用被分配的定時器進(jìn)行計時;當(dāng)所述被分配的定時器的計時時間到達(dá)對應(yīng)的預(yù)設(shè)定時時間時,向所述軟件模塊發(fā)送定時器到時消息。
2.如權(quán)利要求1所述的方法,其特征在于,向所述軟件模塊發(fā)送定時器到時消息之后, 還包括將所述被分配的定時器恢復(fù)為空閑狀態(tài),并釋放所述被分配的定時器占用的資源。
3.如權(quán)利要求1或2所述的方法,其特征在于,所述利用被分配的定時器進(jìn)行計時,包括獲取所述被分配的定時器的預(yù)設(shè)定時時間,并確定時鐘滴答數(shù)組中游標(biāo)當(dāng)前指向的第 一成員,所述成員代表設(shè)定的時間長度值;根據(jù)所述預(yù)設(shè)定時時間,估測所述被分配的定時器的計時時間到達(dá)所述預(yù)設(shè)定時時間 時所述游標(biāo)指向的第二成員,并將所述被分配的定時器掛載到所述第二成員下;根據(jù)所述預(yù)設(shè)定時時間,預(yù)測所述游標(biāo)遍歷所述時鐘滴答數(shù)組的次數(shù)N,其中,N等于 所述預(yù)設(shè)定時時間與所述時鐘滴答數(shù)組的總時長的比值向下取整;移動所述游標(biāo)進(jìn)行計時,當(dāng)所述游標(biāo)第N+1次移動到指向第二成員時,所述被分配的 定時器的計時時間到達(dá)所述預(yù)設(shè)定時時間。
4.如權(quán)利要求3所述的方法,其特征在于,還包括當(dāng)所述時鐘滴答數(shù)組的一個成員下掛載至少一個定時器時,采用雙向鏈表方式將該成 員下的至少一個定時器的標(biāo)識串聯(lián);在所述雙向鏈表中,每個定時器的標(biāo)識對應(yīng)一前置變量wPreNode和一后置變量 wNextNode,其中,所述wPreNode用于指向該標(biāo)識標(biāo)志的定時器的前一個定時器的標(biāo)識,所 述wNextNode用于指向該標(biāo)識標(biāo)志的定時器的后一個定時器的標(biāo)識。
5.如權(quán)利要求4所述的方法,其特征在于,還包括在已掛載至少一個定時器的成員下增加定時器時,將增加的定時器的標(biāo)識放到所述雙 向鏈表的表頭,利用所述增加的定時器的標(biāo)識的后置變量鏈接所述雙向鏈表的原表頭對應(yīng) 的定時器的標(biāo)識。
6.如權(quán)利要求2所述的方法,其特征在于,所述為所述軟件模塊分配定時器,包括在空閑結(jié)點(diǎn)表中查詢空閑的定時器在定時器共享內(nèi)存中的位置信息,所述定時器共享 內(nèi)存按數(shù)組方式存儲已被分配的定時器和空閑的定時器,每個定時器是其所在的存儲數(shù)組 的一個成員;根據(jù)查詢到的位置信息在定時器共享內(nèi)存中確定對應(yīng)的空閑的定時器; 將確定的空閑的定時器分配給所述軟件模塊。
7.如權(quán)利要求6所述的方法,其特征在于,所述空閑結(jié)點(diǎn)表具有指向所述空閑結(jié)點(diǎn) 表表頭的頭變量wFre eHead和指向所述空閑結(jié)點(diǎn)表表尾的尾變量wFre eTa i 1,且當(dāng)所述 wFreeHead和所述wFreeTail指向的成員的數(shù)值均大于所述存儲數(shù)組的最大值時,設(shè)置所 述wFreeHead和所述wFreeTail返回并指向所述存儲數(shù)組的第一位成員;為所述軟件模塊分配一個空閑的定時器之后,設(shè)置所述wFreeHead在所述存儲數(shù)組中 后移一位;釋放一個被分配的定時器占用的資源之后,設(shè)置所述wFreeTail在所述存儲數(shù)組中后 移一位。
8.如權(quán)利要求1所述的方法,其特征在于,還包括當(dāng)所述被分配的定時器的計時時間未到達(dá)對應(yīng)的預(yù)設(shè)定時時間時,接收定時器取消請 求,通知被分配的定時器停止計時。
9.一種定時裝置,其特征在于,包括接收模塊,用于接收軟件模塊發(fā)送的定時器調(diào)用請求;分配模塊,用于為所述軟件模塊分配空閑的定時器,并利用被分配的定時器進(jìn)行計時;發(fā)送模塊,用于當(dāng)所述被分配的定時器的計時時間到達(dá)對應(yīng)的預(yù)設(shè)定時時間時,向所 述軟件模塊發(fā)送定時器到時消息。
10.如權(quán)利要求9所述的裝置,其特征在于,還包括釋放模塊,用于向所述軟件模塊發(fā)送定時器到時消息之后,將所述被分配的定時器恢 復(fù)為空閑狀態(tài),并釋放所述被分配的定時器占用的資源。
11.如權(quán)利要求9或10所述的裝置,其特征在于,所述分配模塊包括獲取子模塊,用于獲取所述被分配的定時器的預(yù)設(shè)定時時間,并確定時鐘滴答數(shù)組中 游標(biāo)當(dāng)前指向的第一成員,所述成員代表設(shè)定的時間長度值;估測子模塊,用于估測所述被分配的定時器的計時時間到達(dá)所述預(yù)設(shè)定時時間時所述 游標(biāo)指向的第二成員,并將所述被分配的定時器掛載到所述第二成員下;預(yù)測子模塊,用于根據(jù)所述預(yù)設(shè)定時時間,預(yù)測所述游標(biāo)遍歷所述時鐘滴答數(shù)組的次 數(shù)N,其中,N為> 0的整數(shù),且N等于所述預(yù)設(shè)定時時間與所述時鐘滴答數(shù)組的總時長的比 值向下取整;計時子模塊,用于移動所述游標(biāo)進(jìn)行計時,當(dāng)所述游標(biāo)第N+1次移動到指向第二成員 時,所述被分配的定時器的計時時間到達(dá)所述預(yù)設(shè)定時時間。
12.如權(quán)利要求11所述的裝置,其特征在于,所述分配模塊還包括串聯(lián)子模塊,用于當(dāng)所述時鐘滴答數(shù)組的一個成員下掛載至少一個定時器時,采用雙 向鏈表方式將該成員下的至少一個定時器的標(biāo)識串聯(lián);在所述雙向鏈表中,每個定時器的 標(biāo)識對應(yīng)一前置變量wPreNode和一后置變量wNextNode,其中,所述wPreNode用于指向該 標(biāo)識標(biāo)志的定時器的前一個定時器的標(biāo)識,所述wNextNode用于指向該標(biāo)識標(biāo)志的定時器 的后一個定時器的標(biāo)識。
13.如權(quán)利要求10所述的裝置,其特征在于,所述分配模塊包括查詢子模塊,用于在空閑結(jié)點(diǎn)表中查詢空閑的定時器在定時器共享內(nèi)存中的位置信 息,所述定時器共享內(nèi)存按數(shù)組方式存儲已被分配的定時器和空閑的定時器,每個定時器 是其所在的存儲數(shù)組的一個成員;確定子模塊,用于根據(jù)查詢到的位置信息在定時器共享內(nèi)存中確定對應(yīng)的空閑的定時器;分配子模塊,用于將確定的空閑的定時器分配給所述軟件模塊。
全文摘要
本發(fā)明公開了一種定時方法,包括接收軟件模塊發(fā)送的定時器調(diào)用請求;為所述軟件模塊分配空閑的定時器,并利用被分配的定時器進(jìn)行計時;當(dāng)所述被分配的定時器的計時時間到達(dá)對應(yīng)的預(yù)設(shè)定時時間時,向所述軟件模塊發(fā)送定時器到時消息。本發(fā)明還公開了一種定時裝置。采用本發(fā)明可以解決現(xiàn)有技術(shù)中存在定時器受到所在操作系統(tǒng)的信號的限制,以及每個進(jìn)程中定時器數(shù)目的限制的問題。
文檔編號G06F1/04GK101833450SQ201010154109
公開日2010年9月15日 申請日期2010年4月21日 優(yōu)先權(quán)日2010年4月21日
發(fā)明者冷衛(wèi)杰, 徐運(yùn), 管慧娟, 陳杰, 高峰 申請人:中興通訊股份有限公司