專利名稱:無積累誤差和自適應(yīng)定時(shí)器實(shí)現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種在計(jì)算機(jī)中和通信領(lǐng)域?qū)崿F(xiàn)無積累誤差和自適應(yīng)定時(shí)器的實(shí)現(xiàn)方法。
背景技術(shù):
定時(shí)器是用于控制執(zhí)行實(shí)例定期執(zhí)行的,例如在TCP通信中,如果一定時(shí)間內(nèi)沒有收到 回應(yīng),會再次發(fā)起連接請求;在軟件維護(hù)的的MAC (媒質(zhì)接入層)表中,需要維護(hù)表項(xiàng)的老 化時(shí)間, 一般是定時(shí)執(zhí)行減1的操作,減至0時(shí)就將表項(xiàng)刪除。在需要長期進(jìn)行定時(shí)操作的 場合,如協(xié)議編程,如果每次的定時(shí)存在一定的誤差,則經(jīng)過很多次的執(zhí)行之后,可能會積 累起很大的時(shí)間誤差,這些誤差將會影響協(xié)議正確運(yùn)轉(zhuǎn),導(dǎo)致協(xié)議出現(xiàn)很隱晦的問題。而在 通信領(lǐng)域,協(xié)議非常的多,對于無累積誤差的定時(shí)需求是很強(qiáng)烈的。
定時(shí)器的時(shí)鐘源來源于硬件時(shí)鐘中斷,時(shí)鐘中斷每隔一定時(shí)間產(chǎn)生,該時(shí)間間隔為最小 計(jì)時(shí)時(shí)長,也就是定時(shí)器的計(jì)時(shí)精度,每個對硬件時(shí)鐘中斷處理稱為機(jī)器的定時(shí)周期。
現(xiàn)在定時(shí)器的實(shí)現(xiàn)多采用對列的形式實(shí)現(xiàn),時(shí)鐘周期一到,就對定時(shí)對列進(jìn)行減1的操 作,當(dāng)結(jié)果等于0時(shí),就認(rèn)為定時(shí)時(shí)間已到,調(diào)用執(zhí)行函數(shù)執(zhí)行任務(wù)。對于對列的組織形式 有單對列和多對列之分。這種定時(shí)方式對機(jī)器要求較高,如果執(zhí)行函數(shù)的執(zhí)行時(shí)間超過定時(shí) 的周期,將可能會產(chǎn)生-一些問題;而如果因?yàn)閷α旋嫶?,單次遍歷時(shí)間已經(jīng)超過硬件時(shí)鐘中 斷周期的情況下,整個定時(shí)體制的精度都會受到影響。所以應(yīng)該盡量減少時(shí)鐘中斷處理的時(shí) 間,并具有容納單次執(zhí)行時(shí)間過長的能力。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種無積累誤差和自適應(yīng)定時(shí)器實(shí)現(xiàn)方法,以消除定時(shí)器中單次 任務(wù)執(zhí)行耗時(shí)過長的大擾動和積累誤差。
為達(dá)上述目的,本發(fā)明采用如下技術(shù)方案-一種無積累誤差和自適應(yīng)定時(shí)器實(shí)現(xiàn)方法,包括以下歩驟
1) 開始',
2) 獲取當(dāng)前的系統(tǒng)時(shí)間值TO并記錄,作為執(zhí)行實(shí)例開始的初始時(shí)間值,執(zhí)行次數(shù)m清 零;
3) 獲取當(dāng)前系統(tǒng)時(shí)間Tl,將其作為本次執(zhí)行的起始時(shí)間;
4) 執(zhí)行任務(wù),執(zhí)行次數(shù)m增加l;
5) 用執(zhí)行周期T10乘以執(zhí)行次數(shù)m,得到理論執(zhí)行總時(shí)間T4;
6) 用當(dāng)前的系統(tǒng)時(shí)間值T5,減去初始時(shí)間值TO,得到實(shí)際的執(zhí)行總時(shí)間T5;
7) 用理論執(zhí)行總時(shí)間T4減去實(shí)際的執(zhí)行總時(shí)間T5,得到需要休眠的總時(shí)間T6;
8) 如果休眠總時(shí)間大fO,執(zhí)行休眠,休眠時(shí)間結(jié)束后喚醒,然后進(jìn)入步驟9);否則進(jìn) 入歩驟9);
9) 判斷是否需要修改執(zhí)行周期,如果是,則修改執(zhí)行周期,重啟定時(shí)器,返回步驟2);
如果否,則返回歩驟3)。
作為本發(fā)明的一種改進(jìn),在所述歩驟4)之后,歩驟5)之前還包括以下歩驟
獲取當(dāng)前系統(tǒng)時(shí)間T2,減去本次執(zhí)行的起始時(shí)間Tl,得到并記錄本次任務(wù)的執(zhí)行時(shí)間 T3,以用于計(jì)算任務(wù)執(zhí)行的平均耗時(shí)值和CPU負(fù)荷率。
作為本發(fā)明的又一改進(jìn),在所述步驟7)之后,步驟8)之前還包括休眠時(shí)間補(bǔ)償步驟 用需要休眠的總時(shí)間T6減去估算的定時(shí)器本身計(jì)算所需的耗時(shí)量,對休眠時(shí)間進(jìn)行補(bǔ)償。
其中,在所述方法的任一步驟中,如果收到外部中斷或指令,則結(jié)束執(zhí)行。
通過本發(fā)明方法,累積的誤差可以通過類似積分的方式進(jìn)行補(bǔ)償,從而實(shí)現(xiàn)消除累積誤 差的目的,并消除單次的大擾動,且執(zhí)行周期可動態(tài)調(diào)節(jié)。而且只調(diào)用系統(tǒng)的休眠機(jī)制,不 往系統(tǒng)的定時(shí)器對列中加入任何節(jié)點(diǎn),幾乎不增加系統(tǒng)定時(shí)器的負(fù)擔(dān)。同時(shí)任務(wù)一直由一個 進(jìn)程或線程執(zhí)行,而不由定時(shí)器執(zhí)行,任務(wù)之間的交互和同歩都會更加簡單。特別適用于通 信協(xié)議開發(fā)領(lǐng)域中定時(shí)累積誤差和執(zhí)行時(shí)間變化大、但平均值穩(wěn)定的場合。
以下結(jié)合附圖及實(shí)施例進(jìn)一歩說明本發(fā)明。
圖1為本發(fā)明實(shí)施例處理流程圖。
具體實(shí)施例方式
--種無積累誤差和自適應(yīng)定時(shí)器實(shí)現(xiàn)方法,如圖2所示,具體包括以下步驟-
1) 開始;
2) 獲取當(dāng)前的系統(tǒng)時(shí)間值TO并記錄,作為執(zhí)行實(shí)例開始的初始時(shí)間值,執(zhí)行次數(shù)m清零;
3) 獲取當(dāng)前系統(tǒng)時(shí)間T1,將其作為本次執(zhí)行的起始時(shí)間;
4) 執(zhí)行任務(wù),執(zhí)行次數(shù)m增加l;
5) 用執(zhí)行周期T10乘以執(zhí)行次數(shù)m,得到理論執(zhí)行總時(shí)間T4;
6) 用當(dāng)前的系統(tǒng)時(shí)間值T5,減去初始時(shí)間值TO,得到實(shí)際的執(zhí)行總時(shí)間T5;
7) 用理論執(zhí)行總時(shí)間T4減去實(shí)際的執(zhí)行總時(shí)間T5,得到需要休眠的總時(shí)間T6; 用需要休眠的總時(shí)間T6減去估算的定時(shí)器本身計(jì)算所需的耗時(shí)量,對休眠時(shí)間進(jìn)行補(bǔ)償。 該耗時(shí)量與機(jī)器及運(yùn)行的環(huán)境有關(guān),通過對需要休眠的總時(shí)間T6進(jìn)行補(bǔ)償可以獲得更好的精度;
8) 如果休眠總時(shí)間大于0,則執(zhí)行休眠,休眠時(shí)間結(jié)束后喚醒,然后進(jìn)入步驟9);否則直接進(jìn)入步驟10);
9) 判斷是否需要修改執(zhí)行周期,如果是,則修改執(zhí)行周期,重啟定時(shí)器,返回步驟2);如果否,則直接返回歩驟3)。
其中,在上述步驟中,如果收到外部中斷或指令,則結(jié)束執(zhí)行過程。
其中,在所述步驟4)之后,步驟5)之前還包括以下步驟
獲取當(dāng)前系統(tǒng)時(shí)間T2,減去本次執(zhí)行的起始時(shí)間Tl,得到并記錄本次任務(wù)的執(zhí)行時(shí)間T3,以用于計(jì)算任務(wù)執(zhí)行的平均耗時(shí)值和CPU負(fù)荷率;艮P,將每個執(zhí)行周期的執(zhí)行時(shí)間T3 相加再除以總的執(zhí)行次數(shù)就得到了任務(wù)執(zhí)行的平均耗時(shí)值,平均耗時(shí)值與執(zhí)行周期的比值就是定時(shí)器的CPU負(fù)荷率。
上述實(shí)施例的實(shí)現(xiàn)需具備以下兩個條件1、具備讀取系統(tǒng)時(shí)鐘的能力,而且讀取的精度 應(yīng)該盡可能的高,因?yàn)檫@將決定最終的定時(shí)精度;2、操作系統(tǒng)具備對進(jìn)程或線程的休眠和喚醒能力,而且控制的精度越高越好,因?yàn)槠渚纫矔绊懽罱K的定時(shí)精度。以上兩個條件在一般的操作系統(tǒng)和硬件平臺上都能夠提供。
權(quán)利要求
1. 一種無積累誤差和自適應(yīng)定時(shí)器實(shí)現(xiàn)方法,其特征在于包括以下步驟1)開始;2)獲取當(dāng)前的系統(tǒng)時(shí)間值T0并記錄,作為執(zhí)行實(shí)例開始的初始時(shí)間值,執(zhí)行次數(shù)m清零;3)獲取當(dāng)前系統(tǒng)時(shí)間T1,將其作為本次執(zhí)行的起始時(shí)間;4)執(zhí)行任務(wù),執(zhí)行次數(shù)m增加1;5)用執(zhí)行周期T10乘以執(zhí)行次數(shù)m,得到理論執(zhí)行總時(shí)間T4;6)用當(dāng)前的系統(tǒng)時(shí)間值T5,減去初始時(shí)間值T0,得到實(shí)際的執(zhí)行總時(shí)間T5;7)用理論執(zhí)行總時(shí)間T4減去實(shí)際的執(zhí)行總時(shí)間T5,得到需要休眠的總時(shí)間T6;8)如果休眠總時(shí)間大于0,執(zhí)行休眠,休眠時(shí)間結(jié)束后喚醒,然后進(jìn)入步驟9);否則進(jìn)入步驟9);9)判斷是否需要修改執(zhí)行周期,如果是,則修改執(zhí)行周期,重啟定時(shí)器,返回步驟2);如果否,則返回步驟3)。
2、 根據(jù)權(quán)利要求l所述的無積累誤差和自適應(yīng)定時(shí)器實(shí)現(xiàn)方法,其特征在于在所述步驟4) 之后,歩驟5)之前還包括以下歩驟獲取當(dāng)前系統(tǒng)時(shí)間T2,減去本次執(zhí)行的起始時(shí)間Tl,得到并記錄本次任務(wù)的執(zhí)行時(shí)間T3, 以用于計(jì)算任務(wù)執(zhí)行的平均耗時(shí)值和CPU負(fù)荷率。
3、 根據(jù)權(quán)利要求1或2所述的無積累誤差和自適應(yīng)定時(shí)器實(shí)現(xiàn)方法,其特征在于在所述步驟7)之后,歩驟8)之前還包括以下一休眠時(shí)間補(bǔ)償步驟用需要休眠的總時(shí)間T6減去估算的定時(shí)器本身計(jì)算所需的耗時(shí)量,對休眠時(shí)間進(jìn)行補(bǔ)償。
4、 根據(jù)權(quán)利要求1或2所述的無積累誤差和自適應(yīng)定時(shí)器實(shí)現(xiàn)方法,其特征在于在所述方 法的任一歩驟中,如果收到外部中斷或指令,則結(jié)束執(zhí)行。
全文摘要
一種無積累誤差和自適應(yīng)定時(shí)器實(shí)現(xiàn)方法,包括獲取當(dāng)前的系統(tǒng)時(shí)間值T0并記錄,作為執(zhí)行實(shí)例開始的初始時(shí)間值,執(zhí)行次數(shù)m清零;獲取當(dāng)前系統(tǒng)時(shí)間T1,將其作為本次執(zhí)行的起始時(shí)間;執(zhí)行任務(wù),執(zhí)行次數(shù)m增加1;用執(zhí)行周期T10乘以執(zhí)行次數(shù)m,得到理論執(zhí)行總時(shí)間T4;用當(dāng)前的系統(tǒng)時(shí)間值T5,減去初始時(shí)間值T0,得到實(shí)際的執(zhí)行總時(shí)間T5;用理論執(zhí)行總時(shí)間T4減去實(shí)際的執(zhí)行總時(shí)間T5,得到需要休眠的總時(shí)間T6;如果休眠總時(shí)間大于0,執(zhí)行休眠,休眠時(shí)間結(jié)束后喚醒,然后判斷是否需要修改執(zhí)行周期,如果是,則修改執(zhí)行周期,重啟定時(shí)器。本發(fā)明可以通過類似積分的方式進(jìn)行補(bǔ)償,從而實(shí)現(xiàn)消除累積誤差的目的,并消除單次的大擾動,且執(zhí)行周期可動態(tài)調(diào)節(jié)。
文檔編號G06F9/46GK101206584SQ200610147438
公開日2008年6月25日 申請日期2006年12月18日 優(yōu)先權(quán)日2006年12月18日
發(fā)明者剛 孫, 晏春平 申請人:上海未來寬帶技術(shù)及應(yīng)用工程研究中心有限公司