期刊VIP學術(shù)指導 符合學術(shù)規(guī)范和道德
保障品質(zhì) 保證專業(yè),沒有后顧之憂
來源:期刊VIP網(wǎng)所屬分類:光電技術(shù)時間:瀏覽:次
摘要:多任務(wù)系統(tǒng)中當一個共享地址空間簡單地用于數(shù)據(jù)交換時,為避免競爭,需要對內(nèi)存的訪問上鎖,以保證訪問互斥進行。實現(xiàn)資源互斥訪問的方法很多,不同之處僅在于互斥的范圍和程度。這些方法包括禁止中斷,禁止搶占和使用信號量等對資源上鎖。
關(guān)鍵詞:多任務(wù),任務(wù)優(yōu)先級,搶占,調(diào)度時機,調(diào)度器
1 引言
互斥機制最強有力的方法是禁止中斷,這種上鎖保證了對CPU的獨占訪問。在互斥期間,即使外部事件產(chǎn)生而引發(fā)相應(yīng)的中斷,系統(tǒng)也不會切換到相應(yīng)的中斷服務(wù)程序(ISR),也能保證任務(wù)之間的互斥。因此在上鎖期間,它可能造成系統(tǒng)對外部事件反應(yīng)遲鈍。這對于大多數(shù)實時系統(tǒng)而言,系統(tǒng)的實時性也就得不到保證,因而不適合作為一種通用的互斥方法。然而當涉及到任務(wù)和中斷服務(wù)程序共享數(shù)據(jù)時,中斷上鎖又是唯一的方法。但是在任何情況下,應(yīng)該使中斷上鎖時間盡量短,這也是所有實時系統(tǒng)的基本要求。
從本質(zhì)上講,信號量機制比禁止中斷或禁止搶占提供更精確的互斥粒度,但是在使用時需要注意優(yōu)先級繼承,刪除安全性和遞歸使用等問題,并且當一個任務(wù)需要同時獲取多個信號量時更要注意避免系統(tǒng)的死鎖問題。因此,一般實時嵌入式操作系統(tǒng)都會為用戶提供多種互斥手段,以適應(yīng)不同的使用場合。但對于禁止搶占(禁止調(diào)度)這種方法而言,有些系統(tǒng)支持,如UC/OS--II,VxWorks等,而有些系統(tǒng)未必支持,如PSOS等,為了達到禁止搶占這種效果,并且不受具體系統(tǒng)的約束,本文提出了一種新的禁止搶占方法——最高優(yōu)先級法。
2 禁止搶占的基本原理
如果任務(wù)不與中斷服務(wù)子程序共享變量或數(shù)據(jù)結(jié)構(gòu),可以使用先禁止然后允許任務(wù)切換的手段。此時雖然任務(wù)切換禁止了,但中斷還是開著的。如果這時中斷來了,中斷服務(wù)子程序會在這一臨界區(qū)內(nèi)立即執(zhí)行。中斷服務(wù)子程序結(jié)束時,即使有更高優(yōu)先級的任務(wù)已經(jīng)進入就緒態(tài),內(nèi)核還是返回到原先被中斷了的任務(wù),直到執(zhí)行完給任務(wù)切換開鎖函數(shù),內(nèi)核再看看有沒有優(yōu)先級更高的任務(wù)被中斷服務(wù)子程序激活而進入就緒態(tài),如果有則做任務(wù)切換。此種機制比中斷上鎖要弱一些。
3 最高優(yōu)先級法
3.1最高優(yōu)先級法的基本原理
在實時嵌入式系統(tǒng)中,各個應(yīng)用任務(wù)依據(jù)實時性.重要性被賦予了不同的優(yōu)先級,內(nèi)核嚴格按照優(yōu)先級的高低來調(diào)度任務(wù),高優(yōu)先級的任務(wù)能搶占低優(yōu)先級的任務(wù)以滿足實時性的要求。另外,實時嵌入式操作系統(tǒng)一般都提供了動態(tài)更改任務(wù)優(yōu)先級的系統(tǒng)調(diào)用。我們可以將系統(tǒng)中的最高優(yōu)先級(HiPriority)預(yù)留下來,當某任務(wù)需要禁止搶占時,將該任務(wù)的優(yōu)先級提升到最高優(yōu)先級(PriorityProtect),在該任務(wù)將其自身的優(yōu)先級設(shè)回原優(yōu)先級(UnPriorityProtect)之前,系統(tǒng)中的其它任務(wù)不會搶占該任務(wù),該任務(wù)可以放心地完成臨界區(qū)的操作。使用這種方法也可以選擇基于優(yōu)先級的時間片輪轉(zhuǎn)調(diào)度。輪轉(zhuǎn)調(diào)度可以使優(yōu)先級相同處于就緒態(tài)的任務(wù)公平地分享使用CPU。按照優(yōu)先級調(diào)度的原理,考察我們的最高優(yōu)先級法:當任務(wù)處于最高優(yōu)先級時即使時間片到期任務(wù)也不會切換出去,因為就緒隊列里優(yōu)先級最高(為HiPriority)的任務(wù)只有一個,不管它是否用完時間片,其它低優(yōu)先級的任務(wù)都無法搶占它。
3.2最高優(yōu)先級法的普通實現(xiàn)
我們先來分析下面的一種在實際開發(fā)工作中會遇到的情況,任務(wù)A中有一段臨界區(qū)代碼,并且假設(shè)該臨界區(qū)代碼不包含因等待資源而不得不讓出CPU的可能:
PriorityProtect();
……//代碼1
Func();//函數(shù)調(diào)用
……//代碼2
UnPriorityProtect();
而函數(shù)Func()如下定義:
Func()
{
……//代碼3
PriorityProtect();
……//代碼4
UnPriorityProtect();
……//代碼5
}
當Func()執(zhí)行完時,任務(wù)A的優(yōu)先級被設(shè)回了原先的優(yōu)先級,代碼2將受不到保護!因此,我們需要對函數(shù)PriorityProtect()和UnPriorityProtect()進行改造:函數(shù)PriorityProtect()需返回設(shè)置最高優(yōu)先級之前任務(wù)的優(yōu)先級,而函數(shù)UnPriorityProtect()卻不一定總是設(shè)置任務(wù)原先的優(yōu)先級,它設(shè)置的是與之配對的PriorityProtect()返回的優(yōu)先級。這兩個函數(shù)都是成對使用的,不管嵌套使用了多少次都不會出錯,舉例如下:
OldPriority=PriorityProtect();
……//代碼1
Func();//函數(shù)調(diào)用
……//代碼2
UnPriorityProtect(OldPriority);
而函數(shù)Func()如下定義:
Func()
{
int OldPriority;
……//代碼3
OldPriority =PriorityProtect();
……//代碼4
UnPriorityProtect(OldPriority);
……//代碼5
}
這樣在函數(shù)Func()執(zhí)行完后任務(wù)仍處于最高優(yōu)先級狀態(tài),代碼2仍受到保護,符合程序員的意圖,程序員不必擔心會發(fā)生意外。但是這種方法的效率有點低下,執(zhí)行Func()時已經(jīng)是最高優(yōu)先級狀態(tài)了,卻還要再設(shè)置,浪費了CPU時間,在嵌套次數(shù)較多時效率問題將更加嚴重。另一方面我們不能輕易將函數(shù)Func()中的互斥手段去掉,因為這要考慮在其它沒提供互斥手段的情況下調(diào)用Func()。基于上述原因,我們引入一種高效的方法——嵌套計數(shù)法。
3.3最高優(yōu)先級法的嵌套計數(shù)實現(xiàn)
先來定義操作規(guī)則:COUNT為系統(tǒng)中的全局變量,初始化為0。
PriorityProtect()
{
if(!COUNT) ……(1)
利用具體的系統(tǒng)調(diào)用把當前任務(wù)設(shè)成最高優(yōu)先級 ……(2)
COUNT++; ……(3)
}
UnPriorityProtect()
{
COUNT--;……(4)
if(!COUNT) ……(5)
利用具體的系統(tǒng)調(diào)用把當前任務(wù)設(shè)成原先的優(yōu)先級……(6)
}
再來分析一下這種方法的安全性。COUNT是全局變量,對它的訪問要防止競爭條件。但巧妙的是一旦我們把任務(wù)用操作系統(tǒng)原語調(diào)用設(shè)成最高優(yōu)先級后,對COUNT的訪問將是獨占的;一個任務(wù)首次調(diào)用PriorityProtect()時在語句(1)處有競爭條件,但一次只能有一個任務(wù)通過(2)處的原語成為最高優(yōu)先級,只要我們正確地配對使用這兩個函數(shù),當這個任務(wù)最終退出最高優(yōu)先級狀態(tài)時COUNT必為0,并不影響其它任務(wù)在(1)處的判斷。這種方法的高效性也是明顯的,在嵌套使用的里層僅僅進行嵌套計數(shù)的計算,并不用進行優(yōu)先級的設(shè)置。
4 結(jié)論
盡管不同的實時嵌入式操作系統(tǒng)給用戶提供的系統(tǒng)調(diào)用接口不盡相同,但是它們所準遵循的基本原理都是相同的。上述關(guān)于禁止任務(wù)搶占的普通實現(xiàn)以及嵌套計數(shù)實現(xiàn)提供的都是實現(xiàn)思想,在實際應(yīng)用中很容易結(jié)合所使用的具體的操作系統(tǒng)寫出PriorityProtect()和UnPriorityProtect()的實現(xiàn)代碼。
[1] Labrosse Jean J,uc/OS-II-源碼公開的實時嵌入式操作系統(tǒng),邵貝貝譯,北京:中國電力出版社,2001.
[2] 孔祥營等,嵌入式實時操作系統(tǒng)VxWorks及其開發(fā)環(huán)境Tornado,北京:中國電力出版社,2001.