專利名稱:嵌入式實(shí)時(shí)操作系統(tǒng)高效遍歷的定時(shí)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,特別涉及計(jì)算機(jī)領(lǐng)域中的嵌入式實(shí)時(shí)操作系統(tǒng)中的定時(shí)器方法。
背景技術(shù):
嵌入式實(shí)時(shí)操作系統(tǒng)一般由任務(wù)調(diào)度管理、時(shí)間管理、任務(wù)同步和通信、內(nèi)存管理等幾部分組成。由于實(shí)時(shí)操作系統(tǒng)對時(shí)序的偏差依賴型很強(qiáng),因此定時(shí)器作為操作系統(tǒng)時(shí)間管理的核心就顯得很重要。總之,定時(shí)器是整個(gè)實(shí)時(shí)系統(tǒng)的一個(gè)關(guān)鍵所在,設(shè)計(jì)一個(gè)符合系統(tǒng)需求、且高效的定時(shí)器算法是非常有必要的。
定時(shí)器是基于硬件的時(shí)鐘中斷的,硬件時(shí)鐘每隔一定時(shí)間會產(chǎn)生一個(gè)硬件時(shí)鐘中斷,該時(shí)間間隔為系統(tǒng)的最小計(jì)時(shí)單位。在嵌入式實(shí)時(shí)操作系統(tǒng)中,任務(wù)會要求系統(tǒng)在一定時(shí)間間隔后對任務(wù)報(bào)警并通過這種方式來處理周期性事務(wù),而系統(tǒng)則根據(jù)時(shí)鐘中斷發(fā)生的次數(shù)來計(jì)算時(shí)間間隔,這就是嵌入式實(shí)時(shí)操作系統(tǒng)中的定時(shí)器功能。顯然定時(shí)器是和硬件時(shí)鐘中斷關(guān)聯(lián)起來。然而,硬件時(shí)鐘的個(gè)數(shù)是有限的(往往只有一個(gè)),如何利用有限的硬件中斷源有效滿足大量的任務(wù)定時(shí)需求,成為嵌入式實(shí)時(shí)操作系統(tǒng)的核心內(nèi)容之一。
目前定時(shí)器的計(jì)時(shí)方法主要有三種一種方法是當(dāng)每個(gè)計(jì)時(shí)周期到達(dá)時(shí),先將所有定時(shí)器的計(jì)時(shí)數(shù)減1,然后判斷結(jié)果是否為0,如果為0,則表示計(jì)時(shí)時(shí)間已到并進(jìn)行報(bào)時(shí)處理,否則繼續(xù)進(jìn)行計(jì)時(shí)操作,這種方法稱為簡單計(jì)時(shí)法。
另一種方法是多隊(duì)列計(jì)時(shí)法。首先根據(jù)系統(tǒng)定時(shí)器應(yīng)用特點(diǎn),將定時(shí)器劃分成不同時(shí)長的隊(duì)列,目的在于減少每次參與計(jì)數(shù)的定時(shí)器個(gè)數(shù)。在設(shè)定定時(shí)器時(shí),將計(jì)時(shí)時(shí)長分解為毫秒位、個(gè)位、十位、百位、千位等幾個(gè)部分,再把定時(shí)器插入到最大的不為0的位所在的隊(duì)列,計(jì)時(shí)就從該隊(duì)列開始,完成后逐一計(jì)以下位,直至計(jì)時(shí)到毫秒位隊(duì)列,最后在該隊(duì)列計(jì)時(shí)完成后,該定時(shí)器總計(jì)時(shí)完畢。
最后一種方法則是傳統(tǒng)的兩級定時(shí)方法。其采用兩級定時(shí)器機(jī)制(計(jì)數(shù)器和定時(shí)器),它首先將硬件的時(shí)鐘中斷與計(jì)數(shù)器(Counter)相關(guān)聯(lián),每一個(gè)計(jì)數(shù)器可以關(guān)聯(lián)一個(gè)或多個(gè)定時(shí)器,當(dāng)計(jì)數(shù)器的計(jì)數(shù)達(dá)到一定的值的時(shí)候(比如在此時(shí)至少有一個(gè)與之關(guān)聯(lián)的定時(shí)器會報(bào)時(shí)),計(jì)數(shù)器將會遍歷檢查與之關(guān)聯(lián)的所有的定時(shí)器(Alarm),將定時(shí)器的報(bào)時(shí)時(shí)間與當(dāng)前的計(jì)數(shù)值進(jìn)行比較判斷,并將應(yīng)在此刻報(bào)時(shí)的定時(shí)器進(jìn)行報(bào)時(shí)操作。
縱上所述,可以看出簡單計(jì)時(shí)法固然方法簡單,實(shí)現(xiàn)容易,但當(dāng)定時(shí)器數(shù)目滿載(如20000個(gè))時(shí),則每次計(jì)數(shù)需要更新所有定時(shí)器,即做20萬次更新遍歷(假設(shè)每一個(gè)定時(shí)器的計(jì)時(shí)周期100毫秒),而嵌入式系統(tǒng)的CPU資源相當(dāng)有限,定時(shí)器本身的任務(wù)不能占太多的資源,所以如果采用這種方法,就會占用較多的CPU資源。
而多任務(wù)隊(duì)列計(jì)時(shí)法相對簡單計(jì)時(shí)法更高效,在每次計(jì)時(shí)周期到來時(shí),只需做與隊(duì)列數(shù)相同的判斷和更新,以及可能的報(bào)時(shí)操作,就能基本滿足嵌入式系統(tǒng)的定時(shí)需求。但同時(shí)該方法也存在很多冗余操作,如空負(fù)載時(shí)檢查所有隊(duì)列,滿負(fù)載時(shí)要對所有隊(duì)列做2倍于檢查的加減法操作,真正有效的操作只有占其中很少部分的報(bào)時(shí)和插入操作;而且在隊(duì)列處理中存在耗費(fèi)計(jì)算資源的排序操作。
而在傳統(tǒng)的兩級定時(shí)方法中,雖然每次硬件時(shí)鐘中斷僅觸發(fā)計(jì)數(shù)器,而不觸發(fā)所有定時(shí)器,在一定程度上提高了定時(shí)器效率,充分利用了硬件資源,但是由于計(jì)數(shù)器在每達(dá)到一定的值的時(shí)候,都要遍歷與之關(guān)聯(lián)的所有的定時(shí)器,并進(jìn)行比較判斷操作,其效率是很低的,特別是當(dāng)與該計(jì)數(shù)器關(guān)聯(lián)的定時(shí)器數(shù)量較多的時(shí)候,遍歷所有定時(shí)器的做法會存在很多耗時(shí)的不必要的操作。
發(fā)明內(nèi)容
針對現(xiàn)有技術(shù)中用單一硬件中斷源控制多個(gè)定時(shí)器并解決簡單定時(shí)器的低效率問題、多隊(duì)列計(jì)時(shí)法中存在的冗余操作和排序操作的缺點(diǎn)以及傳統(tǒng)的兩級定時(shí)方法中耗時(shí)低效的遍歷問題,本發(fā)明提出一種用于嵌入式實(shí)時(shí)操作系統(tǒng)定時(shí)器的高效遍歷的兩級定時(shí)方法。
為了解決上述技術(shù)問題,本發(fā)明是通過以下技術(shù)方案實(shí)現(xiàn)的本發(fā)明提出的兩級定時(shí)方法是指兩級定時(shí)器機(jī)制(計(jì)數(shù)器和定時(shí)器),它首先將硬件的時(shí)鐘中斷與計(jì)數(shù)器(Counter)相關(guān)聯(lián),每一個(gè)計(jì)數(shù)器可以關(guān)聯(lián)一個(gè)或多個(gè)定時(shí)器(如圖1所示)。這樣每次硬件時(shí)鐘中斷僅觸發(fā)計(jì)數(shù)器進(jìn)行計(jì)數(shù),而不用觸發(fā)所有的定時(shí)器,充分利用了硬件資源;而由計(jì)數(shù)器負(fù)責(zé)根據(jù)當(dāng)前它的計(jì)數(shù)值和與其關(guān)聯(lián)的定時(shí)器的報(bào)時(shí)時(shí)間,來判斷是否使定時(shí)器進(jìn)行報(bào)時(shí)操作。
本發(fā)明所述嵌入式實(shí)時(shí)操作系統(tǒng)高效遍歷的定時(shí)方法包括以下步驟(1)先將至少一個(gè)計(jì)數(shù)器與對應(yīng)的硬件中斷源進(jìn)行關(guān)聯(lián)綁定操作,然后將至少一個(gè)定時(shí)器與相應(yīng)的計(jì)數(shù)器進(jìn)行關(guān)聯(lián)操作。每個(gè)計(jì)數(shù)器的上面,有一個(gè)指向與其所關(guān)聯(lián)的定時(shí)器鏈表的指針,在該鏈表中,定時(shí)器是按照其下一次的報(bào)時(shí)時(shí)刻的順序進(jìn)行排列的;在每個(gè)計(jì)數(shù)器的上面,有一整型變量(名為RemainTicks),表示此刻該計(jì)數(shù)器相關(guān)聯(lián)的下一個(gè)定時(shí)器報(bào)時(shí)所需經(jīng)過的計(jì)數(shù)單位。由于在鏈表中,定時(shí)器是按下一次報(bào)時(shí)的時(shí)刻順序排列的,所以下一個(gè)報(bào)時(shí)的定時(shí)器肯定位于該鏈表的頭部,所以RemainTicks的值也就等于此刻該鏈表的頭指針?biāo)傅亩〞r(shí)器報(bào)時(shí)所需經(jīng)過的計(jì)數(shù)單位。當(dāng)鏈表非空,且RemainTicks的值為0時(shí),則表示此刻將至少有一個(gè)與該計(jì)數(shù)器相關(guān)聯(lián)的定時(shí)器會報(bào)時(shí)。如果鏈表為空,則RemainTicks的值無意義。
(2)如圖2所示,在每個(gè)計(jì)時(shí)周期到來時(shí),查詢計(jì)數(shù)器的鏈表是否為空,如果為空,則繼續(xù)等待下一個(gè)計(jì)時(shí)周期的到來;如果不為空,則將計(jì)數(shù)器的RemainTicks的值減1,并判斷RemainTicks的值是否為0,如果不為0,則不需遍歷定時(shí)器鏈表,繼續(xù)等待下一個(gè)計(jì)時(shí)周期的到來;如果為0,則表示此刻至少有一個(gè)定時(shí)器會報(bào)時(shí),進(jìn)行如下操作(a)遍歷定時(shí)器鏈表中會報(bào)時(shí)的定時(shí)器(它們處于鏈表的前部),直到遍歷到不在此刻報(bào)時(shí)的定時(shí)器或已遍歷到鏈表末尾的時(shí)候,退出這次遍歷操作(無需繼續(xù)遍歷其余的定時(shí)器,因?yàn)樗鼈兛隙ú粫诖丝虉?bào)時(shí));(b)更新計(jì)數(shù)器的RemainTicks的值,其值為此時(shí)鏈表的頭指針?biāo)赶虻亩〞r(shí)器的下一次報(bào)時(shí)所需經(jīng)過的計(jì)數(shù)單位。
作為本發(fā)明的一種改進(jìn),如果剛剛報(bào)時(shí)的定時(shí)器為一次性定時(shí)器的話,則將其直接從鏈表中刪除。
作為本發(fā)明的一種改進(jìn),如果剛剛報(bào)時(shí)的定時(shí)器為循環(huán)定時(shí)器的話,則更新其下一次的報(bào)時(shí)時(shí)刻,并按下一次報(bào)時(shí)時(shí)刻順序?qū)⑵湓诙〞r(shí)器鏈表中插入。
作為本發(fā)明的一種改進(jìn),當(dāng)上層應(yīng)用程序需要啟動新的定時(shí)器時(shí),按照下一次報(bào)時(shí)的時(shí)刻順序,將該定時(shí)器插入與其關(guān)聯(lián)的計(jì)數(shù)器的定時(shí)器鏈表中。如果該定時(shí)器插入的位置為鏈表的頭指針的話,則更新一下該計(jì)數(shù)器的RemainTicks的值,否則不需要更新計(jì)數(shù)器的RemainTicks的值。
本發(fā)明的有益效果在于每當(dāng)計(jì)時(shí)周期到來,計(jì)數(shù)器計(jì)數(shù)的時(shí)候,不用每次都去檢查遍歷定時(shí)器的鏈表,而只是在至少有一個(gè)定時(shí)器會報(bào)時(shí)的時(shí)候,才會去檢查遍歷定時(shí)器鏈表,這樣提高了效率;在至少有一個(gè)定時(shí)器會報(bào)時(shí)檢查遍歷定時(shí)器的鏈表的時(shí)候,只會去檢查遍歷和更新那些會在此刻報(bào)時(shí)的定時(shí)器,而不會去遍歷其余的在此刻還未報(bào)時(shí)的定時(shí)器,即不會去一一檢查遍歷所有的定時(shí)器,這樣減少了耗時(shí)的不必要的操作,提高了效率。
圖1是本發(fā)明實(shí)施例中兩級定時(shí)機(jī)制的結(jié)構(gòu)示意圖;圖2是本發(fā)明所述的高效遍歷的定時(shí)方法的核心算法流程圖;圖3是本發(fā)明所述的高效遍歷的定時(shí)方法的運(yùn)作舉例示意圖。
具體實(shí)施例方式
下面結(jié)合附圖和實(shí)例對本發(fā)明所述的高效遍歷的定時(shí)方法作進(jìn)一步介紹。
圖3顯示了在AXIOM CME-0555板子里,硬件中斷源的計(jì)時(shí)周期到來時(shí),相應(yīng)的計(jì)數(shù)器進(jìn)行計(jì)數(shù),并在一定時(shí)刻高效遍歷與其相關(guān)聯(lián)的定時(shí)器進(jìn)行報(bào)時(shí)的步驟原理。假設(shè)計(jì)數(shù)器X有N個(gè)定時(shí)器與之相關(guān)聯(lián),計(jì)數(shù)器有一鏈表指針指向這些定時(shí)器,在該鏈表中,這些定時(shí)器按照下一次報(bào)時(shí)的時(shí)刻順序排列的。假設(shè)在鏈表中,排在前面的5個(gè)定時(shí)器分別為定時(shí)器A、B、C、D、E,其下一次報(bào)時(shí)時(shí)間和周期值分別如下表所示。計(jì)數(shù)器X上的RemainTicks值等于與該計(jì)數(shù)器相關(guān)聯(lián)的下一個(gè)定時(shí)器報(bào)時(shí)所需經(jīng)過的計(jì)時(shí)單位,剛開始時(shí)由于定時(shí)器A的下一次報(bào)時(shí)時(shí)刻為30計(jì)時(shí)單位,當(dāng)前系統(tǒng)時(shí)間為0計(jì)時(shí)單位,所以此時(shí)的RemainTicks值應(yīng)等于30計(jì)時(shí)單位。
當(dāng)下一計(jì)數(shù)周期到來時(shí),計(jì)數(shù)器的RemainTicks值減1變?yōu)?9,因?yàn)椴坏扔?,所以繼續(xù)等待下一計(jì)數(shù)周期的到來。
每當(dāng)計(jì)數(shù)周期到來時(shí),如果鏈表非空,則計(jì)數(shù)器的RemainTicks值都會減1,直到當(dāng)RemainTicks等于0的時(shí)候,開始遍歷與該計(jì)數(shù)器關(guān)聯(lián)的定時(shí)器鏈表(因?yàn)榇藭r(shí)至少會有一個(gè)定時(shí)器報(bào)時(shí),設(shè)有K個(gè)定時(shí)器此時(shí)會報(bào)時(shí),K>=1),按照定時(shí)器在鏈表中的順序,定時(shí)器A和定時(shí)器B分別會被遍歷到并進(jìn)行報(bào)時(shí)操作,當(dāng)遍歷到定時(shí)器C的時(shí)候,發(fā)現(xiàn)定時(shí)器C不會在此刻報(bào)時(shí)(因?yàn)楫?dāng)前系統(tǒng)時(shí)刻為30計(jì)數(shù)單位,而它的報(bào)時(shí)時(shí)刻為70計(jì)數(shù)單位),所以結(jié)束遍歷操作(無需繼續(xù)遍歷鏈表中剩余的定時(shí)器,即無需遍歷其余的N-K個(gè)定時(shí)器,因?yàn)樗鼈兛隙ú粫诖丝虉?bào)時(shí))。然后計(jì)算出剛報(bào)時(shí)過的定時(shí)器的下一次報(bào)時(shí)時(shí)刻,定時(shí)器A和定時(shí)器B的下一次報(bào)時(shí)時(shí)刻分別為75計(jì)數(shù)單位和80計(jì)數(shù)單位,并按下一次報(bào)時(shí)時(shí)刻的順序?qū)⑺鼈儌z插入到鏈表中,此時(shí)鏈表中前面5個(gè)定時(shí)器的順序?yàn)槎〞r(shí)器C、A、B、D、E。最后,更新計(jì)數(shù)器的RemainTicks的值,其值應(yīng)等于定時(shí)器C下一次報(bào)時(shí)還需經(jīng)過的計(jì)數(shù)單位,即70-30=40計(jì)數(shù)單位。接著繼續(xù)等待下一計(jì)數(shù)周期的到來。
根據(jù)上述的步驟原理,計(jì)數(shù)器計(jì)數(shù)的時(shí)候,當(dāng)且僅當(dāng)在至少有一個(gè)定時(shí)器會報(bào)時(shí)的時(shí)候,才會去檢查遍歷定時(shí)器鏈表,而且在檢查遍歷定時(shí)器鏈表的時(shí)候,只會遍歷會在此刻進(jìn)行報(bào)時(shí)的定時(shí)器,而不會去遍歷其余的在此刻還未報(bào)時(shí)的定時(shí)器,這樣減少了耗時(shí)的沒必要的操作,從而提高了效率,特別是當(dāng)與該計(jì)數(shù)器關(guān)聯(lián)的定時(shí)器數(shù)量較多的時(shí)候,效果會更明顯。
當(dāng)上層應(yīng)用程序需要添加新的定時(shí)器的時(shí)候,可以直接在相應(yīng)的計(jì)數(shù)器的鏈表上面按照下一次報(bào)時(shí)的時(shí)刻的順序插入該定時(shí)器即可。如果該定時(shí)器插在鏈表的頭部,則需要更新計(jì)數(shù)器的RemainTicks的值,否則無需更新RemainTicks值。
當(dāng)上層應(yīng)用程序不再需要某定時(shí)器的時(shí)候,可以直接在相應(yīng)的計(jì)數(shù)器的鏈表上面刪除該定時(shí)器即可。如果該定時(shí)器原來是在鏈表的頭部,則需要更新計(jì)數(shù)器的RemainTicks的值,否則無需更新RemainTicks值。
綜上所述,本發(fā)明采用的高效遍歷的定時(shí)方法,大大提高了計(jì)數(shù)器遍歷觸發(fā)定時(shí)器的效率,節(jié)省了系統(tǒng)的資源,而且維護(hù)、操作方法簡單,實(shí)現(xiàn)容易。
最后,還需要注意的是,以上列舉的僅是本發(fā)明的具體實(shí)施例子。顯然,本發(fā)明不限于以上實(shí)施例子,還可以有許多變形。本領(lǐng)域的普通技術(shù)人員能從本發(fā)明公開的內(nèi)容直接導(dǎo)出或聯(lián)想到的所有變形,均應(yīng)認(rèn)為是本發(fā)明的保護(hù)范圍。
權(quán)利要求
1.一種嵌入式實(shí)時(shí)操作系統(tǒng)高效遍歷的定時(shí)方法,包括以下步驟(1)將至少一個(gè)計(jì)數(shù)器與對應(yīng)的硬件中斷源進(jìn)行關(guān)聯(lián)綁定操作,然后將至少一個(gè)定時(shí)器與計(jì)數(shù)器進(jìn)行關(guān)聯(lián)操作;所述計(jì)數(shù)器上有一指向與其所關(guān)聯(lián)的定時(shí)器鏈表的指針,在該鏈表中定時(shí)器按照其下一次的報(bào)時(shí)時(shí)刻的順序進(jìn)行排列;所述計(jì)數(shù)器上面有一表示此刻該計(jì)數(shù)器相關(guān)聯(lián)的下一個(gè)定時(shí)器報(bào)時(shí)所需經(jīng)過的計(jì)數(shù)單位的整型變量RemainTicks;(2)在每個(gè)計(jì)時(shí)周期到來時(shí),查詢計(jì)數(shù)器的鏈表是否為空,如果為空,則繼續(xù)等待下一個(gè)計(jì)時(shí)周期的到來;如果不為空,則將計(jì)數(shù)器的RemainTicks的值減1,并判斷RemainTicks的值是否為0,如果不為0,則不需遍歷定時(shí)器鏈表,繼續(xù)等待下一個(gè)計(jì)時(shí)周期的到來;如果為0,則表示此刻至少有一個(gè)定時(shí)器會報(bào)時(shí),進(jìn)行如下操作(a)遍歷定時(shí)器鏈表中會報(bào)時(shí)的定時(shí)器,直到遍歷到不在此刻報(bào)時(shí)的定時(shí)器或已遍歷到鏈表末尾的時(shí)候,退出這次遍歷操作;(b)更新計(jì)數(shù)器的RemainTicks的值,其值為此時(shí)鏈表的頭指針?biāo)赶虻亩〞r(shí)器的下一次報(bào)時(shí)所需經(jīng)過的計(jì)數(shù)單位。
2.根據(jù)權(quán)利要求1所述的嵌入式實(shí)時(shí)操作系統(tǒng)高效遍歷的定時(shí)方法,其特征在于,在所述第(2)步操作中,如果剛剛報(bào)時(shí)的定時(shí)器為一次性定時(shí)器,則將其直接從鏈表中刪除。
3.根據(jù)權(quán)利要求1所述的嵌入式實(shí)時(shí)操作系統(tǒng)高效遍歷的定時(shí)方法,其特征在于,在所述第(2)步操作中,如果剛剛報(bào)時(shí)的定時(shí)器為循環(huán)定時(shí)器,則更新其下一次的報(bào)時(shí)時(shí)刻,并按下一次報(bào)時(shí)時(shí)刻順序?qū)⑵湓诙〞r(shí)器鏈表中插入。
4.根據(jù)權(quán)利要求1所述的嵌入式實(shí)時(shí)操作系統(tǒng)高效遍歷的定時(shí)方法,其特征在于,當(dāng)上層應(yīng)用程序需要啟動新的定時(shí)器時(shí),按照下一次報(bào)時(shí)的時(shí)刻順序,將該定時(shí)器插入與其關(guān)聯(lián)的計(jì)數(shù)器的定時(shí)器鏈表中。如果該定時(shí)器插入的位置為鏈表的頭指針的話,則更新該計(jì)數(shù)器的RemainTicks的值,否則不需要更新計(jì)數(shù)器的RemainTicks的值。
全文摘要
本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,旨在提供一種計(jì)算機(jī)領(lǐng)域中的嵌入式實(shí)時(shí)操作系統(tǒng)中的定時(shí)器方法。該方法包括將至少一個(gè)計(jì)數(shù)器與對應(yīng)的硬件中斷源進(jìn)行關(guān)聯(lián)綁定操作,然后將至少一個(gè)定時(shí)器與計(jì)數(shù)器進(jìn)行關(guān)聯(lián)操作;在每個(gè)計(jì)時(shí)周期到來時(shí),查詢計(jì)數(shù)器的鏈表是否為空,據(jù)此進(jìn)行相應(yīng)操作步驟。本發(fā)明中的方法每當(dāng)計(jì)時(shí)周期到來,計(jì)數(shù)器計(jì)數(shù)的時(shí)候,不用每次都去檢查遍歷定時(shí)器的鏈表,提高了效率;在至少有一個(gè)定時(shí)器會報(bào)時(shí)檢查遍歷定時(shí)器的鏈表的時(shí)候,只會去檢查遍歷和更新那些會在此刻報(bào)時(shí)的定時(shí)器,而不會去遍歷其余的在此刻還未報(bào)時(shí)的定時(shí)器,即不會去一一檢查遍歷所有的定時(shí)器,這樣減少了耗時(shí)的不必要的操作,提高了效率。
文檔編號G06F9/46GK1877535SQ20061005237
公開日2006年12月13日 申請日期2006年7月7日 優(yōu)先權(quán)日2006年7月7日
發(fā)明者吳朝暉, 徐盧傳, 楊國青, 李紅, 孫潔, 趙民德 申請人:浙江大學(xué)