專利名稱:一種定時器和異步事件的處理方法及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)通信領(lǐng)域和計算機領(lǐng)域的技術(shù),尤其涉及一種多線程調(diào)度技術(shù)。
背景技術(shù):
目前,嵌入式系統(tǒng)軟件需要處理很多周期性的事務(wù),例如報文的定時發(fā)送等。這些周期性的事務(wù)往往要求較高的實時性,因此要求嵌入式軟件必須提供高精度定時器機制的支持。另一方面,在實際環(huán)境中,嵌入式系統(tǒng)大多數(shù)是事件驅(qū)動或報文驅(qū)動的系統(tǒng),而且處理的外部事件是多發(fā)的而且是并發(fā)的隨機事件。嵌入式軟件為了有效地處理這些外部并發(fā)事件,往往采用多任務(wù)、多進程的運行機制異步處理這些外部事件。任務(wù)(進程)通常被業(yè)界定義為一個正在運行的程序?qū)嵗?,它是資源分配的基本單位。進一步,為了適應(yīng)各種復(fù)雜的并發(fā)環(huán)境,獲得更快的切換速度,引入了多線程(thread)的處理機制。線程是調(diào)度的基本單位,同時任務(wù)擁有足夠的分離的上下文來維護各自的控制線程,從而一個任務(wù)或進程可以支持多個線程。在一個嵌入式軟件系統(tǒng)中,如既要滿足高精度的實時性要求,又要滿足具有處理異步并發(fā)事件的能力,那么,往往就需要多個任務(wù)共同來實現(xiàn)整個系統(tǒng)的功能。在滿足實時性方面,可以使用系統(tǒng)中斷服務(wù)程序(ISR)來維護用戶定時器處理相關(guān)的事件,但用戶定時器在使用上具有諸多限制并且在時間上可能不滿足高精度的需求,例如看門狗定時器; 也可以使用專門的任務(wù)定時器處理相關(guān)的事件,可以滿足高精度的要求,但系統(tǒng)中如果存在多個不同優(yōu)先級的用戶定時器,就需要多個不同的任務(wù);并且在滿足異步事件的能力方面,也可能需要多個不同的任務(wù)同時進行處理,當(dāng)任務(wù)較多時,任務(wù)間會頻繁發(fā)生切換,勢必會影響系統(tǒng)的執(zhí)行效率。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題是,提供一種在嵌入式系統(tǒng)中既能確保多個用戶定時器、異步事件的有序控制,又能提高現(xiàn)有用戶定時器、異步事件執(zhí)行效率的方法以及實現(xiàn)該方法的系統(tǒng)。本發(fā)明為解決上述技術(shù)問題所采用的技術(shù)方案是,一種定時器和異步事件的處理方法,包括以下步驟a、系統(tǒng)初始化用戶隊列與就緒隊列,并設(shè)置中斷定時器的中斷周期,用戶隊列用于存放用戶任務(wù)需要調(diào)度的異步事件或需要啟動的用戶定時器轉(zhuǎn)換為線程后對應(yīng)的節(jié)點, 就緒隊列用于存放調(diào)度任務(wù)需要立即執(zhí)行的從用戶隊列中取出的異步事件線程對應(yīng)的節(jié)點或用戶定時器線程對應(yīng)的節(jié)點;b、調(diào)度任務(wù)檢查就緒隊列,就緒隊列為空時或者執(zhí)行完就緒隊列中所有節(jié)點對應(yīng)的線程直至就緒隊列為空后,調(diào)度任務(wù)檢查用戶隊列;C、調(diào)度任務(wù)檢查用戶隊列,將異步事件線程對應(yīng)的節(jié)點以及已到期的用戶定時器線程對應(yīng)的節(jié)點加入至就緒隊列,系統(tǒng)啟動中斷定時器,并設(shè)置中斷定時器的中斷服務(wù)程序和定時間隔;d、在所述定時間隔到期后,中斷定時器調(diào)用中斷服務(wù)程序釋放一個同步信號量, 進入步驟b ;在所述步驟b至d循環(huán)執(zhí)行過程中,當(dāng)用戶任務(wù)有需要調(diào)度的異步事件或需要啟動的定時器時,系統(tǒng)立即將該異步事件或用戶定時器轉(zhuǎn)換為線程,并加入用戶隊列形成用戶隊列的節(jié)點。本方案中既可以同時啟動多個用戶定時器也可以同時處理多個異步事件,保證了所述技術(shù)方案的通用性,由于用戶定時器和異步事件在一個任務(wù)(本發(fā)明中的調(diào)度任務(wù)) 的多個線程中同時執(zhí)行,減少了任務(wù)間的切換開銷,提高了執(zhí)行效率,并且通過同步信號量的釋放有序地控制執(zhí)行異步事件或用戶定時器對應(yīng)線程。進一步的,當(dāng)系統(tǒng)要求支持高精度的用戶定時器時,則采用高精度的硬件定時器作為中斷定時器,本文所述“高精度”為毫秒級的精度,初始化時設(shè)置中斷定時器的中斷周期為需要的精度,如當(dāng)前的應(yīng)用環(huán)境需要硬件定時器的精度達到1ms,則設(shè)置硬件定時器的中斷周期為1ms;否則,中斷定時器可以使用軟中斷定時器。當(dāng)采用高精度的硬件定時器, 很容易實現(xiàn)高精度的系統(tǒng)中斷,從而保證了用戶定時器能夠十分準(zhǔn)確的定時。步驟c中,為了更進一步地提高執(zhí)行效率,提供一種優(yōu)選的中斷定時器的定時間隔設(shè)置方法當(dāng)檢查到用戶隊列中有異步事件線程對應(yīng)的節(jié)點或已經(jīng)到期的用戶定時器線程對應(yīng)的節(jié)點時,在將以上節(jié)點加入就緒隊列后,系統(tǒng)設(shè)置中斷定時器的定時間隔為零;當(dāng)檢查到用戶隊列中沒有節(jié)點時,系統(tǒng)設(shè)置中斷定時器的定時間隔為系統(tǒng)預(yù)設(shè)的固定值;當(dāng)檢查到用戶隊列中僅存在用戶定時器節(jié)點且所有的用戶定時器均未到期時,系統(tǒng)設(shè)置中斷定時器的定時間隔為所有用戶定時器的定時間隔的最小值。進一步的,為了保證執(zhí)行的靈活性,所述用戶隊列、就緒隊列可以設(shè)置多個。即,系統(tǒng)可以根據(jù)異步事件和用戶定時器的優(yōu)先級或類型,選擇創(chuàng)建多個不同的用戶隊列或就緒隊列。比如根據(jù)類型,系統(tǒng)可以創(chuàng)建兩個用戶隊列異步事件用戶隊列和用戶定時器用戶隊列;另外一種類型的用戶隊列可以根據(jù)不同的優(yōu)先級創(chuàng)建不同的用戶隊列,調(diào)度機制可以根據(jù)優(yōu)先級決定優(yōu)先處理哪些異步事件和定時器,這樣保證了靈活性。進一步的,為了方便后續(xù)的維護和調(diào)試,系統(tǒng)對所有用戶任務(wù)的需要調(diào)度的各異步事件和用戶定時器提供統(tǒng)一的接口,在將異步事件或用戶定時器轉(zhuǎn)換為線程,將線程控制塊加入用戶隊列形成用戶隊列的節(jié)點時,還需注明節(jié)點所對應(yīng)線程的類型、優(yōu)先級。嵌入式系統(tǒng),包括接口模塊、隊列模塊、調(diào)度任務(wù)模塊、中斷模塊;所述接口模塊用于,當(dāng)用戶任務(wù)有需要調(diào)度的異步事件或需要啟動的用戶定時器時,接口模塊將該異步事件或用戶定時器轉(zhuǎn)換為線程,并加入隊列模塊中的用戶隊列形成用戶隊列的節(jié)點;所述隊列模塊用于,負責(zé)創(chuàng)建和維護用戶隊列與就緒隊列;用戶隊列接收用戶任務(wù)通過接口模塊存入的異步事件線程對應(yīng)的節(jié)點或用戶定時器的線程對應(yīng)的節(jié)點;就緒隊列接收需要被調(diào)度任務(wù)模塊立即執(zhí)行的異步事件線程對應(yīng)的節(jié)點或用戶定時器的線程對應(yīng)的節(jié)點;所述調(diào)度任務(wù)模塊用于,先檢查就緒隊列,當(dāng)就緒隊列中存在節(jié)點,調(diào)度任務(wù)模塊立即執(zhí)行所有該節(jié)點對應(yīng)的線程直至就緒隊列為空;然后檢查用戶隊列,將用戶隊列中的
5異步事件線程對應(yīng)的節(jié)點和已到期的用戶定時器線程對應(yīng)的節(jié)點加入就緒隊列,加入完畢后啟動中斷定時器并設(shè)置中斷定時器的中斷服務(wù)程序和定時間隔;所述中斷模塊用于,初始化中斷定時器的中斷周期;根據(jù)中斷定時器對調(diào)度任務(wù)模塊進行中斷控制,當(dāng)定時間隔到期后,中斷模塊調(diào)用中斷服務(wù)釋放一個同步信號量給調(diào)度任務(wù)模塊。進一步的,調(diào)度任務(wù)模塊還用于,當(dāng)檢查用戶隊列中沒有節(jié)點時,調(diào)度任務(wù)模塊設(shè)置中斷定時器的定時間隔為系統(tǒng)預(yù)設(shè)的固定值;當(dāng)檢查用戶隊列中有異步事件線程對應(yīng)的節(jié)點或已經(jīng)到期的用戶定時器線程對應(yīng)的節(jié)點,在將以上節(jié)點加入就緒隊列后,調(diào)度任務(wù)模塊設(shè)置中斷定時器的定時間隔為零;當(dāng)檢查用戶隊列中僅存在用戶定時器節(jié)點且所有的用戶定時器均未到期,調(diào)度任務(wù)模塊設(shè)置中斷定時器的定時間隔為所有用戶定時器的定時間隔的最小值。進一步的,隊列模塊還用于,根據(jù)異步事件和定時器的優(yōu)先級或類型,創(chuàng)建多個不同的用戶隊列或就緒隊列。進一步的,接口模塊還用于,在將異步事件或用戶定時器轉(zhuǎn)換為線程時,將線程控制塊加入用戶隊列形成用戶隊列的節(jié)點,還需注明節(jié)點所對應(yīng)線程的類型、優(yōu)先級。本發(fā)明的有益效果是,系統(tǒng)中既可以同時啟動多個用戶定時器也可以同時處理多個異步事件,保證了通用性,用戶定時器和異步事件在一個任務(wù)的多個線程中同時執(zhí)行,減少了任務(wù)間的切換開銷,提高了執(zhí)行效率。進一步的,用戶隊列和就緒隊列可以設(shè)置多個不同的隊列,保證了靈活性。進一步的,采用高精度的硬件定時器,從而保證了用戶定時器能夠十分準(zhǔn)確的定時。進一步的,將異步事件和用戶定時器通過接口統(tǒng)一起來,使用起來較為方便,便于后續(xù)的維護和調(diào)試。
圖1是本發(fā)明的多線程調(diào)度的流程示意圖;圖2是本發(fā)明的多線程調(diào)度的系統(tǒng)結(jié)構(gòu)示意圖;圖3是實施例1的流程示意圖;圖4是實施例2的流程示意圖;圖5是實施例3的結(jié)構(gòu)框圖。
具體實施例方式本發(fā)明利用多線程調(diào)度同時處理異步事件和定時器,而需要同時高效處理異步事件和定時器的場景,在數(shù)據(jù)通信的設(shè)備上普遍存在。例如,在雙向轉(zhuǎn)發(fā)檢測協(xié)議中,一方面需要啟動各種發(fā)送報文和檢測報文的用戶定時器,而且用戶定時器需要毫秒級的精度,另一方面又可能隨時接收到對端設(shè)備發(fā)送的控制報文需要及時處理。為適應(yīng)高精度要求,使用硬件定時器。如圖1所示定時器和異步事件的處理系統(tǒng)包括隊列模塊、接口模塊、調(diào)度任務(wù)模塊、中斷模塊。隊列模塊,負責(zé)創(chuàng)建維護就緒隊列和用戶隊列,用戶隊列負責(zé)接收其他任務(wù)模塊通知的需要執(zhí)行的異步事件或需要啟動的用戶定時器,就緒隊列則只負責(zé)存放將要被調(diào)度任務(wù)模塊執(zhí)行的線程節(jié)點;就緒隊列和用戶隊列可以創(chuàng)建單個的用戶隊列和單個的就緒隊列,也可以根據(jù)異步事件和定時器的優(yōu)先級或類型選擇創(chuàng)建多個不同的用戶隊列、就緒隊列;接口模塊,為其他任務(wù)模塊的外部異步事件或用戶定時器提供一個統(tǒng)一的接口, 并負責(zé)將它們轉(zhuǎn)換一個可被執(zhí)行的線程控制塊,加入到用戶隊列中形成節(jié)點;且加入用戶隊列前,線程控制塊需注明線程的類型、優(yōu)先級等;調(diào)度任務(wù)模塊,是多線程執(zhí)行的主體部分,負責(zé)從用戶隊列中選擇需要立即執(zhí)行的線程(節(jié)點)加入到就緒隊列,啟動硬件定時器并等待同步信號量,獲取到同步信號量后,負責(zé)從就緒隊列中取出各個線程并執(zhí)行;調(diào)度任務(wù)模塊可以根據(jù)優(yōu)先級選擇特定的線程加入到就緒隊列,也可以選擇不同就緒隊列中的線程進行執(zhí)行;中斷模塊,負責(zé)根據(jù)硬件定時器進行中斷控制,當(dāng)硬件定時器定時到期后執(zhí)行中斷服務(wù)程序,中斷服務(wù)程序釋放同步信號量,從而使得調(diào)度任務(wù)模塊可以繼續(xù)執(zhí)行。如圖2所示,本發(fā)明定時器和異步事件的處理方法包括如下步驟a)隊列模塊初始化用戶隊列和就緒隊列,中斷模塊初始化設(shè)置硬件定時器的中斷周期;用戶隊列負責(zé)接收其他任務(wù)模塊通知的需要執(zhí)行的異步事件或需要啟動的用戶定時器,就緒隊列則只負責(zé)存放將要被調(diào)度任務(wù)模塊執(zhí)行的線程節(jié)點;b)調(diào)度任務(wù)模塊檢查就緒隊列中是否存在節(jié)點,如果就緒隊列為空,或者如果有節(jié)點則立即執(zhí)行該節(jié)點所對應(yīng)的線程,當(dāng)就緒隊列中存在多個節(jié)點時,則調(diào)度任務(wù)模塊就不停地取出節(jié)點并執(zhí)行該節(jié)點所對應(yīng)的線程,直至就緒隊列中的節(jié)點為空;然后調(diào)度任務(wù)模塊檢查用戶隊列;c)調(diào)度任務(wù)模塊檢查用戶隊列,當(dāng)檢查用戶隊列中有異步事件線程對應(yīng)的節(jié)點或已經(jīng)到期的用戶定時器線程對應(yīng)的節(jié)點,在將以上節(jié)點加入就緒隊列后,系統(tǒng)設(shè)置硬件定時器的定時間隔為零;當(dāng)檢查用戶隊列中沒有節(jié)點時,系統(tǒng)設(shè)置硬件定時器的定時間隔為系統(tǒng)預(yù)設(shè)的固定值;當(dāng)檢查用戶隊列中僅存在用戶定時器節(jié)點且所有的用戶定時器均未到期,系統(tǒng)設(shè)置硬件定時器的定時間隔為所有用戶定時器的定時間隔的最小值;。d)調(diào)度任務(wù)模塊啟動中斷模塊中的硬件定時器,并設(shè)置硬件定時器的中斷服務(wù)程序和定時間隔,之后,調(diào)度任務(wù)模塊進入阻塞狀態(tài),中斷模塊根據(jù)硬件定時器對調(diào)度任務(wù)模塊進行中斷控制,當(dāng)硬件定時器的定時間隔到期后,中斷模塊調(diào)用中斷服務(wù)程序釋放一個同步信號量給調(diào)度任務(wù)模塊,調(diào)度任務(wù)模塊接收到同步信號量后調(diào)度任務(wù)模塊返回步驟b) 順序執(zhí)行;其中,中斷服務(wù)程序為釋放一個同步信號量的函數(shù);上述步驟a)為初始化步驟,步驟b)至d)的執(zhí)行是一個無限循環(huán)的過程,在步驟 b)至d)的執(zhí)行過程中,當(dāng)各用戶任務(wù)有需要調(diào)度的異步事件或需要啟動的用戶定時器時, 接口模塊立即將該異步事件或用戶定時器轉(zhuǎn)換為線程控制塊,并加入用戶隊列形成用戶隊列的節(jié)點。實施例1異步事件和用戶定時器需要同時多線程調(diào)度處理在本實施例中,多線程調(diào)度需要同時處理異步事件和用戶定時器,它們之間發(fā)生的順序是突發(fā)的,例如啟動用戶定時器后,用戶定時器并未超時,此時卻接收到其他系統(tǒng)的消息或外部設(shè)備的控制報文需要所述系統(tǒng)進行處理(異步事件)。本實施例中,有兩個需要啟動的用戶定時器,用戶定時器Timerl (定時間隔即超時時間為30毫秒)和用戶定時器 Timer2(定時間隔即超時時間為50毫秒),無需要調(diào)度的異步事件;在第一輪循環(huán)中,調(diào)度任務(wù)模塊在等待同步信號量時,由接口模塊接收到一個需要調(diào)度的異步事件。如圖3所示,詳細描述本實施例1多線程調(diào)度的過程步驟,其中步驟303-310的執(zhí)行過程是一個無限循環(huán)的過程步驟301、隊列模塊初始化用戶隊列和就緒隊列,此過程包括初始化隊列的數(shù)據(jù)結(jié)構(gòu)、選擇隊列的種類等。本實施例初始化隊列時,選擇創(chuàng)建2個用戶隊列userl和userf以及創(chuàng)建2個就緒隊列readyl和ready2,其中,用戶隊列userl存放異步事件線程對應(yīng)的節(jié)點,用戶隊列userf存放用戶定時器線程對應(yīng)的節(jié)點,就緒隊列readyl存放需要立即執(zhí)行的異步事件線程對應(yīng)的節(jié)點,就緒隊列ready2存放已到期的用戶定時器線程對應(yīng)的節(jié)點, 上述的隊列均是由雙向鏈表的數(shù)據(jù)結(jié)構(gòu)組成。同時,設(shè)置硬件定時器的中斷周期為1毫秒;步驟302、當(dāng)其他用戶任務(wù)模塊有需要調(diào)度的異步事件或需要啟動的用戶定時器時,系統(tǒng)將該異步事件或用戶定時器轉(zhuǎn)換為線程,并將線程控制塊加入用戶隊列形成用戶隊列的節(jié)點;本實施例最初有2個需要啟動用戶定時器,用戶定時器Timerl (30毫秒超時) 和用戶定時器Timer2(50毫秒超時),無需要調(diào)度的異步事件;接口模塊將兩個用戶定時器的參數(shù)(定時間隔、定時器類型、定時回調(diào)函數(shù)等)保存到兩個線程控制塊TCBl和TCB2中, 然后將TCBl和TCB2存放到用戶隊列user2中,使它們成為user2的兩個節(jié)點;步驟303、調(diào)度任務(wù)模塊檢查就緒隊列中是否存在節(jié)點,如果存在節(jié)點,則轉(zhuǎn)到步驟304,如果不存在節(jié)點,則轉(zhuǎn)到步驟305。步驟304、調(diào)度任務(wù)模塊取出就緒隊列中的節(jié)點,并執(zhí)行所述節(jié)點所對應(yīng)的線程。 本實施例的本步驟中,第一輪和第二輪循環(huán)跳出此步驟;第三輪循環(huán)時,調(diào)度任務(wù)模塊執(zhí)行這TCBl與TCB3兩個節(jié)點對應(yīng)的線程,調(diào)度任務(wù)模塊可根據(jù)TCBl與TCB3中的優(yōu)先級信息確定具體執(zhí)行的先后關(guān)系,比如,TCBl的優(yōu)先級大于TCB3,那么先執(zhí)行readyl中TCBl相關(guān)的線程,再執(zhí)行TCB3相關(guān)的線程,執(zhí)行完畢后進入步驟305 ;第四輪循環(huán)時,調(diào)度任務(wù)模塊執(zhí)行這TCB2節(jié)點對應(yīng)的線程,執(zhí)行完畢后進入步驟305 ;步驟305、調(diào)度任務(wù)模塊檢查用戶隊列中是否存在節(jié)點,如果不存在節(jié)點,則轉(zhuǎn)到步驟307,否則轉(zhuǎn)到步驟306。本實施例中,第一輪循環(huán)時,用戶隊列user2中存在TCBl與 TCB2兩個節(jié)點;第二輪循環(huán)時,用戶隊列uSer2中存在TCBl與TCB2兩個節(jié)點,用戶隊列 userl中存在TCB3節(jié)點;第三輪循環(huán)時,用戶隊列user2中存在TCB2 ;用戶隊列中不存在節(jié)點,進入步驟307 ;步驟306,如節(jié)點為異步事件節(jié)點或已到期的用戶定時器節(jié)點,則將其存放到就緒隊列中后,進入步驟307 ;如節(jié)點為未到期的用戶定時器,則進入步驟307。本實施例中, 第一輪循環(huán)時,用戶定時器Timerl與用戶定時器Timer2均未到期,進入步驟307 ;第二輪循環(huán)時,用戶定時器Timerl到期,異步事件已被接口模塊接收,則調(diào)度任務(wù)模塊將TCBl與 TCB3加入至就緒隊列中,進入步驟307 ;第三輪循環(huán)時,用戶定時器Timer2到期,將TCB2加入至就緒隊列中;步驟307、調(diào)度任務(wù)模塊計算最小等待時間如果用戶隊列中沒有節(jié)點,則定時器的最小等待時間根據(jù)系統(tǒng)需要取一個的固定值;如果用戶隊列中存在已經(jīng)到期的定時器節(jié)點或異步事件節(jié)點,將以上節(jié)點加入就緒隊列后,將最小等待事件設(shè)置為零;如果用戶隊列中僅有用戶定時器節(jié)點且所有的用戶定時器均未到期,則通過比較線程控制塊的定時間隔,最小等待時間為所有定時器的定時間隔的最小值。在本實施例中,第一輪循環(huán)中,用戶定時器Timerl與用戶定時器Timer2均未到期,則比較Timerl和Timer2的定時間隔,最小等待時間為Timerl的定時間隔30毫秒;第二輪循環(huán)中,用戶隊列中存在定時器節(jié)點定時已經(jīng)到期,且就緒隊列不為空,將最小等待事件設(shè)置為零;第三輪循環(huán)時,用戶隊列中存在定時器節(jié)點定時已經(jīng)到期,將最小等待事件設(shè)置為零;第四輪循環(huán)時,因用戶隊列中已無節(jié)點,最小等待時間設(shè)置一個的固定值,如10毫秒;步驟308、調(diào)度任務(wù)模塊啟動硬件定時器,并設(shè)置硬件定時器的中斷服務(wù)程序和定時間隔,之后調(diào)度任務(wù)模塊進入阻塞狀態(tài),進入步驟309。將步驟307中計算的最小等待時間設(shè)置為硬件定時器的定時間隔。本實施例,第一輪循環(huán)中,硬件定時器的定時間隔設(shè)置為 30毫秒;第二、三輪循環(huán)中,硬件定時器的定時間隔設(shè)置為0毫秒;第四輪循環(huán)中,硬件定時器的定時間隔設(shè)置為10毫秒;步驟309、中斷模塊查詢硬件定時器是否到期,如果沒有到期,則調(diào)度任務(wù)模塊繼續(xù)等待同步信號量,如果到期,則轉(zhuǎn)到步驟310執(zhí)行。中斷模塊的查詢可以是通過中斷記數(shù),比較記錄的數(shù)字與用戶定時間隔的大小來感知用戶中斷是否到期,也可以是其它的實現(xiàn)方式。本步驟是已有的技術(shù)方案,在此不再贅述。本實施例,第一輪循環(huán)中,調(diào)度任務(wù)模塊在等待同步信號量的同時,接口模塊接收到異步事件,接口模塊首先生成線程控制塊TCB3, 再將異步事件的控制消息保存在線程控制塊中,最后將線程控制塊保存在用戶隊列中,使其成為用戶隊列userl的一個節(jié)點;30毫秒到期后,進入步驟310 ;第二、三輪循環(huán)中,立即進入步驟310 ;第四輪循環(huán)中,10毫秒到期后,進入步驟310 ;步驟310、中斷模塊調(diào)用中斷服務(wù)程序釋放一個同步信號量,喚醒調(diào)度任務(wù)模塊繼續(xù)執(zhí)行,調(diào)度任務(wù)模塊轉(zhuǎn)到步驟303繼續(xù)執(zhí)行。實施例2只有異步事件需要多線程調(diào)度處理。除了實施例1的多線程調(diào)度過程中同時處理多種異步事件和定時器外,也可以用來只處理異步事件或定時器。本實施例詳細描述用來處理異步事件的多線程調(diào)度的過程, 其中步驟403-409的執(zhí)行過程是一個無限循環(huán)的過程在本實施例中,如圖4所述,本發(fā)明的方法及系統(tǒng)用來處理各種異步事件,根據(jù)異步事件的性質(zhì),對應(yīng)于多個不同的優(yōu)先級,要求高優(yōu)先級的異步事件優(yōu)先處理。為便于闡述,異步事件記為eventl、event2, event3,它們之間發(fā)生的順序是隨機的。步驟401 隊列模塊初始化用戶隊列和就緒隊列,并設(shè)置硬件定時器的中斷周期。 在本實施例中,創(chuàng)建三個用戶隊列user_high、user_middle、user_low,高優(yōu)先級的異步事件加入user_high隊列,中優(yōu)先級的異步事件加入userjiiiddle隊列,低優(yōu)先級的異步事件力口入user—low隊列。倉1J建三個就緒隊列ready—high、ready—middle、ready—low分另Ij于用戶隊列相對應(yīng)。步驟402、接口模塊分別將異步事件eventl和eVent2分別加入到用戶隊列user_ high和userjiiiddle中,其過程為接口模塊首先生成兩個線程控制塊TCBl和TCB2,將 eventl和event2的參數(shù)信息(回調(diào)函數(shù),回調(diào)函數(shù)參數(shù),事件類型等)分別存放到線程控制塊TCBl和TCB2中,將TCBl和TCB2分別加入user_high和userjiiiddle隊列中,使其分別成為它們的節(jié)點。步驟403、調(diào)度任務(wù)模塊檢查就緒隊列中是否存在節(jié)點,如果存在節(jié)點,則轉(zhuǎn)到步驟404,如果不存在節(jié)點,則轉(zhuǎn)到步驟405。本實施例第一輪的循環(huán)中,就緒隊列ready_ high、ready—middle、ready_low 均沒有節(jié)點。步驟404、調(diào)度任務(wù)模塊取出就緒隊列中的節(jié)點,并執(zhí)行所述節(jié)點所對應(yīng)的線程。 本實施例的第一輪循環(huán)中,直接跳出此步驟。步驟405、調(diào)度任務(wù)模塊檢查用戶隊列中是否存在節(jié)點,如果存在節(jié)點,則轉(zhuǎn)到步驟406,如果不存在節(jié)點,則轉(zhuǎn)到步驟407。本步驟中,用戶隊列user_high和user_middle 均存在節(jié)點。步驟406、調(diào)度任務(wù)模塊取出用戶隊列中的節(jié)點,并將其放到就緒隊列中。在本實施例的本步驟中,將用戶隊列user_high和userjiiiddle的節(jié)點存放到就緒隊列ready_ high 禾口 ready_middle 中。步驟407、調(diào)度任務(wù)模塊啟動硬件定時器,并在啟動時設(shè)置硬件定時器的中斷服務(wù)程序和定時間隔,硬件定時器到期后,中斷模塊釋放同步信號量,調(diào)度任務(wù)模塊繼續(xù)執(zhí)行。 本實施例本步驟中,中斷服務(wù)程序同實施例一,由于就緒隊列中加入了兩個異步事件節(jié)點, 故硬件定時器的定時間隔為0,,中斷模塊釋放同步信號量,調(diào)度任務(wù)模塊轉(zhuǎn)到步驟403中繼續(xù)執(zhí)行。本實施例的第2輪循環(huán)中,步驟403取出就緒隊列ready_high和ready_middle 中的線程控制塊TCBl和TCB2,分別執(zhí)行它們所對應(yīng)的線程;在步驟403到407的循環(huán)過程中,異步事件eVent3可以隨時通過接口模塊加入到用戶隊列uSer_l0W中,如調(diào)度任務(wù)模塊在第1輪循環(huán)的步驟406中將異步事件event3節(jié)點加入到就緒隊列ready_l0W中,并在第 2輪循環(huán)步驟404中執(zhí)行event3相關(guān)的線程。實施例3嵌入式多多線程調(diào)度系統(tǒng),所述系統(tǒng)有接口模塊,隊列模塊,調(diào)度任務(wù)模塊和中斷模塊四部分組成,如圖5所示,其中箭頭方向代表數(shù)據(jù)的流向,圖中的字母代表模塊之間的交互標(biāo)號。接口模塊,為外部異步事件或定時器提供一個統(tǒng)一的接口,并負責(zé)將它們轉(zhuǎn)換為一個可被執(zhí)行的線程控制塊存放到用戶隊列中,所述線程結(jié)構(gòu)可被調(diào)度任務(wù)模塊識別。隊列模塊,負責(zé)創(chuàng)建和維護就緒隊列和用戶隊列,其中,用戶隊列通過接口模塊接收其他任務(wù)模塊通知需要調(diào)度的異步事件或需要啟動的定時器事件,就緒隊列則負責(zé)存放將要被調(diào)度任務(wù)模塊執(zhí)行的線程節(jié)點。所述隊列模塊可以根據(jù)系統(tǒng)的需要靈活配置多個就緒隊列和多個用戶隊列,如圖5所示配置了多個用戶隊列和多個就緒隊列。為了更好的保證數(shù)據(jù)完整性,接口模塊和隊列模塊之間交互可能需要一個互斥信號量保護用戶隊列。調(diào)度任務(wù)模塊,是多線程執(zhí)行的主體部分,負責(zé)從用戶隊列中選擇合適的線程節(jié)點加入到就緒隊列,并負責(zé)從就緒隊列中取出各個線程節(jié)點執(zhí)行,其阻塞是通過等待同步信號量,繼續(xù)執(zhí)行需要獲取同步信號量。所述調(diào)度任務(wù)模塊需要同隊列模塊和中斷模塊進行交互,例如在圖5中,調(diào)度任務(wù)模塊從用戶隊列中獲取線程節(jié)點,調(diào)度任務(wù)模塊負責(zé)將線程節(jié)點存放到就緒隊列,調(diào)度任務(wù)模塊與中斷模塊的交互,即調(diào)度任務(wù)模塊在操作用戶隊列時需要獲取互斥信號量,用以保證用戶隊列中數(shù)據(jù)的完整性,調(diào)度任務(wù)模塊和用戶隊列的交互則需要使用互斥信號量來保護用戶隊列。 中斷模塊,負責(zé)將調(diào)度任務(wù)模塊創(chuàng)建的硬件定時器進行中斷控制,當(dāng)硬件定時器定時到期后執(zhí)行中斷服務(wù)程序,釋放同步信號量,從而調(diào)度任務(wù)模塊可以繼續(xù)執(zhí)行。如果本發(fā)明的調(diào)度系統(tǒng)要求支持高精度的用戶定時器,則中斷模塊需要高精度的硬件定時器;否貝U,中斷模塊中的硬件定時器可以使用一股的軟中斷定時器替換即可。
權(quán)利要求
1.一種定時器和異步事件的處理方法,其特征在于,包括以下步驟a、系統(tǒng)初始化用戶隊列與就緒隊列,并設(shè)置中斷定時器的中斷周期,所述用戶隊列用于存放用戶任務(wù)需要調(diào)度的異步事件或需要啟動的用戶定時器轉(zhuǎn)換為線程后對應(yīng)的節(jié)點, 所述就緒隊列用于存放調(diào)度任務(wù)需要立即執(zhí)行的從用戶隊列中取出的異步事件線程對應(yīng)的節(jié)點或用戶定時器線程對應(yīng)的節(jié)點;b、調(diào)度任務(wù)檢查就緒隊列,就緒隊列為空時或者執(zhí)行完就緒隊列中所有節(jié)點對應(yīng)的線程直至就緒隊列為空后,調(diào)度任務(wù)檢查用戶隊列;C、調(diào)度任務(wù)檢查用戶隊列,將異步事件線程對應(yīng)的節(jié)點以及已到期的用戶定時器線程對應(yīng)的節(jié)點加入至就緒隊列,系統(tǒng)啟動中斷定時器,并設(shè)置中斷定時器的中斷服務(wù)程序和定時間隔;d、在所述定時間隔到期后,中斷定時器調(diào)用中斷服務(wù)程序釋放一個同步信號量,進入步驟b ;在所述步驟b至d循環(huán)執(zhí)行過程中,當(dāng)用戶任務(wù)有需要調(diào)度的異步事件或需要啟動的用戶定時器時,系統(tǒng)立即將該異步事件或用戶定時器轉(zhuǎn)換為線程,并加入用戶隊列形成用戶隊列的節(jié)點。
2.如權(quán)利要求1所述一種定時器和異步事件的處理方法,其特征在于,步驟c中當(dāng)檢查到用戶隊列中有異步事件線程對應(yīng)的節(jié)點或已經(jīng)到期的用戶定時器線程對應(yīng)的節(jié)點時, 在將以上節(jié)點加入就緒隊列后,系統(tǒng)設(shè)置中斷定時器的定時間隔為零;當(dāng)檢查到用戶隊列中沒有節(jié)點時,系統(tǒng)設(shè)置中斷定時器的定時間隔為系統(tǒng)預(yù)設(shè)的固定值;當(dāng)檢查用戶隊列中僅存在用戶定時器節(jié)點且所有的用戶定時器均未到期時,系統(tǒng)設(shè)置中斷定時器的定時間隔為所有用戶定時器的定時間隔的最小值。
3.如權(quán)利要求2所述一種定時器和異步事件的處理方法,其特征在于,系統(tǒng)初始化時根據(jù)異步事件和定時器的優(yōu)先級或類型,創(chuàng)建不同的用戶隊列或就緒隊列。
4.如權(quán)利要求2或3所述一種定時器和異步事件的處理方法,其特征在于,系統(tǒng)將各用戶任務(wù)需要調(diào)度的異步事件或需要啟動的用戶定時器轉(zhuǎn)換為線程時,將線程控制塊加入用戶隊列形成用戶隊列的節(jié)點,還注明節(jié)點所對應(yīng)線程的類型、優(yōu)先級。
5.如權(quán)利要求4所述一種定時器和異步事件處理的方法,其特征在于,所述中斷定時器為硬件定時器或軟中斷定時器。
6.一種定時器和異步事件的處理系統(tǒng),其特征在于,包括接口模塊、隊列模塊、調(diào)度任務(wù)模塊、中斷模塊;所述接口模塊用于,當(dāng)用戶任務(wù)有需要調(diào)度的異步事件或需要啟動的用戶定時器時, 接口模塊將該異步事件或用戶定時器轉(zhuǎn)換為線程,并加入隊列模塊中的用戶隊列形成用戶隊列的節(jié)點;所述隊列模塊用于,負責(zé)創(chuàng)建和維護用戶隊列與就緒隊列;用戶隊列接收用戶任務(wù)通過接口模塊存入的異步事件線程對應(yīng)的節(jié)點或用戶定時器的線程對應(yīng)的節(jié)點;就緒隊列接收需要被調(diào)度任務(wù)模塊立即執(zhí)行的異步事件線程對應(yīng)的節(jié)點或用戶定時器的線程對應(yīng)的節(jié)占. 所述調(diào)度任務(wù)模塊用于,先檢查就緒隊列,當(dāng)就緒隊列中存在節(jié)點,調(diào)度任務(wù)模塊立即執(zhí)行所有節(jié)點對應(yīng)的線程直至就緒隊列為空;然后檢查用戶隊列,將用戶隊列中的異步事件線程對應(yīng)的節(jié)點和已到期的用戶定時器線程對應(yīng)的節(jié)點加入就緒隊列,加入完畢后啟動中斷定時器并設(shè)置中斷定時器的中斷服務(wù)程序和定時間隔;所述中斷模塊用于,初始化中斷定時器的中斷周期;根據(jù)中斷定時器對調(diào)度任務(wù)模塊進行中斷控制,當(dāng)定時間隔到期后,中斷模塊調(diào)用中斷服務(wù)釋放一個同步信號量給調(diào)度任務(wù)模塊。
7.如權(quán)利要求6所述定時器和異步事件的處理系統(tǒng),其特征在于,所述調(diào)度任務(wù)模塊還用于,當(dāng)檢查用戶隊列中沒有節(jié)點時,調(diào)度任務(wù)模塊設(shè)置中斷定時器的定時間隔為系統(tǒng)預(yù)設(shè)的固定值;當(dāng)檢查用戶隊列中有異步事件線程對應(yīng)的節(jié)點或已經(jīng)到期的用戶定時器線程對應(yīng)的節(jié)點,在將以上節(jié)點加入就緒隊列后,調(diào)度任務(wù)模塊設(shè)置中斷定時器的定時間隔為零;當(dāng)檢查用戶隊列中僅存在用戶定時器節(jié)點且所有的用戶定時器均未到期,調(diào)度任務(wù)模塊設(shè)置中斷定時器的定時間隔為所有用戶定時器的定時間隔的最小值。
8.如權(quán)利要求7所述定時器和異步事件的處理系統(tǒng),其特征在于,所述隊列模塊還用于,根據(jù)異步事件和定時器的優(yōu)先級或類型,創(chuàng)建不同的用戶隊列或就緒隊列。
9.如權(quán)利要求7或8所述定時器和異步事件的處理系統(tǒng),其特征在于,接口模塊還用于,在將異步事件或用戶定時器轉(zhuǎn)換為線程時,將線程控制塊加入用戶隊列形成用戶隊列的節(jié)點,還需注明節(jié)點所對應(yīng)線程的類型、優(yōu)先級。
10.如權(quán)利要求6定時器和異步事件的處理系統(tǒng),其特征在于,所述中斷定時器為硬件定時器或軟中斷定時器。
全文摘要
本發(fā)明提供一種在嵌入式系統(tǒng)中既能確保多個用戶定時器、異步事件的有序控制,又能提高現(xiàn)有用戶定時器、異步事件執(zhí)行效率的方法以及實現(xiàn)該方法的系統(tǒng)。既可以同時啟動多個用戶定時器也可以同時處理多個異步事件,保證了所述技術(shù)方案的通用性,由于用戶定時器和異步事件在一個任務(wù)(本發(fā)明中的調(diào)度任務(wù))的多個線程中同時執(zhí)行,減少了任務(wù)間的切換開銷,提高了執(zhí)行效率,并且通過同步信號量的釋放有序地控制執(zhí)行異步事件或用戶定時器對應(yīng)線程。
文檔編號G06F9/48GK102455940SQ20101052416
公開日2012年5月16日 申請日期2010年10月29日 優(yōu)先權(quán)日2010年10月29日
發(fā)明者徐海兵, 李永合 申請人:邁普通信技術(shù)股份有限公司