專利名稱::嵌入式c語言環(huán)境下異常處理方法及裝置的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及c語言技術(shù),尤其涉及嵌入式c語言環(huán)境下異常處理技術(shù)。
背景技術(shù):
:異常是指硬件或軟件程序在運(yùn)行時(shí)出現(xiàn)的反常情形。在嵌入式c語言環(huán)境下,傳統(tǒng)的異常處理方法是,當(dāng)發(fā)現(xiàn)異常時(shí),重啟系統(tǒng)。以程序異常為例,可以通過CPU的異常識(shí)別能力,檢查程序運(yùn)行時(shí)是否出現(xiàn)異常,一旦CPU發(fā)現(xiàn)程序運(yùn)行時(shí)出現(xiàn)異常,則調(diào)用異常處理程序,將包含寄存器、當(dāng)前堆棧、調(diào)用棧在內(nèi)的異常信息保存下來,然后按統(tǒng)一的方式完成處理。即,對(duì)于發(fā)生在任務(wù)中的異常,調(diào)試版本下掛起該任務(wù),在正式版本中重啟嵌入式系統(tǒng),對(duì)于發(fā)生在中斷中的異常,則均以重啟嵌入式系統(tǒng)的方式進(jìn)行處理。發(fā)明人經(jīng)過仔細(xì)研究現(xiàn)有技術(shù)后發(fā)現(xiàn),隨著軟件復(fù)雜度的日益增加,系統(tǒng)重啟需要更長的時(shí)間,而產(chǎn)品對(duì)系統(tǒng)的中斷時(shí)間要求越來越短,甚至不希望系統(tǒng)運(yùn)行時(shí)發(fā)生中斷,而在嵌入式c語言環(huán)境下,傳統(tǒng)的異常處理方法無法滿足這樣的需求。
發(fā)明內(nèi)容本發(fā)明實(shí)施例在于提供一種嵌入式c語言環(huán)境下異常處理方法、裝置及嵌入式系統(tǒng),用以實(shí)現(xiàn)當(dāng)異常發(fā)生時(shí),縮短系統(tǒng)的中斷時(shí)間,或者不發(fā)生中斷。一種嵌入式C語言環(huán)境下的異常處理方法,包括監(jiān)控正在運(yùn)行的需要保護(hù)的程序代碼片段,如果所述程序代碼片段出現(xiàn)異常,則拋出所述異常,所述異常包括軟件異常、硬件異常中的至少一種;根據(jù)獲得的所述異常,確定相應(yīng)的異常處理程序,由所述異常處理程序處理所述異常,其中,所述異常處理程序與所述程序代碼片段相互獨(dú)立。一種嵌入式C語言環(huán)境下異常處理裝置,包括監(jiān)控單元,用于監(jiān)控正在運(yùn)行的需要保護(hù)的程序代碼片段;異常拋出單元,用于在所述監(jiān)控單元發(fā)現(xiàn)所述程序代碼片段出現(xiàn)異常后,拋出所述異常,所述異常包括軟件異常、硬件異常中的至少一種;匹配單元,用于根據(jù)獲得的所述異常,確定對(duì)應(yīng)的其中,所述異常處理程序與所述程序代碼片l殳相互獨(dú)立。一種嵌入式C語言環(huán)境下退出線程或進(jìn)程的方法,應(yīng)用于線程主動(dòng)退出的場(chǎng)景,包括獲得線程或進(jìn)程需要退出的信息;檢查需要退出的線程或進(jìn)程所拋出的異常是否仍然占用資源;如果是,則釋放所述占用的資源;退出所述線程或進(jìn)程。一種嵌入式C語言環(huán)境下退出線程或進(jìn)程的裝置,包括信息獲得單元,用于獲得線程或進(jìn)程需要退出的信息;資源檢查單元,用于在所述信息獲得單元獲得線程或進(jìn)程需要退出的信息后,檢查需要退出的線程或進(jìn)程所拋出的異常是否仍然占用資源;資源釋放單元,用于在所述資源檢查單元檢查出需要退出的線程或進(jìn)程所拋出的異常仍然占用資源,釋放所述占用的資源;退出單元,用于在所述資源釋放單元釋放所述占用的資源后,退出所述線程或進(jìn)程。一種嵌入式C語言環(huán)境下刪除線程或進(jìn)程的方法,應(yīng)用于當(dāng)前線程或進(jìn)程被其他線程或進(jìn)程刪除的場(chǎng)景,包括確定需要?jiǎng)h除的線程或進(jìn)程;檢查需要?jiǎng)h除的線程或進(jìn)程所拋出的異常是否仍然占用資源;如果是,則釋放所述占用的資源;刪除所述線程或進(jìn)程。一種嵌入式C語言環(huán)境下刪除線程或進(jìn)程的裝置,包括確定單元,用于確定需要?jiǎng)h除的線程或進(jìn)程;資源檢查單元,用于在所述確定單元確定需要?jiǎng)h除的線程或進(jìn)程后,檢查需要?jiǎng)h除的線程或進(jìn)程所拋出的異常是否仍然占用資源;資源釋放單元,用于在所述資源檢查單元檢查出需要?jiǎng)h除的線程或進(jìn)程所拋出的異常仍然占用資源,釋放所述占用的資源;線程或進(jìn)程刪除單元,用于在所述資源釋放單元釋放所述占用的資源后,刪除所述線程或進(jìn)程。一種嵌入式系統(tǒng),包括上述異常處理裝置。在本發(fā)明實(shí)施例的嵌入式C語言環(huán)境下異常處理方法、裝置及嵌入式系統(tǒng)中,如果程序代碼片段出現(xiàn)異常,則不是簡(jiǎn)單的重新運(yùn)行程序代碼片段,而是由獨(dú)立于程序代碼片段的異常處理程序來處理異常,這樣,程序在運(yùn)行時(shí),就不會(huì)因?yàn)楫惓6袛噙\(yùn)行,滿足了產(chǎn)品不希望系統(tǒng)運(yùn)行時(shí)發(fā)生中斷的需求。在本發(fā)明實(shí)施例的嵌入式C語言環(huán)境下退出或刪除線程或進(jìn)程的方法中,無論是退出或者刪除線程或進(jìn)程,都可以釋放處理線程或進(jìn)程拋出的異常所占用的資源,這樣,當(dāng)其他線程或進(jìn)程需要使用這些資源時(shí),不會(huì)因?yàn)闊o法使用這些資源。另外,還可以由其他線程刪除所需要?jiǎng)h除的線程,從而可以實(shí)現(xiàn)跨線程刪除線程時(shí)的異常處理。圖1為本發(fā)明實(shí)施例的嵌入式C語言環(huán)境下異常處理方法的流程圖;圖2為本發(fā)明實(shí)施例的嵌入式C語言環(huán)境下異常處理裝置的結(jié)構(gòu)示意圖4為本發(fā)明的嵌入式C語言環(huán)境下異常處理方法一具體實(shí)施例的流程圖5為本發(fā)明實(shí)施例的堆空間存儲(chǔ)異常相關(guān)信息的存儲(chǔ)布局示意圖6為本發(fā)明實(shí)施例的try塊的實(shí)現(xiàn)流程圖7為本發(fā)明實(shí)施例的except塊的實(shí)現(xiàn)流程圖8為本發(fā)明實(shí)施例的捕捉某種特定異常的實(shí)現(xiàn)流程圖9為本發(fā)明實(shí)施例的捕捉處理指定異常的實(shí)現(xiàn)流程圖10為本發(fā)明實(shí)施例的捕捉和處理某一異常區(qū)間內(nèi)的異常的實(shí)現(xiàn)流程圖11為本發(fā)明實(shí)施例的throw塊的實(shí)現(xiàn)流程圖;圖12為本發(fā)明實(shí)施例的異常處理的精細(xì)管理方法的流程圖;圖13為本發(fā)明實(shí)施例的退出線程或進(jìn)程的方法的流程圖;圖14為本發(fā)明實(shí)施例的退出線程或進(jìn)程的裝置的結(jié)構(gòu)示意圖;圖15為本發(fā)明實(shí)施例的刪除線程或進(jìn)程的方法的流程圖;圖16為本發(fā)明實(shí)施例的刪除線程或進(jìn)程的裝置的結(jié)構(gòu)示意圖。具體實(shí)施例方式為使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下參照附圖并舉實(shí)施例,對(duì)本發(fā)明作進(jìn)一步詳細(xì)說明。在本發(fā)明實(shí)施例中,對(duì)于C語言環(huán)境下嵌入式系統(tǒng)中的異??梢愿鶕?jù)不同場(chǎng)景編寫具有針對(duì)性的異常處理程序,進(jìn)行局部異常處理并嘗試恢復(fù),而不必對(duì)所有異常都作重啟系統(tǒng)處理,在異常處理完畢后繼續(xù)執(zhí)行,從而提高正常流程下的代碼運(yùn)行效率,也簡(jiǎn)化了編程。在C語言環(huán)境下嵌入式系統(tǒng)中異常處理框架(方便理解,可稱為異常處理裝置)的實(shí)現(xiàn)不依賴于編譯器,并且提供給用戶對(duì)異常處理框架進(jìn)行精細(xì)管理的方法。本發(fā)明實(shí)施例中,提供了多種嵌入式C語言環(huán)境下的異常處理方法,其中的一種方法如圖l所示,包括步驟S101:監(jiān)控正在運(yùn)行的需要保護(hù)的程序代碼片段;步驟S102:如果所述程序代碼片段出現(xiàn)異常,則拋出所述異常,所述異常包括軟件異常、硬件異常中的至少一種;需要說明的是本發(fā)明實(shí)施例的方案不僅適用于軟件異常,還適用于硬件異常;當(dāng)發(fā)生硬件異常后,可以嘗試恢復(fù)異常,避免重啟系統(tǒng);步驟S103:根據(jù)獲得的所述異常,確定相應(yīng)的異常處理程序,由所述異常處理程序處理所述異常,其中,所述異常處理程序與所述程序代碼片^:相互獨(dú)立。為了提供對(duì)異常拋出時(shí)異常處理級(jí)別的精細(xì)管理,在本發(fā)明實(shí)施例中,所述監(jiān)控正在運(yùn)行的需要保護(hù)的程序代碼片段的步驟具體為根據(jù)設(shè)置的處理異常的粒度,監(jiān)控正在運(yùn)行的需要保護(hù)的程序代碼片段;當(dāng)一程序執(zhí)行觸發(fā)異常時(shí),在一種實(shí)現(xiàn)下,當(dāng)正在運(yùn)行的需要保護(hù)的程序代碼片段大于或等于設(shè)置的處理異常的粒度時(shí),則監(jiān)控所述正在運(yùn)行的需要保護(hù)的程序代碼片段;當(dāng)正在運(yùn)行的需要保護(hù)的程序代碼片段小于設(shè)置的處理異常的粒度時(shí),則不監(jiān)控所述正在運(yùn)行的需要保護(hù)的程序代碼片段,也就是說,就不需要執(zhí)行后續(xù)的步驟;這里的,所述設(shè)置的處理異常的粒度包括函數(shù)級(jí)別、模塊級(jí)別、部件級(jí)別中的至少一種,其中,所述模塊由多個(gè)函數(shù)組成,所述部件由多個(gè)模塊組成。例如,用戶在調(diào)試階段設(shè)置處理異常的粒度為函數(shù)級(jí)別;當(dāng)代碼穩(wěn)定后,用戶設(shè)置處理異常的粒度為模塊級(jí)別,則代碼在拋出異常時(shí)只識(shí)別模塊級(jí)的異常。在本發(fā)明實(shí)施例中,所述方法進(jìn)一步包括申請(qǐng)用于記錄與異常相關(guān)的信息的存儲(chǔ)空間;則,在所述程序代碼片段出現(xiàn)異常之后,拋出所i4異常之前,記錄與異常相關(guān)的信息。應(yīng)當(dāng)理解的是將與異常相關(guān)的信息記錄在申10請(qǐng)的存儲(chǔ)空間中。在本發(fā)明實(shí)施例中,所述拋出所述異常的步驟,在一種實(shí)現(xiàn)下,具體為將所述與異常相關(guān)的信息打包后傳遞出去,這里,所述與異常相關(guān)的信息至少包括異常類型標(biāo)識(shí),應(yīng)當(dāng)說明的是異常類型標(biāo)識(shí)是用于表示當(dāng)前程序代碼片段出現(xiàn)的異常的類型的信息,形式上可以采用數(shù)字,或者字符,或者數(shù)字和字符的組合,例如采用不同的字符串表示不同異常類型。應(yīng)當(dāng)理解的是本發(fā)明實(shí)施例適用不同類型的異常,在一種實(shí)現(xiàn)下,預(yù)先可以給不同的具體異常類型分配不同的標(biāo)識(shí),例如將異常統(tǒng)一分成a、b、c、d、e、f(小類),并且同時(shí)用另一個(gè)標(biāo)識(shí)區(qū)分哪些是軟件異常,哪些是硬件異常(大類),例如1表示軟件異常;0表示硬件異常;需要說明的是這僅是一個(gè)例子,不用于限制本發(fā)明實(shí)施例方案。在本發(fā)明實(shí)施例中,根據(jù)獲得的所述異常,確定相應(yīng)的異常處理程序,由所述異常處理程序處理所述異常的步驟,在一種實(shí)現(xiàn)下,可以包括獲得傳遞過來的與異常相關(guān)的信息,所述與異常相關(guān)的信息中包含異常類型標(biāo)識(shí);確定與所述異常類型標(biāo)識(shí)對(duì)應(yīng)的異常類型所匹配的異常處理程序,由所述異常處理程序處理所述異常。因此,本發(fā)明實(shí)施例針對(duì)不同類型的異常進(jìn)行不同處理,避免現(xiàn)有技術(shù)在遇到異常時(shí),重啟系統(tǒng),導(dǎo)致系統(tǒng)中斷時(shí)間長的問題。述異常處理程序處理所述異常的步驟包括當(dāng)所述異常類型標(biāo)識(shí)對(duì)應(yīng)的異常類型與能處理的一種特殊的異常類型匹配時(shí),由與該異常類型匹配的異常處理程序處理該異常;或,當(dāng)所述異常類型標(biāo)識(shí)對(duì)應(yīng)的異常類型與能處理的至少一種異常類型中的一種異常類型匹配時(shí),由與該異常類型匹配的異常處理程序處理該異常,其中,能處理的至少一種異常類型可以是數(shù)組指定的類型,或者是異常區(qū)間內(nèi)的類型;或,當(dāng)存在能處理任何類型異常的異常處理程序時(shí),確定由該匹配任意類型異常的異常處理程序處理所述異常。需要理解的是在一種實(shí)現(xiàn)下,可以由宏確定與所述異常類型標(biāo)識(shí)對(duì)應(yīng)的異常類型所匹配的異常處理程序,這個(gè)宏的形式為EXCEPT,該宏可以帶有異常類型參數(shù),也可以不帶有異常類型參數(shù);在該宏帶有異常類型參數(shù)的情況下,具體匹配過程可以包括獲得線程異常信息(即與異常相關(guān)的信息);判斷線程異常信息中的異常類型標(biāo)識(shí)是否與異常類型參數(shù)中的一種匹配;如果匹配,則執(zhí)行相應(yīng)的異常處理程序;如果不匹配,則重新傳遞(拋出)異常信息。在該宏不帶有異常類型參數(shù)的情況下,任何類型的異常都將被相應(yīng)異常處理程序處理,換句話說,EXCEPT宏一旦獲得異常,就交由與所述程序代碼片段位置最近的一個(gè)異常處理程序去處理異常,也就起到了捕捉所有類型異常的作用。該宏不帶有異常類型參數(shù)時(shí),包括異常類型標(biāo)識(shí)的異常信息還是傳遞到except塊宏作處理,用戶編寫的異常處理程序可以不加區(qū)分的進(jìn)^f亍統(tǒng)一處理。本發(fā)明實(shí)施例的方法進(jìn)一步包括如果當(dāng)前不存在與該異常類型匹配的異常處理程序時(shí),將獲得的與異常相關(guān)的信息重新傳遞出去,或者,當(dāng)都匹配不上時(shí),啟動(dòng)默認(rèn)處理程序,所述默認(rèn)處理程序?yàn)橹貑⑾到y(tǒng)。為了進(jìn)一步的提供對(duì)異常處理方式的精細(xì)管理,在本發(fā)明實(shí)施例中,根據(jù)獲得的所述異常,確定相應(yīng)的異常處理程序,由所述異常處理程序處理所述異常的步驟,在另一種實(shí)現(xiàn)下,可以包括獲得傳遞過來的與異常相關(guān)的信息,所述與異常相關(guān)的信息中包含異常類型標(biāo)識(shí)、指定處理方式標(biāo)識(shí);需要說明的是可以通過不同的指定處理方式標(biāo)識(shí)表示不同的指定處理方式,例如l表示容錯(cuò)的處理方式;0表示查錯(cuò)的處理方式。確定與所述異常類型標(biāo)識(shí)對(duì)應(yīng)的異常類型所匹配,且與所述的指定處理方式標(biāo)識(shí)對(duì)應(yīng)的處理方式所匹配的異常處理程序,由所述異常處理程序處理所述異常。其中,處理方式可以為容錯(cuò)或查錯(cuò)。當(dāng)所述處理方式是容錯(cuò)處理方式,由容錯(cuò)方式的異常處理程序處理所述異常;當(dāng)所述處理方式是查錯(cuò)處理方式,由查錯(cuò)方式的異常處理程序處理所述異常,其中,所述異常處理程序與所述程序代碼片^:相互獨(dú)立。如果當(dāng)前不存在與該異常類型匹配,且與指定的處理方式匹配的異常處理程序時(shí),將獲得的與異常相關(guān)的信息重新傳遞出去,或者,當(dāng)都匹配不上時(shí),啟動(dòng)默認(rèn)處理程序,所述默認(rèn)處理程序?yàn)橹貑⑾到y(tǒng)。而且還能根據(jù)用戶設(shè)置的方式對(duì)異常以不同的處理方式進(jìn)行處理,例如,在開發(fā)階段,對(duì)異常的處理主要方法是捕獲異常處理錯(cuò)誤并輸出錯(cuò)誤,而在開發(fā)完成產(chǎn)品發(fā)布時(shí),異常處理的主要方法是容錯(cuò)恢復(fù)。本發(fā)明實(shí)施例中的異常處理程序還能夠匹配和處理多種類型的異常。如果有多個(gè)與所述異常類型相匹配的異常處理程序,則確定與所述異常類型標(biāo)識(shí)對(duì)應(yīng)的異常類型所匹配的,且與所述程序代碼片段位置最近的一個(gè)異常處理程序。如果所述程序代碼片段被調(diào)用時(shí)出現(xiàn)異常,則由所述異常處理程序處理所述異常之后,還包括逐級(jí)返回所述程序代碼片段正常運(yùn)行后的結(jié)果,或高正常流程下的代碼運(yùn)行效率。在一種實(shí)現(xiàn)下,由匹配和捕捉異常功能的宏來匹配和捕捉異常;由具有監(jiān)控功能的宏來監(jiān)控正在運(yùn)行的需要保護(hù)的程序代碼片段;由具有拋出異常功能的宏來拋出所述異常。具體的,程序代碼片段可以是指函數(shù),也可以是指由多個(gè)函數(shù)組成的模塊,還可以是指由多個(gè)模塊組成的部件,當(dāng)然,程序代碼片段還可以是其他級(jí)別的程序段,這里不再——列舉。在嵌入式C語言環(huán)境下,可以由具有監(jiān)控功能的宏來監(jiān)控程序代碼片段,例如可以由封裝C語言的setjmp()函數(shù)的宏。當(dāng)程序代碼片段在運(yùn)行過程中出現(xiàn)異常時(shí),需要拋出異常,而在拋出異常之前,可以記錄與異常相關(guān)的信息,這樣,拋出異常時(shí),可以拋出與異常相關(guān)的信息。與異常相關(guān)的信息既可以包括軟件異常信息,也可以包括硬件異常信息。在嵌入式C語言環(huán)境下,可以由具有拋出異常功能的宏來拋出異常,例如可以由封裝C語言的longjmp()函數(shù)的宏。針對(duì)需要保護(hù)的程序代碼片段,可以建立至少一個(gè)異常處理程序。每個(gè)異常處理程序可以匹配和處理一種類型的異常,也可以匹配和處理多種類型13的異常。不同的異常處理程序可以處理同一種類型的異常,當(dāng)異常被拋出時(shí),可以從中選擇一個(gè)異常處理程序來處理這種類型的異常,例如,可以選擇一個(gè)與所述程序代碼片段最近的一個(gè)異常處理程序處理所述異常。具體的,假設(shè)某個(gè)程序代碼片段之后分別有程序A、程序B和程序C等能夠處理同一個(gè)異常的異常處理程序,當(dāng)程序代碼片段拋出異常時(shí),如果沒有特殊設(shè)置,則一般都由程序A(在程序代碼片段之后,在所有的能夠處理所述異常的異常處理程序中位置相對(duì)于該程序代碼片段最靠前)來處理所述異常。需要說明的是,異常處理程序與程序代碼片段是相互獨(dú)立的,這樣至少有兩個(gè)優(yōu)點(diǎn)第一個(gè)優(yōu)點(diǎn)是,程序代碼片段在運(yùn)行過程中如果沒有出現(xiàn)異常,則異常處理程序不會(huì)被執(zhí)行,從而不影響程序代碼片段的正常運(yùn)行,客觀上也提高了程序代碼片段的運(yùn)行效率;第二個(gè)優(yōu)點(diǎn)是,可以給用戶提供是否由在實(shí)際應(yīng)用中,程序代碼片段可能是在被調(diào)用過程中出現(xiàn)異常,由與所述異常的類型相匹配的異常處理程序處理所述異常之后,可以逐級(jí)返回的是程序代碼片段正常運(yùn)行后的結(jié)果。例如,函數(shù)A調(diào)用函數(shù)B,函數(shù)B調(diào)用函數(shù)C,如果函數(shù)C在運(yùn)行時(shí)發(fā)生異常,并且存在與異常的類型相匹配的異常處理程序,則可以由異常處理程序處理異常,處理異常后,函數(shù)C可以正常運(yùn)行,其正常運(yùn)行的結(jié)果可以返回給函數(shù)B,函數(shù)B再將函數(shù)B的運(yùn)行結(jié)果返回給函數(shù)A。由此可見,即使函數(shù)B調(diào)用函數(shù)C時(shí),函數(shù)C運(yùn)行出現(xiàn)異常,但對(duì)于函數(shù)A和函數(shù)B來說,這個(gè)或這些異常都是不被發(fā)現(xiàn)的,函數(shù)A和函數(shù)B得到的分別是函數(shù)B正常運(yùn)行的結(jié)果和函數(shù)C正常運(yùn)行的結(jié)果。另外,所述異常處理程序之后的程序代碼片段。還是以上面的例子為例,即使由異常處理程序處理異常,但不再返回執(zhí)行函數(shù)C,而是執(zhí)行后續(xù)的程序代碼片段,后續(xù)的程序代碼片段可以是指與異常處理程序相鄰且在其位置之后的程序代碼片段,也可以是指異常處理程序之后的任意一個(gè)程序代碼片段。在嵌入式C語言環(huán)境下,可以由由用C語言實(shí)現(xiàn)的具有匹配和捕捉異常功能的宏來匹配和捕4足異常,例如可以由封裝C語言的setjmp()函-t被調(diào)用后返回非0值的else分支的宏。、其中的一種嵌入式C語言環(huán)境下異常處理裝置(也可以稱為異常處理框架)如圖2所示,包括監(jiān)控單元201,用于監(jiān)控正在運(yùn)行的需要保護(hù)的程序代碼片段;異常拋出單元202,用于在監(jiān)控單元201發(fā)現(xiàn)所述程序代碼片段出現(xiàn)異常后,拋出所述異常,所述異常包括軟件異常、硬件異常中的至少一種;匹配單元203,用于根據(jù)獲得的所述異常,確定對(duì)應(yīng)的異常處理程序,所述異常處理程序用于處理所述異常拋出單元拋出的異常,其中,所述異常處理程序與所述程序代碼片段相互獨(dú)立。在嵌入式C語言環(huán)境下,將具有監(jiān)控功能的宏模塊化即監(jiān)控單元,例如可以是封裝C語言的setjmp()函數(shù)的宏。另外,上述裝置還可以包括信息記錄單元204,用于記錄與監(jiān)控單元201發(fā)現(xiàn)的所述程序代碼片段出現(xiàn)的異常相關(guān)的信息,并輸出給所述異常拋出單元202。這樣,異常拋出單元202在拋出異常時(shí),可以拋出與異常相關(guān)的信息。與異常相關(guān)的信息既可以包括軟件異常信息,也可以包括硬件異常信息。在C語言環(huán)境下,將具有拋出異常功能的宏模塊化即異常拋出單元202,例如可以是封裝C語言的longjmp()函lt的宏。異常拋出單元202為第一異常拋出單元,用于在監(jiān)控單元201發(fā)現(xiàn)所述程序代碼片段出現(xiàn)異常后,將所述與異常相關(guān)的信息打包后傳遞出去,所述與異常相關(guān)的信息至少包括異常類型標(biāo)識(shí),所述異常類型標(biāo)識(shí)用于表示當(dāng)前程序代碼片段出現(xiàn)的異常的類型。匹配單元203為第一匹配單元,用于獲得傳遞過來的與異常相關(guān)的信息,所述與異常相關(guān)的信息中包含異常類型標(biāo)識(shí),并確定與所述異常類型標(biāo)識(shí)對(duì)應(yīng)的異常類型所匹配的異常處理程序,由所述異常處理程序處理所述異常。匹配單元203為第二匹配單元,用于獲得傳遞過來的與異常相關(guān)的信息,所述與異常相關(guān)的信息中包含異常類型標(biāo)識(shí)、指定處理方式標(biāo)識(shí),并確定與所述異常類型標(biāo)識(shí)對(duì)應(yīng)的異常類型所匹配,且與所述的指定處理方式標(biāo)識(shí)對(duì)應(yīng)的處理方式所匹配的異常處理程序,由所述異常處理程序處理所述異常。例如,可以設(shè)置函數(shù)級(jí)別的異常處理程序,也可以設(shè)置模塊級(jí)別的異常處奨程序,還可以設(shè)置部件級(jí)別的異常處理程序,假設(shè)對(duì)應(yīng)這三個(gè)級(jí)別的異常處理程序都能夠處理同一個(gè)類型的異常,但處理方式各不相同。用戶可以選擇處理異常的級(jí)別,假設(shè)用戶選擇了模塊級(jí)別,其對(duì)應(yīng)的異常處理程序的處理方式是容錯(cuò)處理,當(dāng)需要保護(hù)的程序代碼片段在運(yùn)行過程中出現(xiàn)異常,則處理異常的就是模塊級(jí)別對(duì)應(yīng)的異常處理程序,即,對(duì)異常采取容錯(cuò)方式處理。處理方式可以包括容錯(cuò)和查錯(cuò)等多種方式,當(dāng)程序代碼片段出現(xiàn)異常時(shí),可以根據(jù)設(shè)置的處理方式處理異常。例如,如果設(shè)置的處理方式是容錯(cuò)處理方式,則可以使用容錯(cuò)方式的異常處理程序處理異常。再例如,如果設(shè)置處理方式是查錯(cuò)處理方式,則可以使用查錯(cuò)方式的異常處理程序處理異常,其中,異常處理程序與程序代碼片,爻相互獨(dú)立。如果有多個(gè)與所述異常的類型相匹配的異常處理程序,匹配單元203為第三匹配單元,用于根據(jù)獲得的所述異常,確定與所述異常的類型所匹配的,且與所述程序代碼片段位置最近的一個(gè)異常處理程序,由所述異常處理程序處理所述異常。在一程序執(zhí)行觸發(fā)異常時(shí),監(jiān)控單元201為第一監(jiān)控單元,用于根據(jù)設(shè)置的處理異常的粒度監(jiān)控所述正在運(yùn)行的需要保護(hù)的程序代碼片段。例如當(dāng)設(shè)置的處理異常的粒度為模塊級(jí)別時(shí),而所述正在運(yùn)行的需要保護(hù)的程序代碼片段是函數(shù)級(jí)別,則就不需要監(jiān)控所述正在運(yùn)行的需要保護(hù)的程序代碼片段;當(dāng)設(shè)置的處理異常的粒度為函數(shù)級(jí)別時(shí),而所述正在運(yùn)行的需要保護(hù)的程序代碼片段是模塊級(jí)別,則監(jiān)控所述正在運(yùn)行的需要保護(hù)的程序代碼片段;針對(duì)需要保護(hù)的程序代碼片段,可以建立至少一個(gè)異常處理程序。每個(gè)異常處理程序可以匹配和處理一種類型的異常,也可以匹配和處理多種類型的異常。不同的異常處理程序可以處理同一種類型的異常,當(dāng)異常拋出單元202拋出異常時(shí),可以由匹配單元203從中選擇一個(gè)異常處理程序來處理這種類型的異常,例如,可以選擇一個(gè)與所述程序代碼片段最近的一個(gè)異常處理程序處理所述異常。在實(shí)際應(yīng)用中,程序代碼片段可能是在被調(diào)用過程中出現(xiàn)異常,在匹配單元203確定與所述異常的類型相匹配的異常處理程序,由該異常處理程序處理所述異常之后,程序代碼片段可以逐級(jí)返回正常運(yùn)行后的結(jié)果『在(嵌入式C語言環(huán)境下,將由C語言實(shí)現(xiàn)的具有匹配和捕捉異常功能的宏模塊化即16匹配單元203,例如可以是封裝C語言的setjmp()函數(shù)被調(diào)用后返回非0值的else分支的宏。需要說明的是,由于不同的異常處理程序可以適用于不同的異常,為方便識(shí)別異常類型,可以給不同的異常類型分配不同的標(biāo)識(shí),例如將異常統(tǒng)一分成a、b、c、d、e、f(小類),并且同時(shí)用另一個(gè)標(biāo)識(shí)區(qū)分哪些是軟件異常,哪些是硬件異常(大類),例如1表示軟件異常;0表示硬件異常。具體的,如圖3所示,首先獲得傳遞過來的與異常相關(guān)信息(簡(jiǎn)稱異常信息),該異常信息中包含異常類型標(biāo)識(shí),經(jīng)過宏的匹配,確定與該異常類型標(biāo)識(shí)對(duì)應(yīng)的異常類型匹配的異常處理程序,由相應(yīng)的異常處理程序處理相應(yīng)的異常類型的異常。除上述方法實(shí)施例和異常處理框架實(shí)施例外,本發(fā)明還提供了嵌入式系統(tǒng),所述系統(tǒng)包括上述異常處理裝置(即異常處理框架)。具體請(qǐng)參見上述對(duì)異常處理框架的描述,這里不再贅述。除上述方法實(shí)施例外,本發(fā)明還提供了另外一個(gè)方法實(shí)施例。具體的,如圖4所示,包括步驟S401:執(zhí)行程序代碼;步驟S402:判斷是否觸發(fā)異常,如果是,則轉(zhuǎn)步驟S403,否則,轉(zhuǎn)步驟S401;步驟S403:根據(jù)處理異常的粒度,確定與粒度對(duì)應(yīng)的try塊(為描述方便,這里用try塊表示具有監(jiān)控功能的宏);步驟S404:判斷try塊是否有except塊(為描述方便,這里用except塊表示具有捕捉和匹配異常功能的宏),如果是,轉(zhuǎn)步驟S406,否則,轉(zhuǎn)步驟S405;步驟S405:確定更高一級(jí)粒度對(duì)應(yīng)的try塊,轉(zhuǎn)步驟S404;步驟S406:判斷except塊是否能夠處理異常,如果是,轉(zhuǎn)步驟S407,否則,轉(zhuǎn)步驟S405;步驟S407:執(zhí)行except塊的代碼,轉(zhuǎn)步驟S401。本發(fā)明實(shí)施例首先在嵌入式C語言環(huán)境下建立異常記錄信息,建立異常相關(guān)信息的存儲(chǔ)和傳遞模型,最終實(shí)現(xiàn)異常關(guān)聯(lián)的機(jī)制和用戶接口。l.關(guān)于異常記錄信息表1為異常記錄信息的一種表現(xiàn)形式。<table>tableseeoriginaldocumentpage18</column></row><table>表1在嵌入式c語言環(huán)境下,為了實(shí)現(xiàn)異常處理,需要定義異常記錄結(jié)構(gòu),將異常信息保存在該結(jié)構(gòu)中,傳遞給except塊,except塊可以根據(jù)異常記錄信息來決定處理的方式。異常記錄信息如下列代碼中的注釋所示typedefstruct—VOS—SEH—REC〃異常記錄信息VOS一UINT32ulSehType;〃定義的硬件或軟件異常類型VOS—UINT32ulSehErrOrlntCode;〃軟件異常情況下為錯(cuò)誤碼信息,硬件異常情況下標(biāo)識(shí)是否在中斷中異常VOS—UINT32ulSehFlag;〃異常是否可繼續(xù)的標(biāo)識(shí)struct—VOS—SEH—REC*pSehNextRec;〃記錄異常處理過程中嵌套的異常VOS—EXC—REG—INFO*pExcRegs;〃ulSehType為硬件異常時(shí)其指向CPU寄存器信息記錄,軟件異常時(shí)為空VOS—UINT32ulSehAddr;〃發(fā)生異常的指令地址VOS—UINT32ulSehParaNums;〃異常附加參數(shù)數(shù)目VOS—UINT32a—Sehlnfo[EXC—MAX—PARA—NUM];〃異常附加參數(shù)信自VOS—CHARscSehMsg[32];〃異常描述字符串}VOS—SEH—REC;2:關(guān)于異常相關(guān)信息的存儲(chǔ)和傳遞模型在嵌入式C語言環(huán)境下,為支持異常嵌套處理和對(duì)多線程異常的處理,需要存儲(chǔ)異常相關(guān)信息,并根據(jù)其生命周期的特點(diǎn)選擇適當(dāng)?shù)拇鎯?chǔ)和傳遞模型。異常相關(guān)信息包括(1)每個(gè)try塊保存其運(yùn)行上下文環(huán)境的env信息(info);(2)發(fā)生異常后的異常記錄信息(即前面定義的VOS—SEH—REC);(3)各線程的異常狀態(tài)控制表。從具有拋出異常功能的宏到具有匹配和捕捉異常功能的宏的信息采用線程范圍的棧來存儲(chǔ)和傳遞,其中,env信息所需存儲(chǔ)空間需要滿足try塊最大嵌套層次的深度,而異常記錄信息存儲(chǔ)空間則需要滿足一次嵌套的最大深度,因此,可以考慮以線程為單位,在線程創(chuàng)建后,分配線程堆空間來存儲(chǔ)異常相關(guān)信息,存儲(chǔ)布局示意可以參照?qǐng)D5。env信息是各線程正常運(yùn)行期間高度動(dòng)態(tài)的信息,每個(gè)線程都保留一份。exc信息(info)則只在線程運(yùn)行異常情況下才出現(xiàn),各線程間可以共享使用。env信息把所有可回溯的環(huán)境記錄串聯(lián)起來形成異常范圍表,在throw塊(為描述方便,這里用throw塊表示具有拋出異常功能的宏)操作時(shí)通過訪問該表來獲得相匹配的except塊,該表存儲(chǔ)單元需記錄的信息如表2所示中斷背景設(shè)置標(biāo)志記錄有j丈標(biāo)志設(shè)置異常的文件設(shè)置異常的行號(hào)記錄鏈表(調(diào)試,可選)(調(diào)試,可選)表2具體的數(shù)據(jù)結(jié)構(gòu)如下typedefstruct—SEH—SCOPE—UNIT〃異常范圍表VOS—BOOLbllntFlag;〃是否在中斷背景下設(shè)置標(biāo)志jmp一bufseh—env;〃記錄有效標(biāo)志#ifdefSEH—DEBUG〃異常調(diào)試VOS—CHAR*pSehSetFile;〃設(shè)置異常的文件VOS—UINT32ulSehSetLine;〃設(shè)置異常的行號(hào)#endifstruct—SEH—SCOPE—UNIT*seh—next;〃記錄鏈表}SEH—SCOPE—UNIT;exc信息把異常記錄信息記錄下來,在throw塊(相當(dāng)于上述裝置中的異常拋出單元)操作時(shí),將該結(jié)構(gòu)做為信息參數(shù)傳遞給相匹配的except塊(相當(dāng)于上述裝置中的匹配單元)來處理,如果其中發(fā)生異常嵌套,則將信息進(jìn)行串聯(lián)。需記錄的信息如表3所示19<table>tableseeoriginaldocumentpage20</column></row><table>具體數(shù)據(jù)結(jié)構(gòu)如下typedefstruct—SEH—EXC—INFOVOSJJINT32ulMagic;〃信息有效標(biāo)志VOS—SEH—RECseh—rec;〃異常記錄}SEH—EXC—INFO;各線程間共享的SEH—EXC—INFO緩沖區(qū)分配控制信息表如表4所示:<table>tableseeoriginaldocumentpage20</column></row><table>具體數(shù)據(jù)結(jié)構(gòu)如下typedefstruct—SEH—INFO—BUF—CTRL〃緩沖區(qū)分配控制信息表VOS—UINT32ulMaxExcInfoNum;〃異常最大信息塊數(shù)VOS—UINT32ulUsedExcInfoNum;〃已分配信息塊數(shù)SEH—EXC—INFO*pExcInfoBufFreeLink;〃空閑異常信息塊鏈表}SEH—INFO—BUF—CTRL;在線程創(chuàng)建成功后,分配的異常狀態(tài)控制表(excctrl)信息如表5所示<table>tableseeoriginaldocumentpage20</column></row><table>具體數(shù)據(jù)結(jié)構(gòu)如下typedefstruct—SEHTH—CTRL/*控制信息*/VOSJJINT32ulMaxScopeLayer;〃線程try塊最大嵌套層數(shù)VOS—UINT32ulMaxExcNestNum;〃線程異常最大嵌套層數(shù)SEH_SCOPE—UNIT*pScopeUnitFreeLink;〃空閑范圍塊鏈表/*狀態(tài)信息*/^VOS—UINT32u正xceptNestCnt;〃線程異常嵌套記數(shù)VOSJJINT32ulSehStatusFlag;〃線程異常當(dāng)前狀態(tài)SEH—EXC—INFO*pSehExcInfo;〃異常現(xiàn)場(chǎng)信息地址SEH_SCOPE_UINT*pScopeTableHead;〃異常范圍鏈表頭}SEH—TH—CTRL;其中,ulSehStatusFlag標(biāo)志有六種狀態(tài),分別是SEH_STAT_NON(無異常情況下的初始值必須為0),SEH—STAT—UNHANDLE(未處理異常),SEH—STATHANDLED(已處理),SEH—STAT—CONTINUESEARCH(繼續(xù)回溯異常處理塊),SEH—STAT—CONTINUE—REDO(從異常處重新執(zhí)行)和SEH_STAT_RESTART(重啟進(jìn)程或單板)。對(duì)線程異常范圍表以單向鏈表方式組織,按棧序操作,本發(fā)明實(shí)施例提供如下功能的接口函數(shù)VOS—UINT32SEH—ScopeTablePush(SEH—SCOPE—UINT*pScopeTableHead,SEH—SCOPEJJINT*pSehScopeUnit);〃異常范圍表壓棧SEH—SCOPE—UINT*SEH—ScopeTablePop(SEH—SCOPE—UINT*pScopeTableHead);〃異常范圍〃出棧VOS—BOOLSEH—ScopeTablelsEmpty(SEH—SCOPE—UINT*PScopeTableHead);〃判斷異常范圍表〃是否為空對(duì)線程異常信息緩沖表的申請(qǐng)釋放可提供如下接口功能函數(shù)SEH—EXC—INFO*SHE—ExcInfoBufAlloc();〃申請(qǐng)線程異常信息緩沖表VOS—UINT32SEH—ExcInfoBufFree(SEH一EXC一INFO*pSehExcInfo);〃釋放線程異常信息緩沖表3.關(guān)于異常處理流程的實(shí)現(xiàn)和用戶接口設(shè)計(jì)標(biāo)準(zhǔn)C庫中提供的setjmp()、longjmp()函數(shù)可以提供非本地局部跳轉(zhuǎn)的機(jī)制。在嵌入式C語言環(huán)境下,不依賴編譯器實(shí)現(xiàn)異常關(guān)聯(lián)機(jī)制,可以采用setjmp的封裝來實(shí)現(xiàn)try塊,并在識(shí)別異常后調(diào)用longjmp來提供throw塊,except塊則是setjmp調(diào)用后返回非0值的else分支。一、線程異常狀態(tài)控制表的構(gòu)造為實(shí)現(xiàn)上述接口,首先需要構(gòu)造線程異常狀態(tài)控制表。各線程共享異常信息控制塊在系統(tǒng)初始化階段從系統(tǒng)堆空間申請(qǐng),保存在指向結(jié)構(gòu)SEH—INFO—BUF—CTRL的指針g_pSehInfoBufCtrl中。在VxWorks下,任務(wù)創(chuàng)建成功后,申請(qǐng)系統(tǒng)堆空間保存SEH—TH_CTRL,使用taskVarAdd將指向SEH—TH—CTRL的指針g_pSehThCtrl內(nèi)容保存在任務(wù)變量中,在try塊中可通過局部變量訪問g_pSehThCtrl,其值由VxWorks切換,同時(shí)將該堆空間記錄在系統(tǒng)任務(wù)資源總表中。在Linux下,<吏用pthread—key—create創(chuàng)建key句柄,并寸呆存在key句柄指針g_pThKey中,線程創(chuàng)建成功后,申請(qǐng)系統(tǒng)堆空間保存SEH—TH—CTRL,調(diào)用pthread—setspecific完成指向SEH—TH—CTRL的指針g_pSehThCtrl內(nèi)容保存,在try塊中通過局部變量保存pthread—getspecific的返回值(該線程的g_pSehThCtrl內(nèi)容)來操作本線程的異常狀態(tài)控制表,同時(shí)將該堆空間記錄在系統(tǒng)線程資源總表中。當(dāng)本任務(wù)或線程自動(dòng)退出時(shí),對(duì)g_pSehThCtrl指向的系統(tǒng)堆空間進(jìn)行釋放;當(dāng)刪除其他任務(wù)或線程時(shí),對(duì)記錄在系統(tǒng)資源總表中的其他任務(wù)或線程資源進(jìn)行釋放。二、try塊的設(shè)計(jì)try塊的實(shí)現(xiàn)流程如圖6所示,包括步驟S601:開始纟丸行try塊宏;步驟S602:判斷所述try塊對(duì)應(yīng)的粒度是否小于設(shè)置的處理異常的粒度,如果是,轉(zhuǎn)步驟S608,否則,轉(zhuǎn)步驟S603;步驟S603:獲得當(dāng)前線程異常狀態(tài)控制表的地址,轉(zhuǎn)步驟S604;步驟S604:從線程異常狀態(tài)控制表的空閑范圍塊鏈表中申請(qǐng)一個(gè)Unit塊,轉(zhuǎn)步驟S605;步驟S605:初始化Unit塊的bilntFlag,將Unit塊壓入線程異常范圍鏈表,初始化異常狀態(tài)控制表的相關(guān)項(xiàng),轉(zhuǎn)步驟S606;步驟S606:調(diào)用setjmp()函數(shù),轉(zhuǎn)步驟S607;步驟S607:判斷是否返回0,如果是,則轉(zhuǎn)步驟S608,否則,轉(zhuǎn)步驟S§09;步驟S608:正常處理,轉(zhuǎn)步驟S610;步驟S609:異常處理,轉(zhuǎn)步驟S610;步驟S610:結(jié)束執(zhí)行try塊宏,轉(zhuǎn)步驟S611;步驟S611:判斷是否需要回溯,如果是,則轉(zhuǎn)步驟S612,否則,轉(zhuǎn)步驟S613;步驟S612:重新拋出異常;步驟S613:判斷是否需要復(fù)位,如果是,則轉(zhuǎn)步驟S614,否則,轉(zhuǎn)步驟S615;步驟S614:重新啟動(dòng)進(jìn)程或單板處理;步驟S615:判斷是否恢復(fù)執(zhí)行,如果是,轉(zhuǎn)步驟S616,否則,轉(zhuǎn)步驟S617;步驟S616:根據(jù)CPU特點(diǎn)執(zhí)行異常恢復(fù)操作;步驟S617:try塊結(jié)束處理。需要i兌明的是,步驟S608和S609(即圖中虛線部分)為用戶處理代碼,即,用戶需要進(jìn)行的流程,例如需要保護(hù)的程序代碼片段等正常的程序代碼。具體的,try塊從線程異常狀態(tài)控制表的空閑范圍塊鏈表中可以動(dòng)態(tài)申請(qǐng)一個(gè)記錄單元,如果超過線程try塊最大嵌套層數(shù)ulMaxScopeLayer,則觸發(fā)系統(tǒng)默認(rèn)異常處理。正常情況下,經(jīng)過少量初始化操作后,將其壓入(push)到線程異常范圍鏈表中,然后在if語句中調(diào)用setjmp,對(duì)應(yīng)用程序的正常處理流程代碼形成監(jiān)控,當(dāng)被監(jiān)控的代碼片段中有硬件或軟件異常拋出時(shí),該程序能夠恢復(fù)到由此setjmp保存的執(zhí)行點(diǎn)。為區(qū)分setjmp的返回值是第一次調(diào)用(0值),還是longjmp調(diào)用的返回(非O值),用線程異常狀態(tài)控制表中的ulSehStatusFlag記錄,當(dāng)返回非O時(shí),表示當(dāng)前異常處理狀態(tài),其含義為,匹配該try塊的except塊是否被找到,或者需要進(jìn)一步回溯,或者從異常處重新執(zhí)行,或者需要復(fù)位進(jìn)程或復(fù)位單板。此外,try塊的實(shí)現(xiàn)還需要考慮對(duì)異常處理級(jí)別的精細(xì)管理進(jìn)行支持。try塊的流程可以通過如下方式實(shí)現(xiàn)#defmeSEH—TRY—BEG(SEH—level)\VOS—INT32ulSehStatusFlag=0;\if(SEH—Level>=SEH_HANDLE—LEVEL)\----異??蚣艿木?xì)控制23SEH—SCOPE—UINT*—tryjSehScopeUnit;\SEH—TH—CTRL*—try_pSehThCtrl;\—tryjSehThCtrl=當(dāng)前線程狀態(tài)控制表地址\—tryjSehScopeUnit=從線程空閑范圍塊鏈表申請(qǐng)一個(gè)Unit塊\根據(jù)當(dāng)前是否在中斷中初始化Unit塊bllntFlag標(biāo)志\調(diào)用SEH—ScopeTablePush將Unit壓入線程異常范圍表\初始化異常狀態(tài)控制表狀態(tài)信息為無異常狀態(tài)SEH_STAT—NON\—tryjSehThCtrl-〉pSehExcInfo=VOS—NULL—PTR;ulSehStatusFlag=trypSehThCtrl->ulSehStatusFlag=setjmp(_try_pSeh陽ScopeUnit->seh—env);if(0==ulSehStatusFlag)\{一一這個(gè)正向大括號(hào)是對(duì)try塊中正常流程代碼作用域的引導(dǎo)try塊的實(shí)現(xiàn)需要做到不依賴于編譯器,無法通過編譯器的文法識(shí)別來找到try塊的結(jié)束點(diǎn)并自動(dòng)添加結(jié)束代碼,因此,需要設(shè)計(jì)一個(gè)由應(yīng)用程序調(diào)用的SEH—TRY—END,來完成try塊的結(jié)束處理,完成對(duì)異常狀態(tài)的清除處理。#defineSEH—TRY—END\if(SEH—STAT—CONTINUE—SEARCH/*需要進(jìn)一步回溯*/\==—try_pSehThCtrl->ulSehStatusFlag)\SEH—RETHROW();\else\SEH—ExcInfoBufFree(_Jry_pSehThCtrl->pSehExcInfo);if(SEH—STAT—RESTART/*需要復(fù)位進(jìn)程或單板*/==^tryjSehThCtrl->ulSehStatusFlag)\重啟進(jìn)程或單板處理\elseif(SEH—STAT—CONTINUE—REDO嚴(yán)需要從異常指令處恢復(fù)執(zhí)行V==^try_pSehThCtrl->ulSehStatusFlag)\根據(jù)CPU體系特點(diǎn)執(zhí)行異常恢復(fù)操作\}\一一這個(gè)反向大括號(hào)是對(duì)except塊中異常處理方式精細(xì)管理的作用域的關(guān)閉}\——這個(gè)反向大括號(hào)是對(duì)except塊作用域的關(guān)閉/*沒有執(zhí)行到任何except塊,表明無異常發(fā)生*八if(0==^tryjSehThCtrl國〉ulSehStatusFlag)\o調(diào)用SEH—ScopeTablePop將Unit彈出線程異常范圍表\將Unit塊釋放回線程異常狀態(tài)控制表中的線程空閑范圍塊鏈表\}一一這個(gè)反向大括號(hào)是對(duì)整個(gè)try塊異常框架作用域的關(guān)閉三、except塊的i殳計(jì)在try塊之后,需要提供except塊的機(jī)制,它實(shí)際上就是SEH—TRY—BEG封裝的if語句配對(duì)的else分支,可以對(duì)throw塊拋出的異常類型進(jìn)行處理,同時(shí)支持異常處理方式的精細(xì)處理。具體實(shí)現(xiàn)流程如圖7所示,包括步驟S701:開始執(zhí)4于except塊宏;步驟S702:關(guān)閉正常處理分支的作用域或前一個(gè)異常處理方式的作用域;步驟S703:判斷是否是當(dāng)前異常處理方式,如果是,轉(zhuǎn)步驟S704,否貝'j,轉(zhuǎn)步驟S708;步驟S704:將Unit塊彈出線程異常范圍表;步驟S705:將Unit塊釋放到線程異常狀態(tài)控制表的空閑范圍塊鏈表;步驟S706:設(shè)置異常已處理的狀態(tài);步驟S707:執(zhí)行異常處理程序代碼,這里的,異常處理程序代碼即異常處理代碼;步驟S708:轉(zhuǎn)下一個(gè)異常處理方式的except塊或者結(jié)束異常處理。封裝代碼如下#defineSEH—EXCEPT(method)\}\一一這個(gè)反向大括號(hào)是對(duì)try塊中正常流程代碼作用域或前一異常處理方式作用域的關(guān)閉else\if(method==EXCEPTION—HANDLE—METHOD){\——異常處理方式的精細(xì)控制調(diào)用SEP^ScopeTableP叩將Unit彈出線程異常范圍表\將Unit塊釋放回線程異常狀態(tài)控制表中的線程空閑范圍塊鏈表\—try_pSehThCtrl->ulSehStatusFlag=SEH—STAT—HANDLED;\SEH—EXCEPT可以實(shí)現(xiàn)對(duì)任意類型異常的捕捉,為支持對(duì)異常類型的過濾,即捕獲特定類型的異常,本發(fā)明實(shí)施例進(jìn)一步提供三種格式的封裝。(1)捕捉某種特定異常實(shí)現(xiàn)流程如圖8所示,包括步驟S801:開始執(zhí)行except塊宏;步驟S802:關(guān)閉正常處理分支的作用域或前一個(gè)異常處理方式的作用域;步驟S803:判斷是否是當(dāng)前異常處理方式,如果是,轉(zhuǎn)步驟S804,否貝'J,轉(zhuǎn)步驟S810;步驟S804:將Unit塊彈出線程異常范圍表;步驟S805:判斷是否匹配異常類型,如果是,轉(zhuǎn)步驟S807,否則,轉(zhuǎn)步驟S806;步驟S806:重新拋出異常;步驟S807:將Unit塊釋放到線程異常狀態(tài)控制表的空閑范圍塊鏈表;步驟S808:設(shè)置異常已處理的狀態(tài);步驟S809:執(zhí)行異常處理程序代碼;<步驟S810:轉(zhuǎn)下一個(gè)異常處理方式的except塊或者結(jié)束異常處理。實(shí)現(xiàn)代碼如下#defmeSEH—EXCEPT—ONE(seh—type,method"else\if(method==EXCEPTION—HANDLE—METHOD){\調(diào)用SEH—ScopeTablePop將Unit彈出線程異常范圍表\將Unit塊釋放回線程異常狀態(tài)控制表中的線程空閑范圍塊鏈表\if(seh—type==_try_pSehThCtrl->pSehExcInfo->seh—rec.ulSehType)\_^ry_pSehThCtrl->ulSehStatusFlag=SEH—STAT—HANDLED;\else\oSEH—RETHROW();/*重拋異常*八(2)捕捉處理指定異常實(shí)現(xiàn)流程如圖9所示,包括步驟S901:開始執(zhí)行except塊宏;步驟S902:關(guān)閉正常處理分支的作用域或前一個(gè)異常處理方式的作用域;步驟S903:判斷是否是當(dāng)前異常處理方式,如果是,轉(zhuǎn)步驟S904,否貝'J,轉(zhuǎn)步驟S910;步驟S904:將Unit塊彈出線程異常范圍表;步驟S905:判斷是否匹配數(shù)組指定的異常類型,如果是,轉(zhuǎn)步驟S907,否則,轉(zhuǎn)步驟S906;步驟S906:重新拋出異常;步驟S907:將Unit塊釋放到線程異常狀態(tài)控制表的空閑范圍塊鏈表;步驟S908:設(shè)置異常已處理的狀態(tài);步驟S909:執(zhí)行異常處理程序代碼;步驟S910:轉(zhuǎn)下一個(gè)異常處理方式的except塊或者結(jié)束異常處理。實(shí)現(xiàn)代碼如下#defineSEH—EXCEPT—VAR(seh—type—num,seh—type—array,method)\else\oif(method==EXCEPTION—HANDLE—METHOD){\調(diào)用SEI^ScopeTablePop將Unit彈出線程異常范圍表\將Unit塊釋放回線程異常狀態(tài)控制表中的線程空閑范圍塊鏈表\if(異常現(xiàn)場(chǎng)信息中ulSehType與seh一type一_array中的類型匹酉己)\__tryjSehThCtrl畫〉ulSehStatusFlag=SEH—STAT—HANDLED;\else\SEH—RETHROW();\}(3)捕捉和處理某一異常區(qū)間內(nèi)的異常實(shí)現(xiàn)流程如圖10所示,包括步驟S1001:開始執(zhí)行except塊宏;步驟S1002:關(guān)閉正常處理分支的作用域或前一個(gè)異常處理方式的作用域;步驟S1003:判斷是否是當(dāng)前異常處理方式,如果是,轉(zhuǎn)步驟S1004,否則,轉(zhuǎn)步驟S1010;步驟S1004:將Unit塊彈出線程異常范圍表;步驟S1005:判斷是否匹配異常區(qū)間內(nèi)的異常類型,如果是,轉(zhuǎn)步驟S1007,否則,轉(zhuǎn)步驟S1006;步驟S1006:重新拋出異常;步驟S1007:將Unit塊釋放到線程異常狀態(tài)控制表的空閑范圍塊鏈表;步驟S1008:設(shè)置異常已處理的狀態(tài);步驟S1009:執(zhí)行異常處理程序代碼;步驟S1010:轉(zhuǎn)下一個(gè)異常處理方式的except塊或者結(jié)束異常處理。實(shí)現(xiàn)代碼如下#defmeSEH—EXCEPT—IN(seh—type—min,seh—type—max,method)\else\if(method==EXCEPTION—HANDLE—METHOD){\調(diào)用SEHLScopeTableP叩將Unit彈出線程異常范圍表\nit塊釋放回線程異常狀態(tài)控制表中的線程空閑范圍塊鏈表\if異?,F(xiàn)場(chǎng)信息中ulSehType與seh—type—min/max區(qū)間的類型匹配)\{\^try_pSehThCtrl->ulSehStatusFlag=SEH—STAT—HANDLED;\else\SEH—RETHROW();\此外,本發(fā)明實(shí)施例還在except塊中提供給應(yīng)用層做進(jìn)一步處理的相關(guān)才喿作宏接口如下(1)獲得異常記錄信息#defineSEH—GET—RECORD(pSehRec)\((pSehRec)=&C_try_pSehThCtrl->pSehExcInfo.seh—rec))(2)獲得異常類型#defmeSEH—GET—TYPE(SehType)\((SehType)=_try_pSehThCtrl->pSehExcInfo.seh—rec.ulSehType)(3)設(shè)置異常嵌套層數(shù)—#defineSEH—GET—NEST一COUNT(NestCount)\(NestCount)=trypSehThCtrl-〉ulExc印tNestCnt(4)設(shè)置異常處理狀態(tài)#defmeSEH—SET_STATUS(SehStatus)\trypSehThCtrl-〉ulSehStatusFlag=(SehStatus)四、throw塊的i殳計(jì)調(diào)用throw的地方有兩處,一處是在系統(tǒng)捕獲硬件異常時(shí),調(diào)用throw塊,將異常通知到except塊,另一處則是try中的函數(shù)主動(dòng)調(diào)用throw拋出軟件異常。對(duì)這兩種情況,這里提供統(tǒng)一的拋出操作,即,獲得線程異常范圍表中位于棧頂?shù)拇鎯?chǔ)單元(但不彈出),對(duì)單元內(nèi)容進(jìn)行賦值,可通過函數(shù)SEH—Throwlnner實(shí)現(xiàn)。實(shí)現(xiàn)流程如圖11所示,包括步驟S1101:執(zhí)行Throwlnner()函數(shù);步驟S1102:判斷參數(shù)是否合法,如果是,則轉(zhuǎn)步驟S1103,否則,轉(zhuǎn)步驟S1112;步驟S1103:獲取當(dāng)前線程異常狀態(tài)控制表的地址;步驟S1104:獲得線程異常范圍鏈表的棧頂存儲(chǔ)單元;步驟S1105:判斷是否有匹配的try塊和except塊,如果是,則轉(zhuǎn)步驟S1106,否則,轉(zhuǎn)步驟S1112;步驟S1106:判斷是否有共享異常信息緩存或者拋出的異常記錄是否是異?,F(xiàn)場(chǎng)記錄,如果是,轉(zhuǎn)步驟S1107,否則,轉(zhuǎn)步驟S1111;步驟S1107:分配共享異常信息緩存;步驟S1108:判斷是否有緩存,如果是,則轉(zhuǎn)步驟S1109,否則,轉(zhuǎn)步驟S1112;步驟S1109:初始化緩存,設(shè)置未處理異常標(biāo)志;步驟S1110:執(zhí)行except塊代碼;步驟S1111::沒置異常處理標(biāo)志;步驟S1112:進(jìn)行默認(rèn)的異常處理。實(shí)現(xiàn)代碼如下voidSEH—ThrowI畫r(VOS—SEH—REC*pSehRec){——SEH—SCOPE—UINT*pTempUnit;30SEH—EXC—INFO*pInfoBuf;SEH—TH—CTRL*pSehThCtrl;VOS—UINT32ulSehStatusFlag;if(VOS—NULL—PTR=pSehRec)參數(shù)非法,按系統(tǒng)默認(rèn)異常處理PSehThCtrl=當(dāng)前線程狀態(tài)控制表地址pTempUnit=SEH—ScopeTableTop(pSehThCtrl->pScopeTableHead);if(VOS—NULL—PTR==pTempUnit)表明沒有try-except塊,按系統(tǒng)默認(rèn)異常處理if((VOS—NULL—PTR==pSehThCtrl畫〉pSehExcInfo)II(pSehRec!=&(pSehThCtrl->pSehExcInfo->seh—rec))plnfoBuf=SEH—ExcInfoBufAlloc();if(VOS—NULL—PTR==plnfoBuf)表明無共享異常信息緩存,按系統(tǒng)默認(rèn)異常處理pSehThCtrl-〉ulExceptNestCnt=1;pSehThCtrl-〉pSehExcInfo=plnfoBuf;對(duì)承pInfoBuf內(nèi)容進(jìn)行初始化pInfoBuf->seh—rec.ulSehType=pSehRec->ulSehType;plnfoBuf的其他賦值才喿作...ulSehStatusFlag=SEH—STAT—UNHANDLE;}一ds6、'■ulSehStatusFlag=pSehThCtrl畫〉ulSehStatusFlag;/*longjmp第二個(gè)參數(shù)用于將異常處理狀態(tài)信息回傳給pSehThCtrl-〉ulSehStatusFlag*/longjmp(pTempUnit-〉seh—env,ulSehStatusFlag);對(duì)程序拋出的軟件異常情況,大多數(shù)硬件異常信息可以屏蔽。簡(jiǎn)化后的宏封裝接口首先初始化拋出的異常記錄信息,然后調(diào)用SEH—Throwlnner函數(shù),實(shí)現(xiàn)如下#defmeSEH一THROW(SehType,SehErrCode,SehMsg)\VOS—SEH—RECtmpSehRec;memset(&tmpSehRec,0,sizeof(tmpSehRec));tmpSehRec.ulSehType=SehType;tmpSehRec.ulSehErrOrlntCode=SehErrCode;stmcpy(tmpSehRec.stSe固sg,SehMsg,31);tmpSehRec.stSehMsg[31]=0;SEH—ThrowInner(&tmpSehRec);對(duì)于當(dāng)前excpet塊無法處理的情況,前面已在SEH—EXCEPT—ONE、SEH—EXCEPT—VAR和SEH—EXCEPT—IN的情況下描述,將PSehThCtrl->ulSehStatusFlagi殳置為需要進(jìn)一步回溯狀態(tài)SEH—STAT—CONTINUE—SEARCH后執(zhí)行rethrow,重新拋出接口實(shí)現(xiàn)如下#defineSEH—RETHROW()\SEH—Th層I畫r(&(pSehThCtrl->pSehExcInfo->seh—rec))五、框架精細(xì)管理的實(shí)現(xiàn)對(duì)框架的精細(xì)管理有兩個(gè)方面。一方面提供對(duì)異常拋出時(shí)處理模塊級(jí)別的精細(xì)管理,另一方面提供對(duì)異常處理方式的精細(xì)管理。(1)異常拋出時(shí)處理模塊級(jí)別的精細(xì)管理代碼拋出異常時(shí),可以根據(jù)精細(xì)程度查找try塊,為此定義宏SEH—HANDLE—LEVEL,用戶通過配置該宏可以保存期望的異常處理框架的精細(xì)度。該宏的值默認(rèn)為FUNC—LEVEL(函數(shù)級(jí))。用戶可以根據(jù)需要將該宏的值配置為MODULE—LEVEL或者COMPONENT—LEVEL。用戶在設(shè)置try塊保護(hù)代碼時(shí),同時(shí)可以指定try塊的配置級(jí)別SEH—Level。在try塊的設(shè)計(jì)中,可以看到,當(dāng)SEH—Level>=SEH—HANDLE—LEVEL時(shí),框架中代碼拋出異常時(shí)相應(yīng)的try塊才被識(shí)別。因此,在開發(fā)的不同階段,用戶只需要配置SEH—HANDLE—LEVEL,就可以對(duì)異常處理框架的精細(xì)度進(jìn)行控制。例如,用戶在調(diào)試階段設(shè)置SEH—HANDLE—LEVEL為FUNC—LEVEL(函數(shù)級(jí)別),所有try塊均可被識(shí)別;當(dāng)代碼穩(wěn)定后,用戶設(shè)置SEH—HANDLE—LEVEL為FUNC—LEVEL為MODULE—LEVEL,則代碼在拋出異常時(shí)只識(shí)別才莫塊級(jí)的異常??蚣軐?duì)配置的異常處理級(jí)別的判斷和支持在try塊中實(shí)現(xiàn),其實(shí)現(xiàn)和流程在try塊的設(shè)計(jì)和圖8中已做了說明。(2)異常處理方式的精細(xì)管理用戶在嵌入式C語言環(huán)境下開發(fā)的不同階段,對(duì)異常的處理會(huì)有不同的處理方式。例如,在開發(fā)階段,對(duì)異常的處理主要方法是捕獲異常處理錯(cuò)誤并輸出錯(cuò)誤,而在開發(fā)完成產(chǎn)品發(fā)布時(shí),異常處理的主要方法是容錯(cuò)恢復(fù)。因此,異常處理的精細(xì)管理為用戶提供框架,使得用戶在不同階段編寫異常處理代碼時(shí),不需要覆蓋以前的代碼而只是簡(jiǎn)單的指定處理方式,針對(duì)不同的處理方式編寫不同的異常處理代碼。為此,可以設(shè)置宏EXCEPTION—HANDLE—METHOD保存用戶當(dāng)前的處理方式,在except塊捕獲異常時(shí),指定處理方式method(EXCEPTION—CHECK、EXCEPTION—TOLARENT以及其他用戶定義的方式)method與當(dāng)前的處理方式EXCEPTION—HANDLE—METHOD相同的except塊才能處理對(duì)應(yīng)try塊的異常。用戶可按照如下方式使用異常咎理框架SEH—TRY—BEG(SEH—level)SEH—THROWSEH—EXCEPT(methodl)處理方式methodl對(duì)應(yīng)的異常處理代碼SEH—EXCEPT(method2)處理方式method2對(duì)應(yīng)的異常處理代碼SEH—TRY—END對(duì)異常處理方法精細(xì)管理的支持實(shí)現(xiàn)和流程在except塊的設(shè)計(jì)部分和圖9中已進(jìn)行了描述。(3)異常處理框架的精細(xì)管理方法實(shí)現(xiàn)流程如圖12所示,包括步驟S1201:執(zhí)行保護(hù)程序代碼的try塊;步驟S1202:判斷當(dāng)前級(jí)別是否不小于用戶配置的級(jí)別,如果是,轉(zhuǎn)步驟S1203,否則,轉(zhuǎn)步驟S1209;步驟S1203:執(zhí)行需要保護(hù)的程序代碼;步驟S1204:判斷需要保護(hù)的程序代碼是否拋出異常,如果是,轉(zhuǎn)步驟S1205,否則,轉(zhuǎn)步驟S1203;步驟S1205:確定對(duì)應(yīng)的except塊;步驟S1206:判斷是否符合用戶設(shè)置的異常處理方式,如果是,轉(zhuǎn)步驟S1207,否則,轉(zhuǎn)步驟S1208;^步驟S1207:執(zhí)行異常處理程序代碼;步驟S1208:轉(zhuǎn)下一個(gè)異常處理方式,轉(zhuǎn)步驟S1206;步驟S1209:忽略當(dāng)前try塊保護(hù),轉(zhuǎn)步驟S1203。具體的,用戶可以配置異常處理級(jí)別和異常處理手段。例如,遇到try塊時(shí),首先判斷當(dāng)前try塊的級(jí)別是否不小于用戶配置的異常處理級(jí)別,如果是,則對(duì)代碼進(jìn)行保護(hù),否則,忽略該try塊的保護(hù)機(jī)制。對(duì)于try塊保護(hù)的代碼,如果拋出異常,則尋找對(duì)應(yīng)的except塊,如果找到的except塊的處理手段與用戶配置的處理手段相符,則進(jìn)行相應(yīng)的異常處理,否則,尋找相應(yīng)的下一處理手l爻的except塊。六、用戶接口及使用方法
技術(shù)領(lǐng)域:
:本發(fā)明實(shí)施例提供了兩類外部接口一類是搭建異常框架的接口,包括用于識(shí)別代碼片段的try塊的接口SEH—TRY—BEG和SEH—TRY—END,用于與代碼片段匹配的異常處理程序except塊的接口SEH—EXCEPT(匹配所有異常)、SEH—EXCEPT—ONE(匹配某一類異常)、SEH—EXCEPT_VAR(匹配異常類型可變)和SEH—EXCEPT—IN(匹配特定類型號(hào)區(qū)間的異常),以及用于拋出異常的throw塊的SEH—THROW接口;另一類是在異常處理框架中,為方便應(yīng)用程序進(jìn)一步處理異常,或者根據(jù)需要更靈活的控制異常處理流程所使用的處理接口,包括SEH—GET—RECORD(獲取異常記錄信息)、SEH—GET—TYPE(獲取異常類型)和SEH—SET一STATUS(設(shè)置異常處理狀態(tài)),上述接口均以宏方式提供,并在異常處理框架內(nèi)部使用。用戶可在代碼中通過如下方式使用該異常處理框架SEH—TRY—BEG(SEH—level)〃用戶想要監(jiān)控保護(hù)的代碼SEHJTHROW(SehType,SehErrCode,SehMsg)〃如果發(fā)生異常,則將其拋出SEH_EXCEPT(異常類型,mothodl)SEH—GET—RECORD(嚴(yán)獲取異常記錄V);if(硬件異常)/*進(jìn)一步加工、轉(zhuǎn)儲(chǔ)異常信息*/app—exc—handle();if(軟件異常)/*進(jìn)行全面的錯(cuò)誤檢查及錯(cuò)誤信息上報(bào)*/app—err—handle();SEH—SET—STATUS(/*可設(shè)置為繼續(xù)回溯異常、從異常指令處恢復(fù)執(zhí)行、復(fù)位進(jìn)程*/);SEH_EXCEPT(異常類型,mothod2)......//其他異常處理方式定義的異常處理方法SEH—TRY—END本發(fā)明除提供上述異常處理方法外,還提供了嵌入式C語言環(huán)境下退出線程或進(jìn)程的方法和刪除線程或進(jìn)程的方法。退出線程或進(jìn)程的方法的實(shí)現(xiàn)流程如圖13所示,應(yīng)用于線程主動(dòng)退出的場(chǎng)景,包括步驟S1301:獲得線程或進(jìn)程需要退出的信息。步驟S1302:檢查需要退出的線程或進(jìn)程所拋出的異常是否仍然占用資源,如果是,轉(zhuǎn)步驟S1303,否則,轉(zhuǎn)步驟S1304;步驟S1303:釋放所述占用的資源;^'步驟S1304:退出所述線程或進(jìn)程。括檢查需要退出的線程或進(jìn)程是否已拋出異常;如果是,則檢查已拋出的異常是否仍然占用資源。具體的,可以為用戶提供線程退出的接口操作VOS—ExitThread,該接口函數(shù)在退出線程前,首先檢查當(dāng)前線程是否有異常處理的資源尚未釋放,如果有,則對(duì)try塊中拋出異常所占用的資源進(jìn)行才企查和釋放,之后執(zhí)行退出線程的操作。其中的一種嵌入式C語言環(huán)境下退出線程或進(jìn)程的裝置可以如圖14所示,包括信息獲得單元1401,用于獲得線程或進(jìn)程需要退出的信息;資源檢查單元1402,用于在信息獲得單元1401獲得線程或進(jìn)程需要退出的信息后,檢查需要退出的線程或進(jìn)程所拋出的異常是否仍然占用資源;資源釋放單元1403,用于在資源檢查單元1402檢查出需要退出的線程或進(jìn)程所拋出的異常仍然占用資源,則釋;^文所述占用的資源;線程或進(jìn)程退出單元1404,用于在資源釋放單元1403釋;^文所述占用的資源后,退出所述線程或進(jìn)程。刪除線程或進(jìn)程的方法的實(shí)現(xiàn)流程如圖15所示,應(yīng)用于當(dāng)前線程或進(jìn)程被其他線程或進(jìn)程刪除的場(chǎng)景,包括步驟S1501:確定需要?jiǎng)h除的線程或進(jìn)程。步驟S1502:檢查需要?jiǎng)h除的線程或進(jìn)程所拋出的異常是否仍然占用資源,如果是,轉(zhuǎn)步驟S1503,否則,轉(zhuǎn)步驟S1504;步驟S1503:釋^:所述占用的資源;步驟S1504:刪除所述線程或進(jìn)程。括檢查需要?jiǎng)h除的線程或進(jìn)程是否已拋出異常;如果是,則檢查已拋出的異常是否仍然占用資源。具體的,若線程1拋出異常后切換到線程2,線程2需要執(zhí)行對(duì)線程1的刪除操作,在本發(fā)明實(shí)施例中,線程2對(duì)線程1中拋出的異常所占用的資源進(jìn)行處理后再刪除線程1。在Linux下,線程2刪除線程1是通過給線程1發(fā)送信號(hào)實(shí)現(xiàn)的,因此,可以在線程1中注冊(cè)信號(hào)的處理函數(shù)handler中對(duì)已拋出的異常進(jìn)衧處理。在Linux下,對(duì)于跨進(jìn)程刪除時(shí)的異常處理可以采用同樣的方法進(jìn)行處理。在VxWorks下,刪除任務(wù)的函數(shù)taskDelete允許通過函數(shù)taskDeleteHookAdd()注冊(cè)鉤子函數(shù),因此,可在刪除任務(wù)之前,注冊(cè)鉤子函數(shù)對(duì)要?jiǎng)h除的任務(wù)的異常進(jìn)行處理。對(duì)于以上兩種操作系統(tǒng),本發(fā)明實(shí)施例提供統(tǒng)一的處理手段。具體的,提供VOS—KillExHandle()函數(shù),在Linux系統(tǒng)下注冊(cè)為刪除線程(進(jìn)程)的信號(hào)的handler,在vxWorks下注冊(cè)為退出鉤子。VOS—Kil正xHandle()函數(shù)通過獲得被刪除線程的異常狀態(tài)控制表中的信息獲得當(dāng)前要處理的異常,然后對(duì)異常及其占用的資源進(jìn)行相應(yīng)的處理。其中的一種C語言環(huán)境下刪除線程或進(jìn)程的裝置如圖16所示,包括確定單元1601,用于確定需要?jiǎng)h除的線程或進(jìn)程;資源檢查單元1602,用于在確定單元1601確定需要?jiǎng)h除的線程或進(jìn)程后,檢查需要?jiǎng)h除的線程或進(jìn)程所拋出的異常是否仍然占用資源;資源釋放單元1603,用于在資源檢查單元1602檢查出需要?jiǎng)h除的線程或進(jìn)程所拋出的異常仍然占用資源,則釋放所述占用的資源;線程或進(jìn)程刪除單元1604,用于在資源釋》文單元1603釋放所述占用的資源后,刪除所述線程或進(jìn)程。綜上所述,本發(fā)明實(shí)施例實(shí)現(xiàn)了在嵌入式C語言環(huán)境下不依賴于編譯器的可精細(xì)管理的異常處理方法。本發(fā)明實(shí)施例提供的用戶接口可以將用戶的編碼和異常處理分離,使得用戶在使用嵌入式C語言環(huán)境進(jìn)行程序開發(fā)時(shí),通過使用簡(jiǎn)單的宏接口即可實(shí)現(xiàn)基于異常處理的程序設(shè)計(jì),從而更關(guān)注代碼正常分支的開發(fā)。對(duì)異??蚣艿目删?xì)管理的設(shè)計(jì)使得用戶可以根據(jù)需要調(diào)整異常處理的級(jí)別,例如,在調(diào)試階段可以將異常處理定在函數(shù)級(jí),以盡量抓取程序的異常,而在代碼穩(wěn)定后,產(chǎn)品上網(wǎng)運(yùn)行時(shí)將異常處理級(jí)別定為部件級(jí),忽略函數(shù)級(jí)的異常處理,只針對(duì)模塊出現(xiàn)的異常進(jìn)行統(tǒng)一處理。針對(duì)現(xiàn)有技術(shù)中用戶無法根據(jù)自己的需要對(duì)異常處理的粒度和方式進(jìn)行理框架中實(shí)現(xiàn)將異常處理動(dòng)態(tài)配置到函數(shù)、模塊或者組件的機(jī)制,以及配置異常處理的機(jī)制,從而實(shí)現(xiàn)對(duì)異常處理方法和異常處理框架的精細(xì)管理。使得用戶可以根據(jù)自己的需要對(duì)異常處理框架和處理方法進(jìn)行精細(xì)管理。用戶對(duì)異常處理框架和處理方法的精細(xì)管理包括兩個(gè)方面一方面,在開發(fā)的不同階段,用戶可以根據(jù)需要將異常處理動(dòng)態(tài)配置到函數(shù)、模塊、組件等不同級(jí)別,從而達(dá)到對(duì)異常處理框架的精細(xì)管理。例如,在產(chǎn)品開發(fā)階段,用戶為了盡量找到引發(fā)異常的錯(cuò)誤,可以將異常處理級(jí)別配置為函數(shù)級(jí)別,在異常處理保護(hù)的代碼中,函數(shù)拋出的異常都會(huì)被函數(shù)的異常處理機(jī)制捕獲并處理;當(dāng)產(chǎn)品開發(fā)結(jié)束發(fā)布時(shí),代碼已經(jīng)較為穩(wěn)定,為了提高性能,用戶可以將異常處理級(jí)別配置為模塊級(jí)甚至部件級(jí),異常處理的機(jī)制在模塊或部件范圍內(nèi)起作用,拋出的異常會(huì)被本模塊或部件的異常處理機(jī)制捕獲并統(tǒng)一處理。另一方面,用戶對(duì)同一段保護(hù)的代碼可以做不同的異常處理,并可以在異常處理框架中配置異常處理方法,在不同的情況下使不同的異常處理方法生效。例如,對(duì)同一段保護(hù)的代碼,用戶的異常處理可以有查錯(cuò)和容錯(cuò)至少兩種處理方式,在代碼開發(fā)時(shí)使用查錯(cuò)方式盡量找到引發(fā)異常的錯(cuò)誤,而在產(chǎn)品發(fā)布時(shí)使用容錯(cuò)方式對(duì)異常進(jìn)行恢復(fù)處理。用戶可以在異常處理框架中配置異常處理方式為查錯(cuò)或者容錯(cuò)。以及,在本發(fā)明實(shí)施例的嵌入式C語言環(huán)境下異常處理方法、裝置及嵌入式系統(tǒng)中,如果程序代碼片段出現(xiàn)異常,則不是簡(jiǎn)單的重新運(yùn)行程序代碼片段,而是使用獨(dú)立于程序代碼片段的異常處理程序來處理異常,這樣,程序在運(yùn)行時(shí),就不會(huì)因?yàn)楫惓6袛噙\(yùn)行,滿足了產(chǎn)品不希望系統(tǒng)運(yùn)行時(shí)發(fā)生中斷的需求。以及,針對(duì)現(xiàn)有技術(shù)中的異常處理機(jī)制不支持跨線程和跨進(jìn)程刪除時(shí)的異常處理,本發(fā)明實(shí)施例在嵌入式c環(huán)境下不依賴于編譯器的異常處理方法和異常處理框架中提供了線程主動(dòng)退出和跨線程(進(jìn)程)刪除時(shí)的方法。在本發(fā)明實(shí)施例的嵌入式c語言環(huán)境下退出或刪除線程或進(jìn)程的方法中,無論是退出或者刪除線程或進(jìn)程,都可以釋放處理線程或進(jìn)程拋出的異常所占用的資源,這樣,當(dāng)其他線程或進(jìn)程需要使用這些資源時(shí),不會(huì)因?yàn)閯h除或退這些資源。另外,還可以由其他線程刪除所需要?jiǎng)h除的線程,從而可以實(shí)現(xiàn)跨線程刪除線程時(shí)的異常處理。4本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述實(shí)施例的嵌入式c語言環(huán)境下異常處理的過程可以通過程序指令相關(guān)的硬件來完成,所述的程序可以存儲(chǔ)于39可讀取存儲(chǔ)介質(zhì)中,該程序在執(zhí)行時(shí)執(zhí)行上述方法中的對(duì)應(yīng)步驟。所述的存儲(chǔ)介質(zhì)可以如ROM/RAM、磁碟、光盤等。最后需要說明的是,本發(fā)明所有的實(shí)施例都可以應(yīng)用于嵌入式C語言環(huán)境下、非嵌入式C語言環(huán)境下。以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對(duì)于本
技術(shù)領(lǐng)域:
的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以作出若干改進(jìn)和潤飾,這些改進(jìn)和潤飾也應(yīng)視為本發(fā)明的保護(hù)范圍。權(quán)利要求1.一種嵌入式C語言環(huán)境下的異常處理方法,其特征在于,包括監(jiān)控正在運(yùn)行的需要保護(hù)的程序代碼片段,如果所述程序代碼片段出現(xiàn)異常,則拋出所述異常,所述異常包括軟件異常、硬件異常中的至少一種;根據(jù)獲得的所述異常,確定相應(yīng)的異常處理程序,由所述異常處理程序處理所述異常,其中,所述異常處理程序與所述程序代碼片段相互獨(dú)立。2.如權(quán)利要求1所述的方法,其特征在于,所述監(jiān)控正在運(yùn)行的需要保護(hù)的程序代碼片段的步驟具為根據(jù)設(shè)置的處理異常的粒度,監(jiān)控所述正在運(yùn)行的需要保護(hù)的程序代碼片段。3.如權(quán)利要求1所述的方法,其特征在于,進(jìn)一步包括申請(qǐng)用于記錄與異常相關(guān)的信息的存儲(chǔ)空間;貝'J,在所述程序代碼片段出現(xiàn)異常之后,拋出所述異常之前,記錄與異常相關(guān)的信息。4.如權(quán)利要求1或3所述的方法,其特征在于,所述拋出所述異常具體為將所述與異常相關(guān)的信息打包后傳遞出去,所述與異常相關(guān)的信息至少包括異常類型標(biāo)識(shí),所述異常類型標(biāo)識(shí)用于表示當(dāng)前程序代碼片段出現(xiàn)的異常的類型。5.如權(quán)利要求4所述的方法,其特征在于,所述根據(jù)獲得的所述異常,確定相應(yīng)的異常處理程序,由所述異常處理程序處理所述異常的步驟包括獲得傳遞過來的與異常相關(guān)的信息,所述與異常相關(guān)的信息中包含異常類型標(biāo)識(shí);確定與所述異常類型標(biāo)識(shí)對(duì)應(yīng)的異常類型所匹配的異常處理程序,由所述異常處理程序處理所述異常。6.如權(quán)利要求5所述的方法,其特征在于,所述確定與所述異常類型標(biāo)識(shí)對(duì)應(yīng)的異常類型所匹配的異常處理程序,由所述異常處理程序處理所述異常的步驟包括當(dāng)所述異常類型標(biāo)識(shí)對(duì)應(yīng)的異常類型與能處理的一種特殊的異常類型匹配時(shí),由與該異常類型匹配的異常處理程序處理該異常;或,當(dāng)所述異常類型標(biāo)識(shí)對(duì)應(yīng)的異常類型與能處理的至少一種異常類型中的一種異常類型匹配時(shí),由與該異常類型匹配的異常處理程序處理該異常;或,當(dāng)存在能處理任何類型異常的異常處理程序時(shí),確定由該匹配任意類型異常的異常處理程序處理所述異常。7.如權(quán)利要求6所述的方法,其特征在于,所述方法進(jìn)一步包括如果當(dāng)前不存在與該異常類型匹配的異常處理程序時(shí),將獲得的與異常相關(guān)的信息重新傳遞出去,或者,當(dāng)都匹配不上時(shí),啟動(dòng)默認(rèn)處理程序,所述默認(rèn)處理程序?yàn)橹貑⑾到y(tǒng)。8.如權(quán)利要求4所述的方法,其特征在于,所述根據(jù)獲得的所述異常,確定相應(yīng)的異常處理程序,由所述異常處理程序處理所述異常的步驟包括獲得傳遞過來的與異常相關(guān)的信息,所述與異常相關(guān)的信息中包含異常類型標(biāo)識(shí)、指定處理方式標(biāo)識(shí);確定與所述異常類型標(biāo)識(shí)對(duì)應(yīng)的異常類型所匹配,且與所述的指定處理方式標(biāo)識(shí)對(duì)應(yīng)的處理方式所匹配的異常處理程序,由所述匹配的異常處理程序處理所述異常。9.如權(quán)利要求5所述的方法,其特征在于,所述異常處理程序還能夠匹配和處理多種類型的異常。10.如權(quán)利要求5所述的方法,其特征在于,如果有多個(gè)與所述異常類型相匹配的異常處理程序,則確定與所述異常類型標(biāo)識(shí)對(duì)應(yīng)的異常類型所匹配的異常處理程序的步驟為確定與所述異常類型標(biāo)識(shí)對(duì)應(yīng)的異常類型所匹配的,且與所述程序代碼片>^位置最近的一個(gè)異常處理程序。11.如權(quán)利要求1所述的方法,其特征在于,如果所述程序代碼片段被調(diào)用時(shí)出現(xiàn)異常,則由所述異常處理程序處理所述異常之后,還包括逐級(jí)返回所述程序代碼片段正常運(yùn)行后的結(jié)果,或者運(yùn)行與所述異常處理程序相鄰且在其之后的程序代碼片^:。12.如權(quán)利要求2所述的方法,其特征在于,所述設(shè)置的處理異常的粒度包括函數(shù)級(jí)別、模塊級(jí)別、部件級(jí)別中的至少一種,其中,所述模塊由多個(gè)函數(shù)組成,所述部件由多個(gè)模塊組成。13.如權(quán)利要求8所述的方法,其特征在于,當(dāng)所述處理方式是容錯(cuò)處理方式,由容錯(cuò)方式的異常處理程序處理所述異常;當(dāng)所述處理方式是查錯(cuò)處理方式,由查錯(cuò)方式的異常處理程序處理所述異常,其中,所述異常處理程序與所述程序代碼片l殳相互獨(dú)立。14.如權(quán)利要求1所述的方法,其特征在于,由具有匹配和捕捉異常功能的宏來匹配和捕捉異常;由具有監(jiān)控功能的宏來監(jiān)控正在運(yùn)行的需要保護(hù)的程序代碼片段;由具有拋出異常功能的宏來拋出所述異常。15.—種嵌入式C語言環(huán)境下異常處理裝置,其特征在于,包括監(jiān)控單元,用于監(jiān)控正在運(yùn)行的需要保護(hù)的程序代碼片段;異常拋出單元,用于在所述監(jiān)控單元發(fā)現(xiàn)所述程序代碼片段出現(xiàn)異常后,拋出所述異常,所述異常包括軟件異常、硬件異常中的至少一種;匹配單元,用于根據(jù)獲得的所述異常,確定對(duì)應(yīng)的異常處理程序,所述異常處理程序用于處理所述異常拋出單元拋出的異常,其中,所述異常處理程序與所述程序代碼片段相互獨(dú)立。16.如權(quán)利要求15所述的異常處理裝置,其特征在于,還包括信息記錄單元,用于記錄與所述監(jiān)控單元發(fā)現(xiàn)的所述程序代碼片段出現(xiàn)的異常相關(guān)的信息,并輸出給所述異常拋出單元。17.如權(quán)利要求16所述的異常處理裝置,其特征在于,所述異常拋出單元為第一異常拋出單元,用于在所述監(jiān)控單元發(fā)現(xiàn)所述程序代碼片段出現(xiàn)異常后,將所述與異常相關(guān)的信息打包后傳遞出去,所述與異常相關(guān)的信息至少包括異常類型標(biāo)識(shí),所述異常類型標(biāo)識(shí)用于表示當(dāng)前程序代碼片段出現(xiàn)的異常的類型。18.如權(quán)利要求17所述的異常處理裝置,其特征在于,所述匹配單元為第一匹配單元,用于獲得傳遞過來的與異常相關(guān)的信息,所述與異常相關(guān)的信息中包含異常類型標(biāo)識(shí),并確定與所述異常類型標(biāo)識(shí)對(duì)應(yīng)的異常類型所匹配的異常處理程序,由所述異常處理程序處理所述異常。19.如權(quán)利要求17所述的異常處理裝置,其特征在于,所述匹配單元為第二匹配單元,用于獲得傳遞過來的與異常相關(guān)的信息,所述與異常相關(guān)的信息中包含異常類型標(biāo)識(shí)、指定處理方式標(biāo)識(shí),并確定與所述異常類型標(biāo)識(shí)對(duì)應(yīng)的異常類型所匹配,且與所述的指定處理方式標(biāo)識(shí)對(duì)應(yīng)的處理方式所匹配的異常處理程序,由所述異常處理程序處理所述異常。20.如權(quán)利要求15所述的異常處理裝置,其特征在于,如果有多個(gè)與所述異常的類型相匹配的異常處理程序,所述匹配單元為第三匹配單元,用于根據(jù)獲得的所述異常,確定與所述異常的類型所匹配的,且與所述程序代碼片段位置最近的一個(gè)異常處理程序,由所述異常處理程序處理所述異常。21.如權(quán)利要求15所述的異常處理裝置,其特征在于,所述監(jiān)控單元為第一監(jiān)控單元,用于在一程序執(zhí)行觸發(fā)異常時(shí),根據(jù)設(shè)置的處理異常的粒度監(jiān)控所述正在運(yùn)行的需要保護(hù)的程序代碼片段。22.—種嵌入式C語言環(huán)境下退出線程或進(jìn)程的方法,其特征在于,應(yīng)用于線程主動(dòng)退出的場(chǎng)景,包括獲得線程或進(jìn)程需要退出的信息;檢查需要退出的線程或進(jìn)程所拋出的異常是否仍然占用資源;如果是,則釋放所述占用的資源;退出所述線程或進(jìn)程。23.如權(quán)利要求22所述的方法,其特征在于,檢查需要退出的線程或進(jìn)程所拋出的異常是否仍然占用資源具體包括檢查需要退出的線程或進(jìn)程是否已拋出異常;如果是,則檢查已拋出的異常是否仍然占用資源。24.—種嵌入式C語言環(huán)境下退出線程或進(jìn)程的裝置,其特征在于,包括信息獲得單元,用于獲得線程或進(jìn)程需要退出的信息;資源檢查單元,用于在所述信息獲得單元獲得線程或進(jìn)程需要退出的信息后,檢查需要退出的線程或進(jìn)程所拋出的異常是否仍然占用資源;資源釋放單元,用于在所述資源檢查單元檢查出需要退出的線程或進(jìn)程所拋出的異常仍然占用資源,釋放所述占用的資源;退出單元,用于在所述資源釋放單元釋放所述占用的資源后,退出所述線程或進(jìn)程。25.—種嵌入式C語言環(huán)境下刪除線程或進(jìn)程的方法,其特征在于,應(yīng)用于當(dāng)前線程或進(jìn)程被其他線程或進(jìn)程刪除的場(chǎng)景,包括確定需要?jiǎng)h除的線程或進(jìn)程;檢查需要?jiǎng)h除的線程或進(jìn)程所拋出的異常是否仍然占用資源;如果是,則釋放所述占用的資源;刪除所述線程或進(jìn)程。26.如權(quán)利要求25所述的方法,其特征在于,檢查需要?jiǎng)h除的線程或進(jìn)程所拋出的異常是否仍然占用資源具體包括檢查需要?jiǎng)h除的線程或進(jìn)程是否已拋出異常;如果是,則檢查已拋出的異常是否仍然占用資源。27.—種嵌入式C語言環(huán)境下刪除線程或進(jìn)程的裝置,其特征在于,包括確定單元,用于確定需要?jiǎng)h除的線程或進(jìn)程;資源檢查單元,用于在所述確定單元確定需要?jiǎng)h除的線程或進(jìn)程后,檢查需要?jiǎng)h除的線程或進(jìn)程所拋出的異常是否仍然占用資源;資源釋放單元,用于在所述資源檢查單元檢查出需要?jiǎng)h除的線程或進(jìn)程所拋出的異常仍然占用資源,釋放所述占用的資源;線程或進(jìn)程刪除單元,用于在所述資源釋放單元釋放所述占用的資源后,刪除所述線程或進(jìn)程。28.—種嵌入式系統(tǒng),其特征在于,所述系統(tǒng)包括如權(quán)利要求15-21任意一項(xiàng)所述的異常處理裝置。全文摘要本發(fā)明實(shí)施例提供一種嵌入式C語言環(huán)境下的異常處理方法,包括監(jiān)控正在運(yùn)行的需要保護(hù)的程序代碼片段,如果所述程序代碼片段出現(xiàn)異常,則拋出所述異常,所述異常包括軟件異常、硬件異常中的至少一種;根據(jù)獲得的所述異常,確定相應(yīng)的異常處理程序,由所述異常處理程序處理所述異常,其中,所述異常處理程序與所述程序代碼片段相互獨(dú)立。本發(fā)明還提供一種嵌入式C語言環(huán)境下的異常處理裝置。文檔編號(hào)G06F11/36GK101599039SQ200810100060公開日2009年12月9日申請(qǐng)日期2008年6月3日優(yōu)先權(quán)日2008年6月3日發(fā)明者余加強(qiáng),偉鄭申請(qǐng)人:華為技術(shù)有限公司