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