專利名稱:使用工作調(diào)度程序初始化多裝置的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及初始化裝置,更具體地講,涉及一種提供被設(shè)計用于使用工作調(diào)度技術(shù)有效地初始化多裝置的手段的方法。
背景技術(shù):
包括多裝置的產(chǎn)品已普遍地增加,并且由于產(chǎn)品的特點在于提供裝置的服務(wù)所以必須將裝置依次初始化。
另外,由于產(chǎn)品變得日益復(fù)雜并且龐大,所以組成產(chǎn)品的裝置的類型和裝置的數(shù)量增加。因此,當(dāng)確定產(chǎn)品的值時,裝置初始化處理已變得更加重要。因而,裝置初始化的關(guān)鍵目的在于在可能的最短時間中執(zhí)行穩(wěn)定的初始化。
圖1是表示傳統(tǒng)的初始化裝置的處理的例子的流程圖。
對于執(zhí)行提供特定服務(wù)的預(yù)定功能的單一裝置,在該裝置準(zhǔn)備好提供其服務(wù)之前裝置驅(qū)動程序必須經(jīng)受用于驅(qū)動該裝置的初始化處理。
也就是說,當(dāng)由嵌入式操作系統(tǒng)啟動控制裝置的裝置驅(qū)動程序(步驟S100)時,檢查對裝置初始化的硬件和/或軟件要求以確定這些要求是否已滿足(步驟S110)。如果初始化要求沒有滿足,則裝置驅(qū)動程序保持在備用狀態(tài)并且裝置被周期性地檢查以觀察那些要求是否已滿足。如果該要求已滿足,則根據(jù)該要求設(shè)置初始值(步驟S120)。然后,執(zhí)行檢查以觀察是否已為裝置驅(qū)動程序的初始化設(shè)置了所有的初始值(步驟S130)。如果所有初始值已被設(shè)置,則裝置被初始化以在提供相關(guān)服務(wù)之前進(jìn)入備用狀態(tài)。也就是說,執(zhí)行服務(wù)備用初始化(步驟S140)。然后,裝置初始化處理終止(步驟S150)。另一方面,如果不是所有初始值已被設(shè)置(步驟S130),則處理返回到檢查初始化要求(步驟S110)。
圖2是表示傳統(tǒng)的初始化多裝置的處理的例子的流程圖。
當(dāng)單一系統(tǒng)包括多裝置時,對于該系統(tǒng)必須依次初始化所有裝置以提供需要每個裝置的初始化的預(yù)定服務(wù)。例如,當(dāng)如在圖2的步驟S210-S230中所示系統(tǒng)包括三個裝置A、B、和C時,裝置A、B、和C被順序地初始化。
裝置初始化方法的特定的非限制性的例子可以是順序地執(zhí)行各種裝置驅(qū)動程序以執(zhí)行裝置初始化的基于x86的Linux系統(tǒng)中的Linux內(nèi)核。在這種情況下,每個裝置驅(qū)動程序模塊探測它支持的裝置,然后它初始化該裝置并以預(yù)定方式向Linux內(nèi)核注冊相關(guān)服務(wù)。因為通過對所有裝置驅(qū)動器模塊重復(fù)上述處理所有裝置被初始化,所以該處理需要幾分鐘來引導(dǎo)。
因此,從圖1和2清楚可知,每次裝置被初始化時,傳統(tǒng)的裝置初始化處理都經(jīng)受因等待周期和重復(fù)的執(zhí)行步驟S110和步驟S130引起的CPU空閑時間。因為大量時間被用于初始化比CPU慢的裝置,所以CPU空閑時間增加,這又降低了裝置初始化處理的效率。因此,非常希望具有一種有效地初始化多裝置而不浪費CPU資源的方法。
發(fā)明內(nèi)容
本發(fā)明提供了一種使用工作調(diào)度技術(shù)有效地初始化包括在系統(tǒng)中的多裝置的方法。
本發(fā)明的一方面提供了一種使用工作調(diào)度程序初始化多裝置的方法。該方法包括確定將被初始化的裝置是否滿足對初始化的要求;關(guān)于已滿足對初始化的要求的裝置執(zhí)行初始化工作;確定是否存在已滿足對初始化的要求的另一裝置;和執(zhí)行上述步驟直到所有其他裝置的初始化已完成。確定裝置是否滿足對初始化的要求的步驟可包括預(yù)先注冊所有的將被初始化的裝置的工作調(diào)度表。最好而非必要地,基于關(guān)于分配的用于初始化工作的CPU時間的信息確定該工作調(diào)度表。
執(zhí)行初始化工作的步驟可包括為已滿足對初始化的要求的裝置設(shè)置預(yù)先指定的初始值;檢查是否所有的初始值已被設(shè)置,并且如果所有的初始值已被設(shè)置,則執(zhí)行初始化以在提供相關(guān)服務(wù)之前進(jìn)入備用狀態(tài)。最好而非必要地,該方法還包括刪除已被初始化以在提供相關(guān)服務(wù)之前進(jìn)入備用狀態(tài)的裝置的工作調(diào)度信息。
該方法還可包括即使關(guān)于當(dāng)前裝置不是所有的初始值已被設(shè)置,也執(zhí)行已滿足對初始化的要求的另一裝置的初始化工作。
通過結(jié)合附圖對其示例性實施例進(jìn)行的描述,本發(fā)明的以上和其他特點及優(yōu)點將會變得清楚,其中 圖1是表示傳統(tǒng)的初始化裝置的處理的例子的流程圖; 圖2是表示傳統(tǒng)的初始化多裝置的處理的例子的流程圖; 圖3是表示根據(jù)本發(fā)明實施例的工作調(diào)度方法的示圖; 圖4是表示根據(jù)本發(fā)明實施例的初始化裝置的全部處理的流程圖; 圖5是表示根據(jù)本發(fā)明實施例的由工作調(diào)度程序執(zhí)行初始化的處理的流程圖;和 圖6是表示根據(jù)本發(fā)明實施例的初始化裝置的處理的流程圖。
具體實施例方式 現(xiàn)在將參照附圖對根據(jù)本發(fā)明的示例性實施例的初始化多裝置的方法進(jìn)行描述。
圖3是表示根據(jù)本發(fā)明實施例的工作調(diào)度方法的示圖。
在圖3中,每個小正方形代表其中CPU工作的時間的最小單位。以下,正方形的寬度被稱為“滴嗒(tick)”。
此外,每個垂直地畫有陰影線的正方形代表用于初始化裝置A的CPU執(zhí)行時間,每個水平地畫有陰影線的正方形代表用于初始化裝置B的CPU執(zhí)行時間,并且每個沒有陰影線的正方形代表CPU空閑時間。例如,在圖3中,當(dāng)初始化裝置A時,CPU執(zhí)行時間和CPU空閑時間分別為5和9滴嗒。當(dāng)初始化裝置B時,CPU執(zhí)行時間和CPU空閑時間都是5滴嗒。
當(dāng)使用傳統(tǒng)的方法時,由于裝置B的初始化跟隨在裝置A的初始化的后面,所以用于初始化兩個裝置的CPU時間是24滴嗒(14滴嗒(裝置A)加上10滴嗒(裝置A))。
然而,在本發(fā)明中,在每個裝置初始化處理期間的CPU空閑時間被適當(dāng)?shù)厥褂靡詼p少初始化時間量。也就是說,當(dāng)如在圖3中所示使用工作調(diào)度時,花費的用于初始化的CPU時間是14滴嗒,這比傳統(tǒng)技術(shù)快10滴嗒。
圖4是表示根據(jù)本發(fā)明實施例的初始化裝置的全部處理的流程圖。
為了初始化組成特定系統(tǒng)的每個裝置,執(zhí)行初始化所需的信息被注冊在該特定系統(tǒng)內(nèi)的物理存儲區(qū)域中或單獨的由軟件實現(xiàn)的數(shù)據(jù)庫中(步驟S410)。該信息可包含裝置標(biāo)識符、關(guān)于初始化參數(shù)的信息、初始化命令、初始化的詳細(xì)資料、和其他信息。
使用該注冊的信息,系統(tǒng)CPU然后指示由軟件實現(xiàn)的工作調(diào)度程序執(zhí)行裝置初始化工作。然后,裝置初始化工作終止(步驟S430)。當(dāng)系統(tǒng)啟動時,工作調(diào)度程序可作為后臺處理器工作。
與初始化工作關(guān)聯(lián)的數(shù)據(jù)結(jié)構(gòu)的例子包括枚舉數(shù)據(jù)類型(job_state),代表枚舉的工作狀態(tài);和結(jié)構(gòu)數(shù)據(jù)類型(device_job),代表用于裝置初始化的單位工作(unit jobs)。
也就是說,枚舉數(shù)據(jù)類型job_state可定義為 enum job_state={hold,do,drop,done,fail} 其中,‘hold’表示其中功能‘do’還不能被執(zhí)行的狀態(tài),‘do’是其中在結(jié)構(gòu)數(shù)據(jù)類型device_job中確定的do_func能被執(zhí)行的狀態(tài),‘drop’是其中裝置不存在或不可用的狀態(tài),并且‘fail’是其中裝置初始化已失敗的狀態(tài)。
結(jié)構(gòu)數(shù)據(jù)類型device_job也可定義如下struct device_job{ priority_level level; job_state lastJobState; job_state(*decide_func)(device_job&); unsigned long decide_timeout; job_state(*do_func)(device_job&); unsigned long do_timeout; }; 這里,‘level’代表初始化工作的優(yōu)先次序,‘lastJobState’是指示device_job 的上一工作狀態(tài)的 job_state數(shù)據(jù)類型,并且‘(*decide_func)(device_job&)’是代表指向確定工作狀態(tài)的函數(shù)的指針的job_state數(shù)據(jù)類型。‘decide_timeout’是工作停留在‘hold’狀態(tài)的以微秒計的最大時間長度,‘(*do_func)(device_job&)’是代表指向?qū)⒃诠ぷ鳡顟B(tài)為‘do’時被執(zhí)行的函數(shù)的指針的job_state數(shù)據(jù)類型。此時,正被執(zhí)行的工作的狀態(tài)也被確定。‘do_timeout’代表do_func被執(zhí)行的以微秒計的最大時間長度。
現(xiàn)在將使用上述的數(shù)據(jù)結(jié)構(gòu)來描述盤裝置的初始化的例子。
盤裝置驅(qū)動程序保持在‘hold’狀態(tài),直到盤驅(qū)動器轉(zhuǎn)速按要求超過最小每分鐘轉(zhuǎn)數(shù)(RPM)。如果滿足了RPM要求,則使用直接存儲器存取(DMA)讀取超級塊。然后,如果從該超級塊讀取的詳細(xì)資料被滿足,則安裝該盤。
如果初始化例程定義為‘module_init’,則在‘module_init’例程中執(zhí)行用于初始化的裝置工作的初始注冊如下 int module_init(void) {device_job*dj; /*Priority_level是10,decide_func是isSpinUp,decide_timeout是4 secs,do_func是doReadSuperBlock,并且do_timeout是1msec*/ dj=addDeviceJob(10,isSpinUp,4000000,doReadSuperBlock,1000); return 0; } 在這種情況下,decide_func和do_func可實現(xiàn)如下 char DmaBuffer[BLOCK_SIZE];/*用于使用DMA讀取盤的緩沖器*/ job_state isSpinUp(device_job&DJ){ /*如果作為探測的結(jié)果,盤驅(qū)動器不存在也不被支持,則返回到drop狀態(tài)*/ if(!ProbeDiscDrive())return drop; /*如果RPM未達(dá)到最小SpinUpRPM,則返回到hold狀態(tài),否則,返回到do狀態(tài)*/ if(regRPM<MinSpinUpRPM)return hold; else return do; } job_state doReadSuperBlock(device_job&DJ) {<!-- SIPO <DP n="5"> --><dp n="d5"/> /*驅(qū)動DMA以將塊0(超級塊)讀入DmaBuffer。*/ if(initiateDMA(DmaBuffer,0)){ /*如果DMA讀取設(shè)置成功,則確定下一decide_func和do_func并返回到hold狀態(tài)*/ setDeviceJob(11,DJ,DMADone,100000,doMount,1000000); /*Priority_level是11,decide_func是DMADone,decide_timeout是100msecs,do_func是doMount,并且do_timeout是1 sec*/ return hold;}else return drop;/*如果它失敗,則返回到drop狀態(tài)*/} job_state isDMADone() { if(isDoneDMA())return do;/*如果DMA傳輸完成,則返回到do狀態(tài)*/ else hold; /*如果它還沒完成,則返回到hold狀態(tài)*/ } job_state doMount() { /*如果讀取到DmaBuffer的詳細(xì)資料指示盤已被成功地安裝,則返回到done狀態(tài)*/ if(mount(DmaBuffer))return done; else return fail; /*如果該盤未能被安裝,則返回到fail狀態(tài)*/ } 圖5是表示根據(jù)本發(fā)明實施例的由工作調(diào)度程序執(zhí)行初始化工作(步驟S420)的處理的流程圖。
為了執(zhí)行初始化工作,首先,確定是否存在滿足對執(zhí)行裝置初始化的要求的工作(步驟S510)。對所有裝置檢查該要求以確定它們是否被滿足。該要求包括所有可在軟件中實現(xiàn)的條件,比如邏輯表達(dá)式、時間、以及隨機數(shù)產(chǎn)生。
最好而非必要地,裝置驅(qū)動程序確定對執(zhí)行初始化的要求是否已被滿足。用于初始化的注冊device_job的處理闡述如下 list DJL;/*device_job的優(yōu)先權(quán)鏈接的列表*/ device_job*addDeviceJob(priority_level level, job_state(*decide_func)(device_job&), unsigned long decide_timeout, job_state(*do_func)(device_job&); unsigned long do_timeout) { device_job*nDJ=new device_job; nDJ->level=level; nDJ->decide_func=decide_func; nDJ->decide_timeout=decide_timeout; nDJ->do_func=do_func; nDJ->do_timeout=do_timeout; DJL.addlist(nDJ); /*將新成員添加到device_job列表*/ return nDJ; } 同時,下面給出用于實際地執(zhí)行初始化工作的處理 while(!DJL.isEmpty())/*連續(xù)執(zhí)行,直到?jīng)]有device_job保留在列表中*/ { device_job*DJ; /*獲得將根據(jù)優(yōu)先權(quán)級別和調(diào)度方法執(zhí)行的具有最高優(yōu)先權(quán)的裝置工<!-- SIPO <DP n="7"> --><dp n="d7"/>作*/ DJ=DJL.getDeviceJob(); /*安裝看門狗定時器以檢查decide_timeout*/ WD=setWatchDog(getCurrentTime(),DJ->decide_timeout,decide_timeout_handler()); /*執(zhí)行decide_func以設(shè)置上一工作狀態(tài)*/ DJ->lastJobState=DJ->decide_func(*DJ); DO_STATE switch(DJ->lastJobState) { case hold/*在hold狀態(tài),除了使看門狗定時器超時之外什么也不做*/ break; case do deleteWatchDog(WD);/*刪除看門狗*/ WD=setWatchDog(getCurmetTime(),DJ->do_timeout,do_timeout_handler()); /*執(zhí)行do_func以設(shè)置上一工作狀態(tài)*/ DJ->lastJobState=DJ->do_func(*DJ); goto DO_STATE;/*轉(zhuǎn)到DO_STATE例程*/ case drop case done case fail default/*在drop、done、fail或其他的情況下,從列表刪除device_job*/ deleteWatchDog(WD);/*刪除看門狗*/ DJL.removeList(DJ);/*從device_job列表刪除當(dāng)前的device_job*/<!-- SIPO <DP n="8"> --><dp n="d8"/> break; }/*switch*/ }/*while*/ 在確定存在已滿足初始化要求的工作之后,從滿足該要求的工作中根據(jù)工作調(diào)度協(xié)議選擇將被執(zhí)行的工作??墒褂帽A粼谙到y(tǒng)內(nèi)的注冊的初始化工作信息(步驟S410)或裝置信息制定工作調(diào)度協(xié)議,或者工作調(diào)度協(xié)議可對操作系統(tǒng)是特定的。例如,可選擇滿足要求的第一個工作。另外,可由公知的調(diào)度方法制定工作調(diào)度協(xié)議。
一旦工作被選擇(步驟S520),則執(zhí)行選擇的工作(步驟S530),如果任何將被執(zhí)行的初始化工作保留在工作調(diào)度程序中(步驟S540),則該處理然后確定是否存在已滿足對初始化的要求的工作(步驟S510)。
圖6是表示根據(jù)本發(fā)明實施例的初始化裝置的處理的流程圖。
具體地講,為了執(zhí)行選擇的工作(圖5中的步驟S530),預(yù)先指定的初始值被設(shè)置(步驟S610),然后被檢查以確定是否已對當(dāng)前選擇的工作設(shè)置了所有的初始值(步驟620)。在這種情況下,可由程序執(zhí)行的所有可能的描述,包括將由裝置驅(qū)動程序執(zhí)行的功能的分配、將出現(xiàn)分支的位置的地址、預(yù)定的方程、和包含執(zhí)行的工作的詳細(xì)資料的腳本,可在初始值設(shè)置中被指定。如果對當(dāng)前選擇的工作設(shè)置了所有的初始值(步驟620),則該裝置被初始化以在提供相關(guān)服務(wù)之前進(jìn)入備用狀態(tài)(步驟S630)。然后,當(dāng)前工作被從工作調(diào)度程序中刪除(步驟S640)。如果不是所有初始值已被設(shè)置(步驟620),則執(zhí)行下一裝置的初始化所需的要求和初始值設(shè)置被分配到工作調(diào)度程序(步驟S650)。
本發(fā)明提供了一種使用工作調(diào)度程序初始化多裝置的方法,由此當(dāng)具有多裝置的系統(tǒng)啟動時有效地減少初始化時間。因此,CPU資源未因當(dāng)初始化多裝置時出現(xiàn)的CPU空閑時間而被浪費。
盡管參照其示例性實施例具體地表示和描述了本發(fā)明,但本領(lǐng)域的普通技術(shù)人員應(yīng)該理解,在不脫離由所附權(quán)利要求限定的本發(fā)明的精神和范圍的情況下,可以對其進(jìn)行形式和細(xì)節(jié)的各種修改。
權(quán)利要求
1、一種初始化多個裝置的方法,包括
確定該多個裝置是否滿足對初始化的要求;
關(guān)于已滿足對初始化的要求的第一裝置執(zhí)行初始化工作;
確定是否存在已滿足對初始化的要求的第二裝置;和
執(zhí)行所有上述步驟直到該多個裝置中的所有裝置的初始化已完成。
2、如權(quán)利要求1所述的方法,其中,確定多個裝置是否滿足對初始化的要求的步驟包括預(yù)先注冊所有的將被初始化的裝置的工作調(diào)度表。
3、如權(quán)利要求2所述的方法,其中,工作調(diào)度表基于關(guān)于分配的用于初始化工作的CPU時間的信息被確定。
4、如權(quán)利要求1所述的方法,其中,執(zhí)行初始化工作的步驟包括
為第一裝置設(shè)置初始值;
檢查是否所有的初始值已被設(shè)置;和
如果所有的初始值已被設(shè)置,則初始化第一裝置以在提供服務(wù)之前進(jìn)入備用狀態(tài)。
5、如權(quán)利要求4所述的方法,還包括在第一裝置已被初始化以進(jìn)入備用狀態(tài)之后,刪除第一裝置的工作調(diào)度信息。
6、如權(quán)利要求4所述的方法,還包括如果對第一裝置不是所有的初始值已被設(shè)置,則執(zhí)行第二裝置的初始化工作。
全文摘要
一種使用工作調(diào)度程序來初始化多裝置的方法。該方法包括確定將被初始化的裝置是否滿足對初始化的要求;關(guān)于已滿足對初始化的要求的裝置執(zhí)行初始化工作;確定是否存在已滿足對初始化的要求的另一裝置;和執(zhí)行上述步驟直到所有其他裝置的初始化已完成。
文檔編號G06F9/445GK1637711SQ20041010171
公開日2005年7月13日 申請日期2004年12月23日 優(yōu)先權(quán)日2003年12月23日
發(fā)明者崔爀丞 申請人:三星電子株式會社