專利名稱:一種避免主機(jī)在訪問共享設(shè)備造成異常死鎖的方法
技術(shù)領(lǐng)域:
木發(fā)明涉及嵌入式系統(tǒng)技術(shù)領(lǐng)域,特別是涉及一種避免主機(jī)在訪問共享設(shè) 備造成異常死鎖的方法。
背景技術(shù):
嵌入式處理器會(huì)連接各種外設(shè)來實(shí)現(xiàn)各種功能,雖然外設(shè)功能各不相同, 但是嵌入式處理器同外設(shè)的握手方式通常只有兩種, 一種是查詢方式, 一種是 中斷方式。在使用了查詢方式工作的系統(tǒng)中,可能會(huì)因?yàn)榉N種原因造成死鎖, 所以設(shè)計(jì)出可靠的軟件保證系統(tǒng)不被死鎖是相當(dāng)重要的。
對(duì)于死鎖,不同的領(lǐng)域會(huì)給出不同的定義,在這里主要是指嵌入式處理器 一直在等待設(shè)備完成操作而不能做其它事情。死鎖的必要條件歸納起來有下面 幾條
1、 互斥條件 一個(gè)資源每次只能被一個(gè)進(jìn)程使用。
2、 請(qǐng)求與保持條件 一個(gè)進(jìn)程因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持 不放。
3、 不剝奪條件:進(jìn)程已獲得的資源,在末使用完之前,不能強(qiáng)行剝奪。
4、 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。 在某些嵌入式系統(tǒng)軟件中,上述"進(jìn)程"可以理解為任務(wù)或某段訪問共享
資源的特定代碼(在后面的描述中統(tǒng)稱為任務(wù))。隨著軟件技術(shù)的發(fā)展,解決 共享資源訪問沖突問題已經(jīng)有很多種方法,比如禁止中斷,利用互斥信號(hào)量和 使用各種資源鎖等等。但是這些方法都旨在解決怎樣將共享資源合理分配給不 同的任務(wù)使用,確保任務(wù)不會(huì)因?yàn)樵噲D去獲取某個(gè)共享資源而造成死鎖。
4而在嵌入式系統(tǒng)中,還有可能出現(xiàn)任務(wù)已經(jīng)獲取共享資源而死鎖的現(xiàn)象。 可能的原因是
1、 共享設(shè)各發(fā)生故障,則操作完成標(biāo)志就可能不會(huì)被置位,對(duì)應(yīng)的任務(wù)將 一直處于等待狀態(tài)而造成死鎖。
2、 當(dāng)一個(gè)任務(wù)在査詢共享設(shè)備操作完成標(biāo)志是否被置1時(shí),發(fā)生了一個(gè)中 斷或產(chǎn)生了仟?jiǎng)?wù)調(diào)度,碰巧這個(gè)中斷或者被調(diào)度執(zhí)行的新任務(wù)也要訪問這個(gè)共 享設(shè)備,而中斷服務(wù)例程或被調(diào)度的新任務(wù)在訪問完共享設(shè)備后會(huì)清除共享設(shè) 備操作完成標(biāo)志(這是設(shè)備能夠重新正常工作的必要條件),那么在中斷返回 后或任務(wù)被重新調(diào)度導(dǎo)致先前査詢共亨設(shè)備操作完成標(biāo)志是否被置1的任務(wù)繼 續(xù)開始執(zhí)行,去循環(huán)査洵一個(gè)不可能再被置l的共享設(shè)備操作完成標(biāo)志,則這 個(gè)任務(wù)就被死鎖。例如,個(gè)任務(wù)需要采集某路模擬信號(hào),在啟動(dòng)了模數(shù)轉(zhuǎn)換 器后,任務(wù)開始等待模數(shù)轉(zhuǎn)換完成標(biāo)志被置位,此時(shí)發(fā)生了一個(gè)中斷或任務(wù)調(diào) 度,碰巧在中斷服務(wù)例程中或被調(diào)度的新任務(wù)中也要使用同樣的模數(shù)轉(zhuǎn)換器采 集某路模擬信號(hào),那么模數(shù)轉(zhuǎn)換器將被重新啟動(dòng),在轉(zhuǎn)換結(jié)束后,轉(zhuǎn)換完成標(biāo) 志被共亨設(shè)備自動(dòng)置1,中斷例程或被調(diào)度的新任務(wù)檢測(cè)到該標(biāo)志被置位后清除 該標(biāo)志,然后執(zhí)行其它操作,最終中斷返回或者任務(wù)會(huì)被重新調(diào)度,而使先前 等待模數(shù)轉(zhuǎn)換完成標(biāo)志置位的任務(wù)得到繼續(xù)執(zhí)行,但是此時(shí)模數(shù)轉(zhuǎn)換器處于閑 置狀態(tài),轉(zhuǎn)換完成標(biāo)志也就不會(huì)被置位了,那么該任務(wù)將永遠(yuǎn)等待下去造成死 鎖。這種情況比較隱蔽,在軟件設(shè)計(jì)之初不易被考慮到。
綜上所述,嵌入式系統(tǒng)的外設(shè)屬于硬件資源,硬件發(fā)生故障可能會(huì)導(dǎo)致系 統(tǒng)死鎖;嵌入式系統(tǒng)的外設(shè)是互斥的,并且是不可剝奪的,其固有特性造成了 死鎖的必要條件;常規(guī)的方法只能解決共享資源分配問題,即只能解決資源分 配前的問題,不能解決嵌入式系統(tǒng)中任務(wù)重新獲得共享設(shè)備控制權(quán)后造成死鎖 的問題。
發(fā)明內(nèi)容
本發(fā)明提供了一種避免主機(jī)在訪問共享設(shè)備造成異常死鎖的方法,能夠解 決任務(wù)在獲取了共享設(shè)備控制權(quán)后發(fā)生死鎖的問題。 為達(dá)到發(fā)明目的,本發(fā)明所采用的技術(shù)方案是
一種避免主機(jī)在訪問共享設(shè)備造成異常死鎖的方法,適用于嵌入式系統(tǒng), 包括以下步驟
A、 為所述共享設(shè)備設(shè)置一個(gè)訪問沖突標(biāo)志;
B、 一個(gè)低優(yōu)先級(jí)任務(wù)啟動(dòng)所述共享設(shè)備;
C、 所述低優(yōu)先級(jí)任務(wù)查詢所述共享設(shè)備操作完成標(biāo)志是否被置1,如果所 述共享設(shè)備操作完成標(biāo)志被置1,則轉(zhuǎn)至步驟D,否則轉(zhuǎn)至歩驟E;
D、 所述低優(yōu)先級(jí)任務(wù)完成對(duì)所述共享設(shè)備訪問,將所述共享設(shè)備操作完成 標(biāo)志清0;
E、 所述低優(yōu)先級(jí)任務(wù)查詢所述共享設(shè)備訪問沖突標(biāo)志是否被置1,如果所
述共享設(shè)備訪問沖突標(biāo)志被置l,則將其清O并轉(zhuǎn)至歩驟B,重試訪問所述共享
設(shè)備,否則轉(zhuǎn)至歩驟C;
F、 當(dāng)所述低優(yōu)先級(jí)任務(wù)在執(zhí)行步驟B、步驟C或者步驟E時(shí),中斷服務(wù)例 程或高優(yōu)先級(jí)任務(wù)打斷了所述低優(yōu)先級(jí)任務(wù)的執(zhí)行并訪問所述共享設(shè)備,則在
所述中斷服務(wù)例程或高優(yōu)先級(jí)任務(wù)中啟動(dòng)共享設(shè)備,并轉(zhuǎn)至歩驟G;
G、 所述中斷服務(wù)例程或高優(yōu)先級(jí)任務(wù)查詢所述共享設(shè)備操作完成標(biāo)志是否 被置l,如果所述共享設(shè)備操作完成標(biāo)志被置1,則轉(zhuǎn)至步驟H,否則重新執(zhí)行
步驟G;
H、 所述中斷服務(wù)例程或高優(yōu)先級(jí)任務(wù)將所述共享設(shè)備操作完成標(biāo)志清0, 共享設(shè)備訪問沖突標(biāo)志置l,并中斷返回或任務(wù)重新調(diào)度,所述低優(yōu)先級(jí)任務(wù)繼 續(xù)執(zhí)行步驟B、步驟C或者步驟E。
在訪問共享設(shè)備的任務(wù)或中斷服務(wù)例程中設(shè)置超時(shí)計(jì)數(shù)值,當(dāng)所述任務(wù)或 中斷服務(wù)例程?hào)嗽兯龉蚕碓O(shè)備操作完成標(biāo)忐的次數(shù)超過所述超時(shí)計(jì)數(shù)值時(shí),
6則退出查詢循環(huán),進(jìn)行超時(shí)錯(cuò)誤處理。
在訪問共享設(shè)備的低優(yōu)先級(jí)任務(wù)中設(shè)置重試次數(shù)值,當(dāng)所述低優(yōu)先級(jí)任務(wù) 訪問所述共享設(shè)備的次數(shù)超過所述重試次數(shù)值時(shí),進(jìn)行訪問沖突錯(cuò)誤處理。
所述共享設(shè)備是具有硬件標(biāo)志反映操作已經(jīng)完成的外圍設(shè)備,包括嵌入式 系統(tǒng)中的定時(shí)器、串U控制器、IIC總線控制器、SPI總線控制器、USB總線控 制器、P麗控制器、比較器、模數(shù)轉(zhuǎn)換器、數(shù)模轉(zhuǎn)換器。
所述嵌入式系統(tǒng)是前后臺(tái)嵌入式系統(tǒng),或者是具有操作系統(tǒng)的嵌入式系統(tǒng)。
采用了本發(fā)明的技術(shù)方案,能夠解決由于硬件或軟件原因造成的訪問共享 設(shè)備造成任務(wù)死鎖的問題,也能夠解決任務(wù)在獲取了共享設(shè)備控制權(quán)后發(fā)生死 鎖的問題,并且方法的實(shí)現(xiàn)簡(jiǎn)單、可靠,特別適用于處理器性能不高,存儲(chǔ)器 資源緊張的嵌入式系統(tǒng)領(lǐng)域。
圖1是本發(fā)明中避免訪問共享設(shè)備造成死鎖的流程圖。
圖2是本發(fā)明中針對(duì)前后臺(tái)嵌入式系統(tǒng)中避免訪問共享設(shè)備造成死鎖的流 程圖。
圖3是本發(fā)明中針對(duì)具有操作系統(tǒng)的嵌入式系統(tǒng)中避免訪問共享設(shè)備造成 死鎖的流程圖。
具體實(shí)施例方式
下面結(jié)合附圖和實(shí)施實(shí)例對(duì)本發(fā)明進(jìn)一步說明。
圖1是本發(fā)明中避免訪問共享設(shè)備造成死鎖的流程圖。如圖1所示,該流
程包括以下步驟
步驟101、在程序中為共享設(shè)備設(shè)置一個(gè)全局訪問沖突標(biāo)志。
歩驟102、在低優(yōu)先級(jí)任務(wù)中設(shè)置共享設(shè)備訪問的重試次數(shù)值。 步驟103、在低優(yōu)先級(jí)任務(wù)中啟動(dòng)共享設(shè)備并設(shè)置超時(shí)計(jì)數(shù)值。
7步驟104、在低優(yōu)先級(jí)任務(wù)中査詢共享設(shè)備操作完成標(biāo)志是否被置l,如果
該標(biāo)志被置i,則將其清o,并將共享設(shè)備訪問沖突標(biāo)志清0,表示所述低優(yōu)先
級(jí)任務(wù)對(duì)所述共享設(shè)備訪問成功完成,可以執(zhí)行低優(yōu)先級(jí)任務(wù)中的其它操作,
否則轉(zhuǎn)至歩驟105。
步驟105、在低優(yōu)先級(jí)任務(wù)中檢測(cè)超時(shí)計(jì)數(shù)值是否為0,如果為0,表示所 述低優(yōu)先級(jí)任務(wù)查詢所述共享設(shè)備操作完成標(biāo)志次數(shù)已經(jīng)大于所規(guī)定的最多次 數(shù),所述低優(yōu)先級(jí)任務(wù)應(yīng)該進(jìn)行相應(yīng)的超時(shí)錯(cuò)誤處理,否則轉(zhuǎn)至步驟106。
步驟106、在低優(yōu)先級(jí)任務(wù)中檢測(cè)共享設(shè)備訪問沖突標(biāo)志是否被置l,如果 沒有被置l,則將超時(shí)計(jì)數(shù)值減1后轉(zhuǎn)至步驟104,重新進(jìn)入査詢所述共享設(shè)備 操作完成標(biāo)志的循環(huán),否則轉(zhuǎn)至步驟107。
步驟107、在低優(yōu)先級(jí)任務(wù)屮檢測(cè)所述共享設(shè)備訪問重試次數(shù)值是否為0, 如果為0,表明所述低優(yōu)先級(jí)任務(wù)對(duì)所述共享設(shè)備的訪問次數(shù)已經(jīng)超過了所規(guī)定 的最大次數(shù),并且每次都發(fā)生了訪問沖突(即所述低優(yōu)先級(jí)任務(wù)在啟動(dòng)所述共 享設(shè)備后到共享設(shè)備完成指定操作期間,有中斷服務(wù)例程或高優(yōu)先級(jí)任務(wù)打斷 了低優(yōu)先級(jí)任務(wù)的執(zhí)行,并訪問了所述共享設(shè)備),則所述低優(yōu)先級(jí)任務(wù)應(yīng)該進(jìn) 行相應(yīng)的訪問沖突錯(cuò)誤處理,并將所述共享設(shè)備訪問沖突標(biāo)志清O,否則將所述 重試次數(shù)值減l,并將所述共享設(shè)備訪問沖突標(biāo)志清O,然后轉(zhuǎn)至步驟103,進(jìn) 行重試訪問共享設(shè)備的循環(huán)。
步驟108、在低優(yōu)先級(jí)任務(wù)啟動(dòng)共享設(shè)備后到共享設(shè)備完成指定操作期間如 果有中斷服務(wù)例程或高優(yōu)先級(jí)任務(wù)訪問共享設(shè)備,所述低優(yōu)先級(jí)任務(wù)被打斷, 從而轉(zhuǎn)至步驟109,進(jìn)入中斷服務(wù)例程或高優(yōu)先級(jí)任務(wù)的執(zhí)行步驟中。
步驟109、在中斷服務(wù)例程或高優(yōu)先級(jí)任務(wù)中啟動(dòng)共享設(shè)備并設(shè)置超時(shí)計(jì)數(shù)
值,然后轉(zhuǎn)至歩驟iio。
歩驟110、在中斷服務(wù)例程或高優(yōu)先級(jí)任務(wù)中査詢共享設(shè)備操作完成標(biāo)志是 否被置l,如果該標(biāo)志被置l,則轉(zhuǎn)至步驟113,否則轉(zhuǎn)至歩驟lll。步驟lll、在中斷服務(wù)例程或高優(yōu)先級(jí)任務(wù)中,檢測(cè)超時(shí)計(jì)數(shù)值是否為0, 如果為0,表示所述中斷服務(wù)例程或高優(yōu)先級(jí)任務(wù)查詢所述共享設(shè)備操作完成標(biāo) 志次數(shù)已經(jīng)大于所規(guī)定的最多次數(shù),所述中斷服務(wù)例程或高優(yōu)先級(jí)任務(wù)應(yīng)該進(jìn) 行相應(yīng)的超時(shí)錯(cuò)誤處理,轉(zhuǎn)至步驟112,否則將超時(shí)計(jì)數(shù)值減1后,轉(zhuǎn)至步驟 110。
步驟112、在中斷服務(wù)例程或高優(yōu)先級(jí)任務(wù)中,進(jìn)行共享設(shè)備訪問超時(shí)錯(cuò)誤 處理,然后轉(zhuǎn)至歩驟113。
歩驟113、在中斷服務(wù)例程或高優(yōu)先級(jí)任務(wù)中,將共享設(shè)備操作完成標(biāo)志清 0,并將共享設(shè)備訪問沖突標(biāo)志置1,然后執(zhí)行中斷服務(wù)例程或高優(yōu)先級(jí)任務(wù)中 的其它操作。
歩驟114、隨著中斷返回或者任務(wù)的重新調(diào)度,先前被打斷的低優(yōu)先級(jí)任務(wù) 將會(huì)繼續(xù)從被打斷處執(zhí)行,即轉(zhuǎn)至步驟104、步驟105、步驟106或歩驟107, 如前所述,低優(yōu)先級(jí)仵務(wù)將會(huì)檢測(cè)到共享設(shè)備訪問沖突標(biāo)志被置l,從而進(jìn)行共 享設(shè)備訪問的重試操作,而避免了死鎖的發(fā)生。
在上述步驟的指導(dǎo)下,可以得出針對(duì)不同的嵌入式系統(tǒng)的具體實(shí)施方式
。 下面描述一種前后臺(tái)嵌入式系統(tǒng)中避免訪問共享設(shè)備造成死鎖的具體實(shí)施 方式。在前后臺(tái)嵌入式系統(tǒng)中,后臺(tái)程序在任意時(shí)刻都可能被前臺(tái)程序打斷, 所以后臺(tái)程序?qū)儆诳赡苁ス蚕碓O(shè)備控制權(quán)的代碼(即所述避免訪問共享設(shè)備 造成死鎖的流程歩驟中的低優(yōu)先級(jí)任務(wù)),在查詢共享設(shè)備操作完成標(biāo)志的同時(shí) 需要檢測(cè)共享設(shè)備訪問沖突標(biāo)志。前臺(tái)程序?qū)儆诰哂袚屨脊蚕碓O(shè)備控制權(quán)能力 的代碼(即所述避免訪問共享設(shè)備造成死鎖的流程步驟中的中斷服務(wù)例程),如 果系統(tǒng)允許中斷嵌套,并且有多個(gè)中斷共享一個(gè)設(shè)備,那么,前臺(tái)程序也屬于 可能失去共享設(shè)備控制權(quán)的代碼(即所述避免訪問共享設(shè)備造成死鎖的流程歩 驟中的低優(yōu)先級(jí)任務(wù)),所以前臺(tái)程序需要在訪問完共享設(shè)備后置位共享設(shè)備訪 問沖突標(biāo)志,并根據(jù)實(shí)際情況確定是否需要在査詢共享設(shè)備操作完成標(biāo)志的同時(shí)檢測(cè)共享設(shè)備訪問沖突標(biāo)志。
本具體實(shí)施方式
考慮種廣泛的情況,在前后臺(tái)嵌入式系統(tǒng)中,有一個(gè)后 臺(tái)程序和兩個(gè)前臺(tái)程序(前臺(tái)程序1和前臺(tái)程序2)共享一個(gè)設(shè)備,該系統(tǒng)允許 中斷嵌套,并且前臺(tái)程序2的中斷優(yōu)先級(jí)高于前臺(tái)程序1的中斷優(yōu)先級(jí)。
上述前后臺(tái)嵌入式系統(tǒng)中的后臺(tái)程序?qū)儆诳赡苁ス蚕碓O(shè)備控制權(quán)的代 碼,前臺(tái)程序1既屬于可能失去共享設(shè)備控制權(quán)的代碼又屬于具有搶占共享設(shè)
備控制權(quán)能力的代碼,前臺(tái)程序2屬于具有搶占共享設(shè)備控制權(quán)能力的代碼。
下面分別給出各程序的c語言參考代碼。
后臺(tái)程序參考代碼-
ftdefine MaxLoopCycles 1000 #define MaxRetryCycles 2
unsigned char LootFlag;〃①定義共享設(shè)備訪問沖突標(biāo)志,為一全局變量 void BackgroundXxx(void)
unsigned int loop—count = MaxLoopCycles; unsigned char retry—count 二 MaxRetryCycles;
while(retry—count)
StartDevice(); 〃②啟動(dòng)設(shè)備,重試操作也要重新啟動(dòng)設(shè)備
while(DCFlag == 0 && LootFlag = 0 && loop—count != 0) 〃③査詢?cè)O(shè)備操作完成標(biāo)志DCFlag時(shí)
{ 〃同時(shí)檢測(cè)訪問沖突標(biāo)志LootFlag和
loop—count—; 〃超時(shí)計(jì)數(shù)值loop—count
if (DCFlag != 0)〃④設(shè)備操作完成標(biāo)志被正常置位
DCFlag = 0;〃則將操作完成標(biāo)志清零 LootFlag = 0;〃將訪問沖突標(biāo)志清零 break ;〃并退出重試循環(huán)
if(LootFlag !二 0)〃⑤如果發(fā)生了訪問沖突,即在等待過程中被前 臺(tái)程序打斷
LootFlag = 0;〃則將訪問標(biāo)志清0 retry—count—;〃重試次數(shù)減1 continue; 〃并進(jìn)行重試
if (loop—count == 0)〃 如果訪問超時(shí)
break;〃則進(jìn)行超時(shí)錯(cuò)誤處理并退出重試循環(huán)if (retry—count 二= 0) 〃⑦如果在規(guī)定的重試次數(shù)中,設(shè)備訪問還是不 成功,則進(jìn)行相應(yīng)錯(cuò)誤處理
}
前臺(tái)程序1的參考代碼
void ISRlXxx(void)
unsigned int loop—count = MaxLoopCycles; unsigned char retry—count = MaxRetryCycles;
while(retry—count)
StartDevice(); 〃②啟動(dòng)設(shè)備,重試操作也要重新啟動(dòng)設(shè)備 while(DCFlag == 0 && LootFlag 二= 0 && loop—count != 0) 〃③ 査詢?cè)O(shè)備操作完成標(biāo)志DCFlag時(shí)
12{ 〃同時(shí)檢測(cè)訪問標(biāo)志LootFlag和
loop—count—; 〃超時(shí)計(jì)數(shù)值loop—count
if(DCFlag != 0)〃④設(shè)備操作完成標(biāo)志被正常置位
DCFlag 二 0;〃則將標(biāo)志清零
LootFlag= l;〃⑧與后臺(tái)程序不同的是,在設(shè)備正常完成操作后 需要把訪問沖突標(biāo)志置位
break ;〃并退出重試循環(huán)
if(LootFlag != 0)〃⑤如果發(fā)生了訪問沖突,即在等待過程中被前 臺(tái)程序打斷
LootFlag 二 0;〃則將訪問標(biāo)志清0 retry—count—; 〃重試次數(shù)減1 cont inue; 〃并進(jìn)行重試
if (loop_count == 0)〃⑥如果訪問超時(shí)
break;〃則進(jìn)行超時(shí)錯(cuò)誤處理并退出重試循環(huán)if(retry_count == 0)〃⑦如果在規(guī)定的重試次數(shù)中,設(shè)備訪問還是不 成功,則進(jìn)行相應(yīng)錯(cuò)誤處理
前臺(tái)程序2的參考代碼
void ISR2Xxx(void) unsigned int loop—count = MaxLoopCycles;
StartDeviceO; 〃①啟動(dòng)設(shè)備
while(DCFlag == 0 && loop—count != 0) 〃②查詢?cè)O(shè)備操作完成標(biāo)志 DCFlag時(shí)
{ 〃同時(shí)檢測(cè)超時(shí)計(jì)數(shù)值loop一count
loop—count—;
14if (loop—count == 0)〃③如果訪問超時(shí),則進(jìn)行超時(shí)錯(cuò)誤處理并退出重
試循環(huán)
本具體實(shí)施方式
可以避免即使在極端情況下發(fā)生死鎖的現(xiàn)象。圖2是本發(fā)
明具體實(shí)施方式
一在前后臺(tái)嵌入式系統(tǒng)中避免訪問共享設(shè)備造成死鎖的流程
圖。如圖2所示,在t。時(shí)刻,后臺(tái)程序在啟動(dòng)共享設(shè)備后查詢共享設(shè)備操作完 成標(biāo)志DCFlag是否被置1,共享設(shè)備訪問沖突標(biāo)志LootFlag是否被置1和超時(shí) 計(jì)數(shù)值loop—count是否為0 (后臺(tái)程序注釋③處)時(shí)發(fā)生了屮斷,該中斷是前 臺(tái)程序1的中斷,則前臺(tái)程序1開始執(zhí)行,此時(shí)共享設(shè)備操作完成標(biāo)志DCFlag 還未被置l,共享設(shè)備訪問沖突標(biāo)志LootFlag也為0。在t,時(shí)刻,前臺(tái)程序l 啟動(dòng)共享設(shè)備后査詢共享設(shè)備操作完成標(biāo)志DCFlag是否被置1,共享設(shè)備訪問 沖突標(biāo)志LootFlag是否被置1和超時(shí)計(jì)數(shù)值loop—count是否為0 (前臺(tái)程序1 注釋③處)時(shí)又發(fā)生了中斷,系統(tǒng)允許中斷嵌套,并且該中斷是前臺(tái)程序2的 中斷,則前臺(tái)程序2將開始執(zhí)行,此時(shí)共享設(shè)備操作完成標(biāo)志DCFlag也還未被 置l,共享設(shè)備訪問沖突標(biāo)志LootFlag還是為0。之后前臺(tái)程序2啟動(dòng)共享設(shè) 備并順利執(zhí)行,在成功査詢到設(shè)備操作完成標(biāo)志DCFlag被置1后將其清0 (前 臺(tái)程序2注釋④處),并將共享設(shè)備訪問沖突標(biāo)志LootFlag置1 (前臺(tái)程序2注
DCFlag = 0;〃④設(shè)備操作完成標(biāo)志置0
LootFlag 二 1;〃⑤訪問標(biāo)志置1釋⑤處),然后在t,時(shí)刻返回到前臺(tái)程序1被中斷的地方(前臺(tái)程序1注釋③處),
如果此時(shí)共享設(shè)備訪問沖突標(biāo)志LootFlag沒有被置1的話,那么由于共享設(shè)備 操作完成標(biāo)志DCFlag已經(jīng)在前臺(tái)程序2里面被清0,前臺(tái)程序1將永遠(yuǎn)不會(huì)檢 測(cè)到共享設(shè)備操作完成標(biāo)志DCFlag被置1,從而造成死鎖。但是由于使用了本 發(fā)明的方法,前臺(tái)程序1檢測(cè)到共享設(shè)備訪問沖突標(biāo)志LootFlag被置1,那么 前臺(tái)程序1將退出查詢循環(huán),并執(zhí)行重試操作。假設(shè)在重試操作中沒有被前臺(tái) 程序2中斷,那么前臺(tái)程序1將順利執(zhí)行,在執(zhí)行完畢后將共享設(shè)備操作完成 標(biāo)志DCFlag清0 (前臺(tái)程序1注釋④處),并將共享設(shè)備訪問沖突標(biāo)志LootFlag 置l (前臺(tái)程序1注釋⑧處),然后在t3時(shí)刻返回至后臺(tái)程序。同樣的,如果后 臺(tái)程序沒有檢測(cè)共享設(shè)備訪問沖突標(biāo)志LootFlag,就會(huì)造成死鎖。但是由于使 用了本發(fā)明的方法,后臺(tái)程序檢測(cè)到共享設(shè)備訪問沖突標(biāo)志LootFlag被置1, 那么后臺(tái)程序?qū)⑼顺霾樵冄h(huán),并執(zhí)行重試操作。假設(shè)在后臺(tái)程序重試操作中 沒有發(fā)生中斷,那么后臺(tái)程序?qū)?huì)順利執(zhí)行,在成功査詢到共享設(shè)備操作完成 標(biāo)志DCFlag被置1后將其清0,并將共享設(shè)備訪問沖突標(biāo)志清0,然后再執(zhí)行
其它操作,這樣就避免了死鎖的發(fā)生。
需要特別說明的是,超時(shí)計(jì)數(shù)值要根據(jù)具體情況設(shè)定,保證設(shè)備在正常完 成操作的情況下,超時(shí)計(jì)數(shù)值不會(huì)減至0。另外,由于共享設(shè)備訪問沖突標(biāo)志 LootFlag是一個(gè)全局變量,屬于軟件共享資源,如果系統(tǒng)不能保證對(duì)該標(biāo)志的 訪問能在一條指令中執(zhí)行完畢,那么需要使用額外的方法來訪問該全局變量, 比如使用互斥信號(hào)量等方法。
下面描述一種具有操作系統(tǒng)的嵌入式系統(tǒng)中解決死鎖問題的具體實(shí)施方 式。在有操作系統(tǒng)的嵌入式系統(tǒng)中,任務(wù)可能被新調(diào)度的任務(wù)打斷,所以任務(wù) 既屬于可能失去共享設(shè)備控制權(quán)的代碼(即所述避免訪問共享設(shè)備造成死鎖的 流程歩驟中的低優(yōu)先級(jí)任務(wù))又屬于具有搶占共享設(shè)備控制權(quán)能力的代碼(即 所述避免訪問共享設(shè)備造成死鎖的流程步驟中的高優(yōu)先級(jí)任務(wù)),在任務(wù)查詢共享設(shè)備操作完成標(biāo)志是否被置1時(shí),需要檢測(cè)共享設(shè)備訪問沖突標(biāo)志,并在任 務(wù)訪問完共享設(shè)備后需要將共享設(shè)備訪問沖突標(biāo)志置1。
在有操作系統(tǒng)的嵌入式系統(tǒng)中,中斷服務(wù)例程(此處的中斷服務(wù)例程是特 定系統(tǒng)中的中斷服務(wù)例程,同所述避免訪問共享設(shè)備造成死鎖的流程步驟中的 中斷服務(wù)例程有所區(qū)別)同前后臺(tái)嵌入式系統(tǒng)中的前臺(tái)程序,需要在訪問完共 享設(shè)備后將共享設(shè)備訪問沖突標(biāo)志置i,并根據(jù)是否有嵌套的中斷訪問共享設(shè)備 來確定是否需要在査詢共享設(shè)備操作完成標(biāo)志是否被置i的同時(shí)檢測(cè)共享設(shè)備
訪問沖突標(biāo)志o
本具體實(shí)施方式
考慮一種廣泛的情況,在有操作系統(tǒng)的嵌入式系統(tǒng)中,兩
個(gè)任務(wù)同-個(gè)中斷服務(wù)例程共享一個(gè)設(shè)備,圖3是本發(fā)明具體實(shí)施方式
二在有 操作系統(tǒng)的嵌入式系統(tǒng)中避免訪問共享設(shè)備造成死鎖的流程圖。如圖3所示, 任務(wù)1和任務(wù)2既屬于可能失去共享設(shè)備控制權(quán)的代碼又屬于具有搶占共享設(shè) 備控制權(quán)能力的代碼,中斷服務(wù)例程屬于具有搶占共享設(shè)備控制權(quán)能力的代碼。 那么任務(wù)1和任務(wù)2就和上述前臺(tái)程序1的形式相同,而中斷服務(wù)例程就和上 述前臺(tái)程序2的形式相同。此處就不再給出示例代碼了。在發(fā)生訪問沖突時(shí), 其處理流程和上述處理流程基本相似,唯一不同的是在中斷服務(wù)例程執(zhí)行完畢 后,任務(wù)-1可能先于任務(wù)2執(zhí)行,此時(shí)由于共享設(shè)備訪問沖突標(biāo)志LootFlag被 置1,所以任務(wù)1不會(huì)死鎖,之后任務(wù)2也會(huì)因?yàn)楣蚕碓O(shè)備訪問沖突標(biāo)志LootFlag 被置1而不會(huì)死鎖。
顯然,本領(lǐng)域的技術(shù)人員可以對(duì)本發(fā)明進(jìn)行各種改動(dòng)和變型而不脫離本發(fā) 明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及 其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動(dòng)和變型在內(nèi)。
1權(quán)利要求
1. 一種避免主機(jī)在訪問共享設(shè)備造成異常死鎖的方法,適用于嵌入式系統(tǒng),其特征在于,包括以下步驟A、為所述共享設(shè)備設(shè)置一個(gè)訪問沖突標(biāo)志;B、一個(gè)低優(yōu)先級(jí)任務(wù)啟動(dòng)所述共享設(shè)備;C、所述低優(yōu)先級(jí)任務(wù)查詢所述共享設(shè)備操作完成標(biāo)志是否被置1,如果所述共享設(shè)備操作完成標(biāo)志被置1,則轉(zhuǎn)至步驟D,否則轉(zhuǎn)至步驟E;D、所述低優(yōu)先級(jí)任務(wù)完成對(duì)所述共享設(shè)備訪問,將所述共享設(shè)備操作完成標(biāo)志清0;E、所述低優(yōu)先級(jí)任務(wù)查詢所述共享設(shè)備訪問沖突標(biāo)志是否被置1,如果所述共享設(shè)備訪問沖突標(biāo)志被置1,則將其清0并轉(zhuǎn)至步驟B,重試訪問所述共享設(shè)備,否則轉(zhuǎn)至步驟C;F、當(dāng)所述低優(yōu)先級(jí)任務(wù)在執(zhí)行步驟B、步驟C或者步驟E時(shí),中斷服務(wù)例程或高優(yōu)先級(jí)任務(wù)打斷了所述低優(yōu)先級(jí)任務(wù)的執(zhí)行并訪問所述共享設(shè)備,則在所述中斷服務(wù)例程或高優(yōu)先級(jí)任務(wù)中啟動(dòng)共享設(shè)備,并轉(zhuǎn)至步驟G;G、所述中斷服務(wù)例程或高優(yōu)先級(jí)任務(wù)查詢所述共享設(shè)備操作完成標(biāo)志是否被置1,如果所述共享設(shè)備操作完成標(biāo)志被置1,則轉(zhuǎn)至步驟H,否則重新執(zhí)行步驟G;H、所述中斷服務(wù)例程或高優(yōu)先級(jí)任務(wù)將所述共享設(shè)備操作完成標(biāo)志清0,共享設(shè)備訪問沖突標(biāo)志置1,并中斷返回或任務(wù)重新調(diào)度,所述低優(yōu)先級(jí)任務(wù)繼續(xù)執(zhí)行步驟B、步驟C或者步驟E。
2. 根據(jù)權(quán)利要求1所述的方法,其特征在于,在訪問共享設(shè)備的任務(wù)或中 斷服務(wù)例程中設(shè)置超時(shí)計(jì)數(shù)值,當(dāng)所述任務(wù)或屮斷服務(wù)例程查詢所述共享設(shè)備 操作完成標(biāo)志的次數(shù)超過所述超時(shí)計(jì)數(shù)值時(shí),則退出査詢循環(huán),進(jìn)行超時(shí)錯(cuò)誤 處理。
3. 根據(jù)權(quán)利要求1所述的方法,其特征在于,在訪問共享設(shè)備的低優(yōu)先級(jí)任務(wù)中設(shè)置重試次數(shù)值,當(dāng)所述低優(yōu)先級(jí)任務(wù)訪問所述共享設(shè)備的次數(shù)超過所 述重試次數(shù)值時(shí),進(jìn)行訪問沖突錯(cuò)誤處理。
4. 根據(jù)權(quán)利要求1至3中任一項(xiàng)權(quán)利要求所述的方法,其特征在于,所述 共享設(shè)備是具有硬件標(biāo)志反映操作已經(jīng)完成的外圍設(shè)備,包括嵌入式系統(tǒng)中的 定時(shí)器、串口控制器、IIC總線控制器、SPI總線控制器、USB總線控制器、P麗控制器、比較器、模數(shù)轉(zhuǎn)換器、數(shù)模轉(zhuǎn)換器。
5. 根據(jù)權(quán)利要求1至3中任一項(xiàng)權(quán)利要求所述的方法,其特征在于,所述 嵌入式系統(tǒng)是前后臺(tái)嵌入式系統(tǒng),或者是具有操作系統(tǒng)的嵌入式系統(tǒng)。
全文摘要
本發(fā)明公開了一種避免主機(jī)在訪問共享設(shè)備造成異常死鎖的方法,主機(jī)為共享設(shè)備設(shè)置訪問沖突標(biāo)志,當(dāng)?shù)蛢?yōu)先級(jí)任務(wù)訪問共享設(shè)備,并循環(huán)查詢共享設(shè)備操作完成標(biāo)志是否被置1時(shí),中斷服務(wù)例程或高優(yōu)先級(jí)任務(wù)打斷低優(yōu)先級(jí)任務(wù)并訪問共享設(shè)備,在查詢到共享設(shè)備操作完成標(biāo)志被置1后,將其清0,并將訪問沖突標(biāo)志置1,隨著中斷返回或任務(wù)重新調(diào)度,低優(yōu)先級(jí)任務(wù)繼續(xù)執(zhí)行,會(huì)檢測(cè)到共享設(shè)備操作完成標(biāo)志為0,但訪問沖突標(biāo)志為1,則退出循環(huán)查詢(否則該任務(wù)進(jìn)入死循環(huán),造成死鎖),重試訪問共享設(shè)備。采用本發(fā)明的技術(shù)方案,可以避免上述死鎖情況的發(fā)生,因方法簡(jiǎn)單可靠,特別適用于處理器性能不高,存儲(chǔ)器資源緊張的嵌入式系統(tǒng)領(lǐng)域。
文檔編號(hào)G06F9/46GK101499041SQ20091005862
公開日2009年8月5日 申請(qǐng)日期2009年3月17日 優(yōu)先權(quán)日2009年3月17日
發(fā)明者姜先剛, 蔣小青, 淵 鄒 申請(qǐng)人:成都優(yōu)博創(chuàng)技術(shù)有限公司