專利名稱:一種嵌入式系統(tǒng)中的異常處理方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及軟件容錯(cuò)技術(shù)領(lǐng)域,尤其涉及一種嵌入式系統(tǒng)中的異常處理方法及裝置。
背景技術(shù):
隨著后PC時(shí)代的到來,嵌入式系統(tǒng)已廣泛應(yīng)用于通訊、航空、國防和工業(yè)控制等 可靠性要求較高的關(guān)鍵技術(shù)領(lǐng)域中,其復(fù)雜度及功能在日益增強(qiáng)。同時(shí),為了高效使用資 源,多應(yīng)用多任務(wù)并行的軟件設(shè)計(jì)方法也被普遍采用。這些變化不可避免地導(dǎo)致了系統(tǒng)中 各類錯(cuò)誤和異常的增多,當(dāng)異常出現(xiàn)時(shí),如果未進(jìn)行有效地處理,很可能導(dǎo)致應(yīng)用程序終 止,系統(tǒng)崩潰,甚至引發(fā)災(zāi)難性事故,這是人們所不愿看到的。異常處理作為嵌入式系統(tǒng)容錯(cuò)的常用機(jī)制,對(duì)保證嵌入式系統(tǒng)的可靠性具有十分 重要的作用,但傳統(tǒng)的異常處理機(jī)制已無法適應(yīng)目前嵌入式系統(tǒng)的發(fā)展需要。嵌入式系統(tǒng)中傳統(tǒng)的異常處理采用類似中斷響應(yīng)的方式,如圖1所示,當(dāng)異常發(fā) 生時(shí),處理器會(huì)對(duì)異?,F(xiàn)場進(jìn)行簡單保存,并通過查詢異常向量表,跳轉(zhuǎn)到對(duì)應(yīng)的異常處理 函數(shù)中進(jìn)行處理。這種異常處理機(jī)制與處理器硬件架構(gòu)緊密相關(guān),需要使用大量的匯編代 碼編寫異常處理程序,對(duì)寄存器進(jìn)行操作。同時(shí),對(duì)每一種需要捕獲的異常,都要根據(jù)處理 器架構(gòu)對(duì)異常處理程序進(jìn)行相應(yīng)的修改,這導(dǎo)致異常處理程序的移植性和健壯性比較差。缺少異常處理會(huì)降低系統(tǒng)的可靠性,而有缺陷或無效的異常處理也會(huì)導(dǎo)致嚴(yán)重的 系統(tǒng)故障。隨著嵌入式系統(tǒng)功能的不斷增強(qiáng),系統(tǒng)中往往運(yùn)行著多個(gè)應(yīng)用,每個(gè)應(yīng)用又由若 干個(gè)任務(wù)組成,任務(wù)是可以被操作系統(tǒng)調(diào)度并由處理器執(zhí)行的能夠競爭系統(tǒng)資源的最小單 位,它可以獨(dú)立運(yùn)行以完成某一相對(duì)獨(dú)立的功能。傳統(tǒng)的異常處理機(jī)制只針對(duì)任務(wù)進(jìn)行處 理,如果異常處理程序本身有缺陷或無法處理出現(xiàn)的異常,系統(tǒng)將無法識(shí)別并予以解決,單 個(gè)任務(wù)的異常很可能會(huì)擴(kuò)散到所屬的應(yīng)用程序,進(jìn)而影響整個(gè)系統(tǒng)的穩(wěn)定運(yùn)行。中國專利申請公開說明書200610104447公開了一種計(jì)算機(jī)應(yīng)用程序的監(jiān)控及異 常處理方法,提供了一種異常監(jiān)控及處理方法,不僅能夠?qū)?yīng)用程序的工作狀態(tài)進(jìn)行監(jiān)控, 還可對(duì)程序內(nèi)各個(gè)模塊進(jìn)行監(jiān)控,并能對(duì)程序異常進(jìn)行處理。中國專利申請公開說明書 CN03157874公開了一種多任務(wù)系統(tǒng)的異常監(jiān)控裝置及其方法,提供了一種多任務(wù)系統(tǒng)的異 常監(jiān)控裝置及方法,將異常監(jiān)控的范圍從單任務(wù)擴(kuò)展到多任務(wù),使得多任務(wù)系統(tǒng)中異常監(jiān) 控和自動(dòng)復(fù)位到正常運(yùn)行狀態(tài)的功能得到實(shí)現(xiàn)。上述發(fā)明專利對(duì)異常監(jiān)控的范圍進(jìn)行了細(xì) 化及擴(kuò)展,但異常處理策略單一,并沒有解決異常處理過程中的二次異常,仍有可能異常擴(kuò) 散。二次異常是指異常處理程序在執(zhí)行過程中自身發(fā)生異常。美國專利申請公開說明書US2007022321公開的美國發(fā)明專利“Exception analysis methods and systems”,針對(duì)嵌入式系統(tǒng)提出了 一種異常分析方法,對(duì)系統(tǒng) 運(yùn)行時(shí)出現(xiàn)的異常進(jìn)行分類,但并未給出異常處理的策略。美國專利申請公開說明書 US2005015579公開的美國發(fā)明專利“Handlingexc印tions”,公開了一種嵌入式異常處理 裝置,該裝置包括異常記錄器、智能恢復(fù)代理和異常后分析工具。其中,異常記錄器用于記錄和異常相關(guān)的信息,智能恢復(fù)代理用于檢測異常并決定采用適當(dāng)?shù)奶幚矸绞?,異常后?析工具則負(fù)責(zé)識(shí)別出現(xiàn)異常的原因。然而,智能恢復(fù)代理無法判別異常處理方法本身的缺 陷,無法解決異常處理方法無效和二次異常的問題。綜上所述,現(xiàn)有的異常處理方法已無法適應(yīng)當(dāng)前嵌入式系統(tǒng)的變化,必須引入新 的異常處理機(jī)制,保證系統(tǒng)可靠穩(wěn)定運(yùn)行。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問題是提供一種嵌入式系統(tǒng)中的異常處理方法及裝置,解決 異常處理程序可移植性差,對(duì)于不同處理器架構(gòu)需要進(jìn)行相應(yīng)修改的問題。為解決上述技術(shù)問題,本發(fā)明的一種嵌入式系統(tǒng)中的異常處理方法,包括運(yùn)行應(yīng)用程序時(shí),為所運(yùn)行的應(yīng)用程序創(chuàng)建異常回調(diào)鏈表;應(yīng)用程序向異常回調(diào)鏈表注冊異常處理函數(shù)及異常處理函數(shù)與異常信息的對(duì)應(yīng) 關(guān)系;捕獲到異常后,根據(jù)所捕獲異常的異常信息,從異常處理函數(shù)與異常信息的對(duì)應(yīng) 關(guān)系中,查詢與所捕獲異常匹配的異常處理函數(shù),在查詢到匹配的異常處理函數(shù)后,調(diào)用并 執(zhí)行匹配的異常處理函數(shù),進(jìn)行異常處理。進(jìn)一步地,為所運(yùn)行的應(yīng)用程序創(chuàng)建異?;卣{(diào)鏈表為創(chuàng)建一級(jí)或多級(jí)異?;卣{(diào)鏈 表,若創(chuàng)建多級(jí)異?;卣{(diào)鏈表,則應(yīng)用程序向每一級(jí)的異?;卣{(diào)鏈表分別注冊異常處理函 數(shù)及異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系;查詢與所捕獲異常匹配的異常處理函數(shù)的過程 為逐級(jí)從異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系中,查詢與捕獲的異常匹配的異常處理函 數(shù)。進(jìn)一步地,創(chuàng)建多級(jí)異?;卣{(diào)鏈表時(shí),異?;卣{(diào)鏈表包括任務(wù)級(jí)異常回調(diào)鏈表和 應(yīng)用級(jí)異?;卣{(diào)鏈表,異常處理函數(shù)包括任務(wù)級(jí)異常處理函數(shù)和應(yīng)用級(jí)異常處理函數(shù);應(yīng)用程序向每一級(jí)的異?;卣{(diào)鏈表分別注冊異常處理函數(shù)及異常處理函數(shù)與異 常信息的對(duì)應(yīng)關(guān)系的過程包括向任務(wù)級(jí)異常回調(diào)鏈表注冊任務(wù)級(jí)異常處理函數(shù)及任務(wù)級(jí) 異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系,向應(yīng)用級(jí)異?;卣{(diào)鏈表注冊應(yīng)用級(jí)異常處理函數(shù)及 應(yīng)用級(jí)異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系。進(jìn)一步地,逐級(jí)從異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系中,查詢與捕獲的異常匹 配的異常處理函數(shù)的過程包括根據(jù)所捕獲異常的異常信息,從任務(wù)級(jí)異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系中, 查詢與該異常匹配的任務(wù)級(jí)異常處理函數(shù);若未查詢出匹配的任務(wù)級(jí)異常處理函數(shù)或查詢出的任務(wù)級(jí)異常處理函數(shù)未排除 所捕獲的異常,則根據(jù)所捕獲異常的異常信息,從應(yīng)用級(jí)異常處理函數(shù)與異常信息的對(duì)應(yīng) 關(guān)系中,查詢與該異常匹配的應(yīng)用級(jí)異常處理函數(shù)。進(jìn)一步地,系統(tǒng)中還配置有系統(tǒng)級(jí)異常處理策略,若在應(yīng)用級(jí)異常處理函數(shù)與異 常信息的對(duì)應(yīng)關(guān)系中,未查詢到與異常匹配的應(yīng)用級(jí)異常處理函數(shù)或查詢出的應(yīng)用級(jí)異常 處理函數(shù)未排除所捕獲的異常,則執(zhí)行所配置的系統(tǒng)級(jí)異常處理策略,進(jìn)行異常處理。進(jìn)一步地,創(chuàng)建多級(jí)異?;卣{(diào)鏈表時(shí),調(diào)用并執(zhí)行匹配的異常處理函數(shù),進(jìn)行異常 處理的過程中,若發(fā)生二次異常,則從發(fā)生異常的異常處理函數(shù)所屬的異常回調(diào)鏈表中,查詢是否還存在與捕獲的異常匹配的異常處理函數(shù),若不存在,則從上級(jí)的異?;卣{(diào)鏈表中 查詢是否存在與該異常匹配的異常處理函數(shù),若從所述發(fā)生異常的異常處理函數(shù)所屬的異 ?;卣{(diào)鏈表或所述上級(jí)的異?;卣{(diào)鏈表中查詢到與捕獲的異常匹配的異常處理函數(shù),則調(diào) 用并執(zhí)行查詢到的與捕獲的異常匹配的異常處理函數(shù)。進(jìn)一步地,若發(fā)生異常的異常處理函數(shù)為任務(wù)級(jí)異常處理函數(shù),則從該發(fā)生異常 的任務(wù)級(jí)異常處理函數(shù)所屬的任務(wù)級(jí)異?;卣{(diào)鏈表中,查詢是否還存在與所捕獲異常匹配 的任務(wù)級(jí)異常處理函數(shù),若不存在,則從應(yīng)用級(jí)異?;卣{(diào)鏈表中查詢是否存在與捕獲的異 常匹配的應(yīng)用級(jí)異常處理函數(shù),若不存在,則執(zhí)行系統(tǒng)級(jí)異常處理策略。進(jìn)一步地,一種嵌入式系統(tǒng)中的異常處理裝置,包括異??刂颇K、異常捕獲模 塊和異常處理模塊,其中異??刂颇K,用于在運(yùn)行應(yīng)用程序時(shí),為所運(yùn)行的應(yīng)用程序創(chuàng)建異?;卣{(diào)鏈 表;異常捕獲模塊,用于捕獲異常,將所捕獲異常的異常信息發(fā)送給異常處理模塊;異常處理模塊,用于提供注冊函數(shù),該注冊函數(shù)用于應(yīng)用程序向異常回調(diào)鏈表注 冊異常處理函數(shù)及異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系;該異常處理模塊,還用于在接收到異常信息后,從異常處理函數(shù)與異常信息的對(duì) 應(yīng)關(guān)系中,查詢與該異常匹配的異常處理函數(shù),在查詢到匹配的異常處理函數(shù)后,調(diào)用并執(zhí) 行匹配的異常處理函數(shù),進(jìn)行異常處理。進(jìn)一步地,異??刂颇K為所運(yùn)行的應(yīng)用程序創(chuàng)建一級(jí)或多級(jí)異?;卣{(diào)鏈表;若創(chuàng)建多級(jí)異常回調(diào)鏈表,則應(yīng)用程序向每一級(jí)的異?;卣{(diào)鏈表分別注冊異常處 理函數(shù)及異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系;異常處理模塊查詢與該異常匹配的異常處理函數(shù)的過程為逐級(jí)從異常處理函數(shù) 與異常信息的對(duì)應(yīng)關(guān)系中,查詢與捕獲的異常匹配的異常處理函數(shù)。進(jìn)一步地,異??刂颇K創(chuàng)建多級(jí)異常回調(diào)鏈表時(shí),異常處理模塊調(diào)用并執(zhí)行匹 配的異常處理函數(shù),進(jìn)行異常處理的過程中,若發(fā)生二次異常,則異常處理模塊還用于從發(fā) 生異常的異常處理函數(shù)所屬的異常回調(diào)鏈表中,查詢是否還存在與捕獲的異常匹配的異常 處理函數(shù),若不存在,則從上級(jí)的異?;卣{(diào)鏈表中查詢是否存在與該異常匹配的異常處理 函數(shù),若從所述發(fā)生異常的異常處理函數(shù)所屬的異?;卣{(diào)鏈表或所述上級(jí)的異?;卣{(diào)鏈表 中查詢到與捕獲的異常匹配的異常處理函數(shù),則調(diào)用并執(zhí)行查詢到的與捕獲的異常匹配的 異常處理函數(shù)。綜上所述,本發(fā)明采用異?;卣{(diào)鏈表結(jié)構(gòu),避免了異常處理函數(shù)對(duì)底層硬件的直 接操作,提高了軟件的可移植性和健壯性;采用多級(jí)異常處理方法不僅可以處理任務(wù)級(jí)的 異常,還可以將異常處理手段延伸至應(yīng)用級(jí)和系統(tǒng)級(jí),大大擴(kuò)展了異常處理的范圍,防止異 常的擴(kuò)散,為系統(tǒng)處理各類異常提供多層面的支持,本發(fā)明滿足了當(dāng)前嵌入式系統(tǒng)對(duì)異常 處理的需求,具有擴(kuò)展性好、系統(tǒng)運(yùn)行可靠和應(yīng)用范圍廣等特點(diǎn),并且本發(fā)明不局限于任何 具體的硬件平臺(tái)架構(gòu)和操作系統(tǒng)類型,具有較廣泛的通用性。
圖1為傳統(tǒng)嵌入式系統(tǒng)異常處理機(jī)制的模型圖2為本發(fā)明方法的流程圖;圖3為本發(fā)明裝置的架構(gòu)圖;圖4為本發(fā)明在Linux系統(tǒng)中實(shí)現(xiàn)的流程圖。
具體實(shí)施例方式本發(fā)明為了方便應(yīng)用開發(fā),提供了一種開放式的多級(jí)處理方法,采用異?;卣{(diào)鏈 表掛接異常處理函數(shù),由于采用鏈表結(jié)構(gòu),因此可以支持程序中多層異常處理的嵌套。開發(fā) 者可以根據(jù)應(yīng)用情況在不同級(jí)別的異?;卣{(diào)鏈表中掛接自定義的異常處理函數(shù),當(dāng)出現(xiàn)異 常時(shí),掛接的異常處理函數(shù)會(huì)被調(diào)用,逐級(jí)完成異常處理功能,通過多級(jí)異常處理機(jī)制,滿 足現(xiàn)代嵌入式系統(tǒng)對(duì)異常處理的需求。本實(shí)施例中,為應(yīng)用開發(fā)提供了兩個(gè)層次的異?;卣{(diào)鏈表任務(wù)級(jí)異?;卣{(diào)鏈表 和應(yīng)用級(jí)異?;卣{(diào)鏈表。運(yùn)行任務(wù)時(shí),為任務(wù)分配一個(gè)任務(wù)級(jí)異常回調(diào)鏈表,任務(wù)的異常處理函數(shù)掛接在 其鏈表上,當(dāng)任務(wù)出現(xiàn)異常時(shí),從該任務(wù)的異?;卣{(diào)鏈表尾部開始搜索與所發(fā)生異常相匹 配的異常處理函數(shù),并執(zhí)行搜索到的異常處理函數(shù)。退出任務(wù)時(shí),注銷任務(wù)級(jí)異?;卣{(diào)鏈表 掛接的任務(wù)級(jí)異常處理函數(shù),銷毀該鏈表,為運(yùn)行的新任務(wù)重新分配任務(wù)級(jí)異?;卣{(diào)鏈表。應(yīng)用級(jí)異?;卣{(diào)鏈表與應(yīng)用程序?qū)?yīng),在運(yùn)行應(yīng)用程序時(shí)分配,掛接應(yīng)用級(jí)異常 處理函數(shù),應(yīng)用級(jí)異常處理函數(shù)對(duì)整個(gè)應(yīng)用程序有效,當(dāng)任務(wù)級(jí)異常處理函數(shù)無法處理異 常時(shí),從應(yīng)用級(jí)異常回調(diào)鏈表尾部開始搜索與所發(fā)生異常相匹配的應(yīng)用級(jí)異常處理函數(shù), 并執(zhí)行搜索到的處理函數(shù),退出應(yīng)用程序時(shí),注銷應(yīng)用級(jí)異?;卣{(diào)鏈表掛接的應(yīng)用級(jí)異常 處理函數(shù),銷毀鏈表。下面結(jié)合附圖對(duì)本發(fā)明的具體實(shí)施方式
進(jìn)行說明。圖2為本發(fā)明嵌入式系統(tǒng)中的異常處理方法,包括201 在異常處理模塊中預(yù)設(shè)系統(tǒng)級(jí)異常處理策略,運(yùn)行應(yīng)用程序時(shí),加載異???制模塊、異常捕獲模塊和異常處理模塊,完成初始化過程;系統(tǒng)級(jí)異常處理策略可以為重啟系統(tǒng)或關(guān)閉系統(tǒng)等。202:異常控制模塊為所運(yùn)行的應(yīng)用程序創(chuàng)建任務(wù)級(jí)異?;卣{(diào)鏈表和應(yīng)用級(jí)異常 回調(diào)鏈表;203:應(yīng)用程序通過調(diào)用異常處理模塊的注冊函數(shù)向任務(wù)級(jí)異?;卣{(diào)鏈表注冊任 務(wù)級(jí)異常處理函數(shù)及任務(wù)級(jí)異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系,向應(yīng)用級(jí)異常回調(diào)鏈表 注冊應(yīng)用級(jí)異常處理函數(shù)及應(yīng)用級(jí)異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系;所注冊的任務(wù)級(jí)異常處理函數(shù)以節(jié)點(diǎn)形式依次在任務(wù)級(jí)異常回調(diào)鏈表尾部掛接; 所注冊的應(yīng)用級(jí)異常處理函數(shù)以節(jié)點(diǎn)形式依次在應(yīng)用級(jí)異?;卣{(diào)鏈表尾部掛接。異常處理函數(shù)為編寫在應(yīng)用程序中,對(duì)應(yīng)用程序運(yùn)行中可能出現(xiàn)的問題進(jìn)行異常 處理的函數(shù),一個(gè)任務(wù)可以對(duì)應(yīng)一個(gè)或多個(gè)任務(wù)級(jí)異常處理函數(shù),任務(wù)級(jí)異常處理函數(shù)只 對(duì)本任務(wù)有效,一個(gè)應(yīng)用可以對(duì)應(yīng)一個(gè)或多個(gè)應(yīng)用級(jí)異常處理函數(shù),應(yīng)用級(jí)異常處理函數(shù) 對(duì)整個(gè)應(yīng)用進(jìn)程有效。204:退出任務(wù)時(shí),應(yīng)用程序通過調(diào)用異常處理模塊的注銷函數(shù),注銷在任務(wù)級(jí)異 ?;卣{(diào)鏈表中注冊的任務(wù)級(jí)異常處理函數(shù),操作系統(tǒng)銷毀該鏈表,異??刂颇K為運(yùn)行的新任務(wù)重新分配任務(wù)級(jí)異常回調(diào)鏈表,應(yīng)用程序在任務(wù)級(jí)異?;卣{(diào)鏈表中為新任務(wù)注冊異 常處理函數(shù); 205 異常捕獲模塊捕捉系統(tǒng)和應(yīng)用程序的運(yùn)行異常,捕捉到異常時(shí),保存異常信 息,將異常信息發(fā)送給異常處理模塊; 異常捕獲模塊可以直接調(diào)用或向異常處理模塊發(fā)信號(hào)。對(duì)于不同的CPU體系,具體的異常編號(hào)和種類有所不同,但主要有以下幾類(I)CPU運(yùn)行異常,如浮點(diǎn)錯(cuò)誤、除零錯(cuò)誤、越權(quán)保護(hù)錯(cuò)誤、非法指令和未定義指令寸。(2)內(nèi)存管理異常,如數(shù)據(jù)寫異常、頁面異常、數(shù)據(jù)讀異常、取指異常、未對(duì)齊異常 和緩沖區(qū)異常。206:異常處理模塊接收到異常信息后,調(diào)用過濾函數(shù)遍歷任務(wù)級(jí)異常處理函數(shù)與 異常信息的對(duì)應(yīng)關(guān)系,根據(jù)接收到的異常信息選擇匹配的任務(wù)級(jí)異常處理函數(shù),并調(diào)用并 執(zhí)行選擇的任務(wù)級(jí)異常處理函數(shù)進(jìn)行異常處理;207:異常處理模塊查詢操作系統(tǒng)維護(hù)的異常表,判斷異常是否排除,若未排除,則 執(zhí)行步驟208 ;否則,執(zhí)行步驟215 ;208 異常處理模塊向異??刂颇K發(fā)送任務(wù)級(jí)未排除異常通知消息,并將異常信 息發(fā)送給異??刂颇K;209 異??刂颇K根據(jù)異常信息判斷是否對(duì)該異常進(jìn)行升級(jí)處理,如果是,則執(zhí) 行步驟210 ;否則,丟棄任務(wù)級(jí)未排除異常通知消息;若未查詢到任務(wù)級(jí)異常處理函數(shù),則異常處理模塊同樣請求異??刂颇K判斷是 否對(duì)該異常進(jìn)行升級(jí)處理。異常控制模塊可根據(jù)有無配置應(yīng)用級(jí)異?;卣{(diào)鏈表、發(fā)生異常的任務(wù)的重要性或 系統(tǒng)負(fù)載狀態(tài)判斷是否對(duì)異常進(jìn)行升級(jí)處理,如果任務(wù)的重要性較低,其發(fā)生異常不會(huì)對(duì) 系統(tǒng)運(yùn)行產(chǎn)生影響或系統(tǒng)負(fù)載較大,則可以選擇丟棄通知消息,不對(duì)異常進(jìn)行升級(jí)處理。210:異??刂颇K通知異常處理模塊將異常處理范圍擴(kuò)展到應(yīng)用級(jí),異常處理模 塊調(diào)用過濾函數(shù)遍歷應(yīng)用級(jí)異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系,根據(jù)接收到的異常信息 選擇匹配的應(yīng)用級(jí)異常處理函數(shù),并執(zhí)行選擇的應(yīng)用級(jí)異常處理函數(shù);211 異常處理模塊查詢異常表,判斷異常是否排除,若未排除,則執(zhí)行步驟212 ; 否則,執(zhí)行步驟215;212 異常處理模塊向異常控制模塊發(fā)送應(yīng)用級(jí)未排除異常通知消息,并將異常信 息發(fā)送給異常控制模塊;213 異常控制模塊根據(jù)異常信息判斷是否對(duì)該異常進(jìn)行升級(jí)處理,如果是,則執(zhí) 行步驟214 ;否則,丟棄應(yīng)用級(jí)未排除異常通知消息;214:異??刂颇K通知異常處理模塊將異常處理范圍擴(kuò)展到系統(tǒng)級(jí),異常處理模 塊執(zhí)行系統(tǒng)級(jí)異常處理策略;215 退出應(yīng)用程序時(shí),通過注銷函數(shù)注銷應(yīng)用級(jí)異?;卣{(diào)鏈表中注冊的應(yīng)用級(jí)異 常處理函數(shù)。需要說明的是,在各級(jí)異常處理函數(shù)執(zhí)行中,若發(fā)生二次異常,異常捕獲模塊捕獲 到二次異常后,向異常處理模塊發(fā)送二次異常通知消息,異常處理模塊遍歷出現(xiàn)異常的異常處理函數(shù)所掛接的異?;卣{(diào)鏈表,查找是否存在匹配的異常處理函數(shù),如果不存在,則向 異常控制模塊轉(zhuǎn)發(fā)二次異常通知消息,異??刂颇K判斷是否進(jìn)行升級(jí)處理,如果是,則通 知異常處理模塊將異常處理范圍升級(jí)。例如,任務(wù)級(jí)異常處理函數(shù)在運(yùn)行時(shí)出現(xiàn)異常,異常處理模塊接收到異常捕獲模 塊的二次異常通知后,未查找到替代的任務(wù)級(jí)異常處理函數(shù),轉(zhuǎn)發(fā)二次異常通知消息,若異 ??刂颇K判定需要升級(jí)處理,則異常處理模塊遍歷應(yīng)用級(jí)異?;卣{(diào)鏈表,查找匹配的應(yīng) 用級(jí)異常處理函數(shù)。圖3所示為本發(fā)明的嵌入式系統(tǒng)中的異常處理裝置,包括異??刂颇K、異常捕 獲模塊和異常處理模塊,其中異??刂颇K,用于在運(yùn)行應(yīng)用程序,加載異??刂颇K、異常捕獲模塊和異常處 理模塊,完成初始化過程后,為所運(yùn)行的應(yīng)用程序創(chuàng)建任務(wù)級(jí)異?;卣{(diào)鏈表和應(yīng)用級(jí)異常 回調(diào)鏈表;在接收到任務(wù)級(jí)未排除異常通知消息后,根據(jù)異常信息判斷是否對(duì)該異常進(jìn)行 升級(jí)處理,如果是,則通知異常處理模塊將異常處理范圍擴(kuò)展到應(yīng)用級(jí);否則,丟棄任務(wù)級(jí) 未排除異常通知消息;在接收到應(yīng)用級(jí)未排除異常通知消息后,根據(jù)異常信息判斷是否對(duì) 該異常進(jìn)行升級(jí)處理,如果是,通知異常處理模塊將異常處理范圍擴(kuò)展到系統(tǒng)級(jí);否則,丟 棄應(yīng)用級(jí)未排除異常通知消息。該模塊控制著整個(gè)處理流程,保證了異常處理流程能夠有序地進(jìn)行;同時(shí),異???制模塊還可以調(diào)用運(yùn)行監(jiān)控等系統(tǒng)服務(wù),進(jìn)行錯(cuò)誤信息的存儲(chǔ)和告警操作。異常捕獲模塊,用于捕捉系統(tǒng)和應(yīng)用程序的運(yùn)行異常,捕捉到異常時(shí),保存異常信 息,將異常信息發(fā)送給異常處理模塊。異常處理模塊,用于為應(yīng)用程序提供注冊函數(shù),向任務(wù)級(jí)異?;卣{(diào)鏈表注冊任務(wù) 級(jí)異常處理函數(shù)及任務(wù)級(jí)異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系,向應(yīng)用級(jí)異?;卣{(diào)鏈表注 冊應(yīng)用級(jí)異常處理函數(shù)及應(yīng)用級(jí)異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系;為應(yīng)用程序提供注 銷函數(shù),退出任務(wù)時(shí),應(yīng)用程序通過調(diào)用注銷函數(shù),注銷在任務(wù)級(jí)異?;卣{(diào)鏈表中注冊的任 務(wù)級(jí)異常處理函數(shù),退出應(yīng)用程序時(shí),應(yīng)用程序通過注銷函數(shù)注銷應(yīng)用級(jí)異常回調(diào)鏈表中 注冊的應(yīng)用級(jí)異常處理函數(shù);還用于在接收到異常信息后,調(diào)用過濾函數(shù)遍歷任務(wù)級(jí)異常處理函數(shù)與異常信息 的對(duì)應(yīng)關(guān)系,根據(jù)接收到的異常信息選擇匹配的任務(wù)級(jí)異常處理函數(shù),并調(diào)用并執(zhí)行選擇 的任務(wù)級(jí)異常處理函數(shù)進(jìn)行異常處理;查詢操作系統(tǒng)維護(hù)的異常表,判斷異常是否排除,若 未排除,則向異??刂颇K發(fā)送任務(wù)級(jí)未排除異常通知消息,并將異常信息發(fā)送給異???制模塊;否則,退出應(yīng)用程序時(shí),注銷應(yīng)用級(jí)異常處理函數(shù);接收到將異常處理范圍擴(kuò)展到 應(yīng)用級(jí)的通知后,調(diào)用過濾函數(shù)遍歷應(yīng)用級(jí)異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系,根據(jù)接 收到的異常信息選擇匹配的應(yīng)用級(jí)異常處理函數(shù),并執(zhí)行選擇的應(yīng)用級(jí)異常處理函數(shù);執(zhí) 行應(yīng)用級(jí)異常處理函數(shù)后,判斷異常是否排除,若未排除,則向異??刂颇K發(fā)送應(yīng)用級(jí)未 排除異常通知消息,并將異常信息發(fā)送給異??刂颇K;否則,在退出應(yīng)用程序時(shí),注銷應(yīng) 用級(jí)異常處理函數(shù);在接收到將異常處理范圍擴(kuò)展到系統(tǒng)級(jí)的通知后,執(zhí)行系統(tǒng)級(jí)異常處 理策略。異常處理模塊同時(shí)也支持用戶自定義的處理手段。應(yīng)用示例下面以在Linux中實(shí)現(xiàn)本發(fā)明為例,對(duì)本發(fā)明的方法進(jìn)行說明。為和標(biāo)準(zhǔn)Linux內(nèi)核兼容,本示例基于標(biāo)準(zhǔn)的信號(hào)機(jī)制實(shí)現(xiàn)。圖4所示為本發(fā)明在Linux操作系統(tǒng)中實(shí)現(xiàn)異常處理的方法,包括401 在需要使用異常處理功能的應(yīng)用程序運(yùn)行時(shí),加載并初始化異常處理裝置, 異??刂颇K為應(yīng)用程序構(gòu)建任務(wù)級(jí)和應(yīng)用級(jí)異?;卣{(diào)鏈表;402 應(yīng)用程序通過調(diào)用注冊函數(shù)向異?;卣{(diào)鏈表注冊異常處理函數(shù)及異常信息 與異常處理函數(shù)的對(duì)應(yīng)關(guān)系;應(yīng)用程序通過調(diào)用USr_TrdEXCHdlReg()函數(shù)注冊任務(wù)級(jí)異常處理函數(shù),當(dāng)任務(wù) 退出時(shí),通過調(diào)用UsrJrdExcHdlUnRegO函數(shù)注銷任務(wù)級(jí)異常處理函數(shù)及對(duì)應(yīng)關(guān)系,每個(gè) 任務(wù)啟動(dòng)時(shí),分配一個(gè)異?;卣{(diào)鏈表,任務(wù)級(jí)異常處理函數(shù)以節(jié)點(diǎn)形式掛接在鏈表尾部。
應(yīng)用程序通過調(diào)用USr_Pr0CEXCH00kReg 0函數(shù)注冊應(yīng)用級(jí)異常處理函數(shù) 及異常信息與應(yīng)用級(jí)異常處理函數(shù)的對(duì)應(yīng)關(guān)系,在退出應(yīng)用程序時(shí),通過調(diào)用Usr_ ProcExcHookUnRegO函數(shù)注銷應(yīng)用級(jí)異常處理函數(shù)。403 異常捕獲模塊對(duì)Linux系統(tǒng)及應(yīng)用程序在運(yùn)行中出現(xiàn)的異常進(jìn)行捕捉,當(dāng)捕 捉到異常后,通過信號(hào)調(diào)用異常處理模塊,將異常信息發(fā)送給異常處理模塊;本示例中異常捕獲模塊基于Linux異常捕獲流程實(shí)現(xiàn),只要CPU硬件能夠捕獲的 異常,異常處理模塊均可以捕獲到。404:異常處理模塊接收到異常信息后,通過節(jié)點(diǎn)上的過濾函數(shù)從尾部節(jié)點(diǎn)開始遍 歷任務(wù)級(jí)異常回調(diào)鏈表,根據(jù)異常信息判斷節(jié)點(diǎn)能否處理該異常,若不能,則回退鏈表,獲 取前一節(jié)點(diǎn);若能,則調(diào)用該節(jié)點(diǎn)上掛接的異常處理函數(shù);405 若遍歷任務(wù)級(jí)異常處理鏈表,未查找到匹配的異常處理函數(shù),則將該異常處 理升級(jí)為應(yīng)用級(jí)異常處理,獲取應(yīng)用級(jí)異?;卣{(diào)鏈表gpf_UsrEXCH00k()予以處理;406:如果在指定時(shí)間內(nèi),應(yīng)用級(jí)處理未解決異常,則異常處理模塊將異常處理升 級(jí)到整個(gè)系統(tǒng)的異常處理;并根據(jù)用戶在系統(tǒng)級(jí)異常處理函數(shù)Usr_SetEXCEXitACt()中設(shè) 定的動(dòng)作進(jìn)行處理;407:如果在異常處理過程中出現(xiàn)二次異常,異常處理模塊首先遍歷當(dāng)前層次異常 回調(diào)鏈表選擇其他合適的異常處理函數(shù),若無法解決異常,則將異常處理行為升級(jí)。隨著異常處理逐漸成為提升軟件系統(tǒng)健壯性和可用性的關(guān)鍵因素,根據(jù)嵌入式系 統(tǒng)異常處理的相關(guān)需求,結(jié)合主流操作系統(tǒng)異常處理機(jī)制的特點(diǎn),本發(fā)明提出了一種結(jié)構(gòu) 化的異常處理裝置,包含了三個(gè)主要功能模塊異常捕獲模塊、異常處理模塊和異??刂颇?塊,涵蓋嵌入式系統(tǒng)異常處理的絕大多數(shù)特性,為系統(tǒng)處理各類異常提供多層面的支持。
權(quán)利要求
一種嵌入式系統(tǒng)中的異常處理方法,包括運(yùn)行應(yīng)用程序時(shí),為所運(yùn)行的應(yīng)用程序創(chuàng)建異?;卣{(diào)鏈表;所述應(yīng)用程序向所述異?;卣{(diào)鏈表注冊異常處理函數(shù)及所述異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系;捕獲到異常后,根據(jù)所捕獲異常的異常信息,從所述異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系中,查詢與所捕獲異常匹配的異常處理函數(shù),在查詢到匹配的異常處理函數(shù)后,調(diào)用并執(zhí)行所述匹配的異常處理函數(shù),進(jìn)行異常處理。
2.如權(quán)利要求1所述的方法,其特征在于,所述為所運(yùn)行的應(yīng)用程序創(chuàng)建異?;卣{(diào)鏈表為創(chuàng)建一級(jí)或多級(jí)異常回調(diào)鏈表,若創(chuàng)建 多級(jí)異?;卣{(diào)鏈表,則所述應(yīng)用程序向每一級(jí)的異?;卣{(diào)鏈表分別注冊異常處理函數(shù)及所 述異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系;所述查詢與所捕獲異常匹配的異常處理函數(shù)的過 程為逐級(jí)從異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系中,查詢與捕獲的異常匹配的異常處理 函數(shù)。
3.如權(quán)利要求2所述的方法,其特征在于,創(chuàng)建多級(jí)異常回調(diào)鏈表時(shí),所述異常回調(diào)鏈表包括任務(wù)級(jí)異?;卣{(diào)鏈表和應(yīng)用級(jí)異 常回調(diào)鏈表,所述異常處理函數(shù)包括任務(wù)級(jí)異常處理函數(shù)和應(yīng)用級(jí)異常處理函數(shù);所述應(yīng)用程序向每一級(jí)的異?;卣{(diào)鏈表分別注冊異常處理函數(shù)及所述異常處理函數(shù) 與異常信息的對(duì)應(yīng)關(guān)系的過程包括向所述任務(wù)級(jí)異?;卣{(diào)鏈表注冊所述任務(wù)級(jí)異常處理 函數(shù)及任務(wù)級(jí)異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系,向所述應(yīng)用級(jí)異常回調(diào)鏈表注冊應(yīng)用 級(jí)異常處理函數(shù)及應(yīng)用級(jí)異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系。
4.如權(quán)利要求3所述的方法,其特征在于,所述逐級(jí)從異常處理函數(shù)與異常信息的對(duì) 應(yīng)關(guān)系中,查詢與捕獲的異常匹配的異常處理函數(shù)的過程包括根據(jù)所捕獲異常的異常信息,從所述任務(wù)級(jí)異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系中, 查詢與該異常匹配的任務(wù)級(jí)異常處理函數(shù);若未查詢出匹配的任務(wù)級(jí)異常處理函數(shù)或查詢出的任務(wù)級(jí)異常處理函數(shù)未排除所捕 獲的異常,則根據(jù)所捕獲異常的異常信息,從所述應(yīng)用級(jí)異常處理函數(shù)與異常信息的對(duì)應(yīng) 關(guān)系中,查詢與該異常匹配的應(yīng)用級(jí)異常處理函數(shù)。
5.如權(quán)利要求4所述的方法,其特征在于,系統(tǒng)中還配置有系統(tǒng)級(jí)異常處理策略,若在 所述應(yīng)用級(jí)異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系中,未查詢到與所述異常匹配的應(yīng)用級(jí)異 常處理函數(shù)或查詢出的應(yīng)用級(jí)異常處理函數(shù)未排除所捕獲的異常,則執(zhí)行所配置的系統(tǒng)級(jí) 異常處理策略,進(jìn)行異常處理。
6.如權(quán)利要求3 5任一其一所述的方法,其特征在于,創(chuàng)建多級(jí)異常回調(diào)鏈表時(shí),所 述調(diào)用并執(zhí)行所述匹配的異常處理函數(shù),進(jìn)行異常處理的過程中,若發(fā)生二次異常,則從發(fā) 生異常的異常處理函數(shù)所屬的異?;卣{(diào)鏈表中,查詢是否還存在與捕獲的異常匹配的異常 處理函數(shù),若不存在,則從上級(jí)的異?;卣{(diào)鏈表中查詢是否存在與該異常匹配的異常處理 函數(shù),若從所述發(fā)生異常的異常處理函數(shù)所屬的異?;卣{(diào)鏈表或所述上級(jí)的異?;卣{(diào)鏈表 中查詢到與捕獲的異常匹配的異常處理函數(shù),則調(diào)用并執(zhí)行查詢到的與捕獲的異常匹配的 異常處理函數(shù)。
7.如權(quán)利要求6所述的方法,其特征在于,若所述發(fā)生異常的異常處理函數(shù)為任務(wù)級(jí)異常處理函數(shù),則從該發(fā)生異常的任務(wù)級(jí)異常處理函數(shù)所屬的任務(wù)級(jí)異常回調(diào)鏈表中,查 詢是否還存在與所捕獲異常匹配的任務(wù)級(jí)異常處理函數(shù),若不存在,則從應(yīng)用級(jí)異?;卣{(diào) 鏈表中查詢是否存在與捕獲的異常匹配的應(yīng)用級(jí)異常處理函數(shù),若不存在,則執(zhí)行所述系 統(tǒng)級(jí)異常處理策略。
8.一種嵌入式系統(tǒng)中的異常處理裝置,包括異常控制模塊、異常捕獲模塊和異常處 理模塊,其中所述異??刂颇K,用于在運(yùn)行應(yīng)用程序時(shí),為所運(yùn)行的應(yīng)用程序創(chuàng)建異?;卣{(diào)鏈表;所述異常捕獲模塊,用于捕獲異常,將所捕獲異常的異常信息發(fā)送給所述異常處理模塊;所述異常處理模塊,用于提供注冊函數(shù),該注冊函數(shù)用于應(yīng)用程序向所述異?;卣{(diào)鏈 表注冊異常處理函數(shù)及所述異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系; 該異常處理模塊,還用于在接收到異常信息后,從所述異常處理函數(shù)與異常信息的對(duì) 應(yīng)關(guān)系中,查詢與該異常匹配的異常處理函數(shù),在查詢到匹配的異常處理函數(shù)后,調(diào)用并執(zhí) 行所述匹配的異常處理函數(shù),進(jìn)行異常處理。
9.如權(quán)利要求8所述的裝置,其特征在于,所述異??刂颇K為所運(yùn)行的應(yīng)用程序創(chuàng)建一級(jí)或多級(jí)異常回調(diào)鏈表; 若創(chuàng)建多級(jí)異?;卣{(diào)鏈表,則所述應(yīng)用程序向每一級(jí)的異常回調(diào)鏈表分別注冊異常處 理函數(shù)及所述異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系;所述異常處理模塊查詢與該異常匹配的異常處理函數(shù)的過程為逐級(jí)從異常處理函數(shù) 與異常信息的對(duì)應(yīng)關(guān)系中,查詢與捕獲的異常匹配的異常處理函數(shù)。
10.如權(quán)利要求9所述的裝置,其特征在于,所述異??刂颇K創(chuàng)建多級(jí)異?;卣{(diào)鏈表時(shí),所述異常處理模塊調(diào)用并執(zhí)行所述匹配 的異常處理函數(shù),進(jìn)行異常處理的過程中,若發(fā)生二次異常,則所述異常處理模塊還用于從 發(fā)生異常的異常處理函數(shù)所屬的異?;卣{(diào)鏈表中,查詢是否還存在與捕獲的異常匹配的異 常處理函數(shù),若不存在,則從上級(jí)的異?;卣{(diào)鏈表中查詢是否存在與該異常匹配的異常處 理函數(shù),若從所述發(fā)生異常的異常處理函數(shù)所屬的異?;卣{(diào)鏈表或所述上級(jí)的異常回調(diào)鏈 表中查詢到與捕獲的異常匹配的異常處理函數(shù),則調(diào)用并執(zhí)行查詢到的與捕獲的異常匹配 的異常處理函數(shù)。
全文摘要
本發(fā)明公開了一種嵌入式系統(tǒng)中的異常處理方法,包括運(yùn)行應(yīng)用程序時(shí),為所運(yùn)行的應(yīng)用程序創(chuàng)建異?;卣{(diào)鏈表;應(yīng)用程序向異?;卣{(diào)鏈表注冊異常處理函數(shù)及異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系;捕獲到異常后,根據(jù)所捕獲異常的異常信息,從異常處理函數(shù)與異常信息的對(duì)應(yīng)關(guān)系中,查詢與所捕獲異常匹配的異常處理函數(shù),在查詢到匹配的異常處理函數(shù)后,調(diào)用并執(zhí)行匹配的異常處理函數(shù),進(jìn)行異常處理。本發(fā)明采用異?;卣{(diào)鏈表結(jié)構(gòu),避免了異常處理函數(shù)對(duì)底層硬件的直接操作,提高了軟件的可移植性和健壯性;本發(fā)明滿足了當(dāng)前嵌入式系統(tǒng)對(duì)異常處理的需求,具有擴(kuò)展性好、系統(tǒng)運(yùn)行可靠和應(yīng)用范圍廣等特點(diǎn)。
文檔編號(hào)G06F11/36GK101923508SQ20091020377
公開日2010年12月22日 申請日期2009年6月12日 優(yōu)先權(quán)日2009年6月12日
發(fā)明者王繼剛, 謝世波 申請人:中興通訊股份有限公司