任務(wù)的定義
在嵌入式開發(fā)中,面對的都是單個(gè) CPU 的情況,而在這個(gè)開發(fā)過程中,我們會涉及到裸機(jī)開發(fā)或者是跑操作系統(tǒng)的開發(fā),在裸機(jī)開發(fā)的過程中,整個(gè)系統(tǒng)是以模塊的角度來看的,也就是系統(tǒng)在運(yùn)行完了這個(gè)模塊之后,再去運(yùn)行另外一個(gè)模塊。但是在有操作系統(tǒng)的情況下,我們是把系統(tǒng)處理的一件一件事情以任務(wù)的角度來進(jìn)行劃分的,這任務(wù)與任務(wù)之間是并發(fā)執(zhí)行的。每個(gè)任務(wù)的運(yùn)行看起來是獨(dú)立的,從宏觀的角度看是多個(gè)任務(wù)同時(shí)在占據(jù)著 CPU 的執(zhí)行,就像是多 CPU 一樣,在真正的多 CPU 系統(tǒng)中,每個(gè) CPU 都有一套自己的寄存器,而為了實(shí)現(xiàn)這樣一種多 CPU 運(yùn)行的機(jī)制,那么操作系統(tǒng)就為每個(gè)任務(wù)用一塊專用的存儲空間構(gòu)建了一個(gè)“虛擬 CPU”,用來保存 CPU 內(nèi)存各個(gè)寄存器的信息,這塊專用的存儲器空間就是“任務(wù)堆棧”,有多少個(gè)任務(wù)就會有多少個(gè)任務(wù)堆棧。
操作系統(tǒng)為了能夠有效地在各個(gè)任務(wù)之間進(jìn)行切換,也就是任務(wù)之間的調(diào)度,那么就必須掌握各個(gè)任務(wù)的詳細(xì)動(dòng)態(tài)信息。為此,操作系統(tǒng)為每個(gè)任務(wù)建立了檔案,用來記錄任務(wù)的這些信息,這就是“任務(wù)控制塊”。另外任務(wù)有各自的內(nèi)容,這就是作為開發(fā)者來編寫的任務(wù)函數(shù),來實(shí)現(xiàn)這個(gè)任務(wù)所需要的功能。
綜上,我們知道了每個(gè)任務(wù)都會具有如下三種特征:
任務(wù)函數(shù)
任務(wù)堆棧
任務(wù)控制塊
任務(wù)的特性
任務(wù)的基本特性是獨(dú)立性、并發(fā)性和動(dòng)態(tài)性。這也是任務(wù)和程序模塊的本質(zhì)區(qū)別,程序模塊通常是用于沒有操作系統(tǒng)的裸機(jī)開發(fā)中。
獨(dú)立性:
在傳統(tǒng)的程序模塊中,一個(gè)模塊是可以調(diào)用另外一個(gè)模塊的,但是在操作系統(tǒng)中,每個(gè)任務(wù)都具有自己的 CPU ,即 CPU 為自己獨(dú)占,這樣,一個(gè)任務(wù)也就不能夠像調(diào)用子程序那樣去調(diào)用另外一個(gè)任務(wù)了。這是關(guān)于獨(dú)立性一個(gè)體現(xiàn)
關(guān)于獨(dú)立性的另一個(gè)體現(xiàn)就是任務(wù)之間傳遞信息時(shí),模塊之間的傳遞信息時(shí)主模塊以實(shí)參的形式將信息傳遞給模塊的形參,子模塊以返回值的形式將結(jié)果傳輸給主模塊。但是在任務(wù)之間傳遞信息卻不是這樣的,任務(wù)與任務(wù)之間的傳遞信息需要借助于第三者,也就是跟操作系統(tǒng)相關(guān)聯(lián)的信號量、郵箱和消息隊(duì)列等,通過第三者來傳遞信息也就造成了信息傳輸是異步的,這也是任務(wù)獨(dú)立性的一個(gè)體現(xiàn)。
并發(fā)性
任務(wù) A 在時(shí)刻 t1 到 t4 之間完成,任務(wù) B 在時(shí)刻 t2 到 t3 之間完成,它們的運(yùn)行時(shí)間段有重疊部分,這種運(yùn)行方式稱為“并發(fā)”運(yùn)行。在多 CPU 系統(tǒng)中,并發(fā)運(yùn)行著的任務(wù)確實(shí)都有自己的 CPU ,它們的運(yùn)行狀態(tài)就是真正的并發(fā)執(zhí)行,如下圖所示:
任務(wù)并發(fā)執(zhí)行
在單 CPU 中,操作系統(tǒng)的任務(wù)調(diào)度功能解決了這樣一個(gè)問題,嵌入式實(shí)時(shí)操作系統(tǒng)的內(nèi)核都是采用 “可剝奪型”的任務(wù)調(diào)度算法,這也就意味著一個(gè)已經(jīng)就緒的高優(yōu)先級任務(wù)可以剝奪另一個(gè)正在運(yùn)行的低優(yōu)先級任務(wù)的運(yùn)行權(quán)而進(jìn)入運(yùn)行狀態(tài),如下圖所示:
單 CPU 任務(wù)并發(fā)執(zhí)行
動(dòng)態(tài)性
任務(wù)的狀態(tài)是動(dòng)態(tài)變換的,這意味著這些任務(wù)并不是隨時(shí)都可以運(yùn)行的,任務(wù)具有以下五種不同的狀態(tài)下圖用狀態(tài)圖的形式表示出來。
任務(wù)狀態(tài)圖
任務(wù)的劃分
對一個(gè)具體的嵌入式應(yīng)用系統(tǒng)進(jìn)行任務(wù)劃分,是基于實(shí)時(shí)操作系統(tǒng)應(yīng)用軟件設(shè)計(jì)的關(guān)鍵,任務(wù)劃分是否合理將直接影響到軟件設(shè)計(jì)的質(zhì)量。當(dāng)任務(wù)劃分的合理時(shí),軟件設(shè)計(jì)將比較簡單高效,否則將可能比較繁雜,甚至失敗。在進(jìn)行任務(wù)劃分時(shí),具備以下幾個(gè)原則:
首要目標(biāo)是滿足實(shí)時(shí)性指標(biāo)
即使是系統(tǒng)處于最壞的情況下,系統(tǒng)中對于實(shí)時(shí)性要求的功能都能夠得到實(shí)現(xiàn)。
任務(wù)數(shù)目合理
任務(wù)數(shù)目合理,當(dāng)任務(wù)數(shù)比較多的時(shí)候,每個(gè)任務(wù)需要實(shí)現(xiàn)的功能就簡單一些,任務(wù)的設(shè)計(jì)也簡單一些,但是任務(wù)調(diào)度操作和任務(wù)之間的通信活動(dòng)增加,使得系統(tǒng)的效率下降,資源開銷也變大。當(dāng)任務(wù)劃分的數(shù)目比較少的時(shí)候,每個(gè)任務(wù)需要實(shí)現(xiàn)的功能就比較復(fù)雜一些,但是可以免除不少任務(wù)之間的通信工作,減少共享資源的數(shù)量,減輕系統(tǒng)的負(fù)擔(dān),減少資源的開銷。因此關(guān)于任務(wù)數(shù)目的設(shè)計(jì)是比較關(guān)鍵的。
簡化軟件系統(tǒng)
一個(gè)系統(tǒng)要實(shí)現(xiàn)功能,除了設(shè)計(jì)其本身的功能以外,還需要其具備相應(yīng)的時(shí)間管理,任務(wù)同步,任務(wù)通信,內(nèi)存管理等功能。合理地劃分任務(wù),可以降低對操作系統(tǒng)的服務(wù)要求,能夠簡化系統(tǒng)軟件設(shè)計(jì),減小軟件代碼規(guī)模。
降低資源需求
減少或者簡化任務(wù)之間的同步和通信功能,就可以減少相應(yīng)數(shù)據(jù)結(jié)構(gòu)的內(nèi)存模型,從而降低對系統(tǒng)資源的需求。
因此,為了使得任務(wù)劃分更加合理,通常采用以下幾種方法進(jìn)行任務(wù)劃分:
設(shè)備依賴性任務(wù)劃分
假設(shè)現(xiàn)在有如下一個(gè)具備輸入輸出功能的系統(tǒng):
輸入輸出系統(tǒng)
通過上述框圖大致可以明白整個(gè)系統(tǒng)的工作流程,通過鍵盤輸入數(shù)據(jù),以及攝像頭采集圖片信息,送至 CPU 進(jìn)行處理,然后系統(tǒng)通過輸出設(shè)備液晶屏以及揚(yáng)聲器輸出相關(guān)的信息,圍繞 CPU 為中心,那么我們就可以這樣來進(jìn)行劃分任務(wù):鍵盤任務(wù),顯示任務(wù),數(shù)據(jù)采集任務(wù),控制輸出任務(wù)和通信任務(wù)。
關(guān)鍵任務(wù)的劃分
"關(guān)鍵性"是指某種功能在應(yīng)用系統(tǒng)中的重要性,如果這種功能不能夠正常實(shí)現(xiàn),則會造成重大影響,甚至能夠引發(fā)災(zāi)難性后果。包含關(guān)鍵功能的任務(wù)稱為“關(guān)鍵任務(wù)”,關(guān)鍵任務(wù)必須得到運(yùn)行機(jī)會,即使遺漏一次也是不可行的。
那如何使得關(guān)鍵任務(wù)能夠準(zhǔn)確得到執(zhí)行呢,我們第一時(shí)間所想到的就是提升關(guān)鍵任務(wù)的優(yōu)先級,使其優(yōu)先級為最高,但是這還不夠,我們假設(shè)現(xiàn)在有一個(gè)火災(zāi)報(bào)警系統(tǒng),火災(zāi)報(bào)警系統(tǒng)大致完成這么幾件事,檢測火警信號,撥打火警電話,啟動(dòng)噴淋滅火系統(tǒng),生成并保存火警記錄以及打印火警記錄。如果我們把這幾件事都包裝成一個(gè)任務(wù),優(yōu)先級設(shè)置為最高,在系統(tǒng)運(yùn)行的過程當(dāng)中,生成并保存火警記錄以及打印火警記錄時(shí)打印機(jī)出問題了,這個(gè)時(shí)候,就會導(dǎo)致當(dāng)前任務(wù)被掛起,而任務(wù)被掛起之后,檢測火警信號也不能夠正常工作了,所以整個(gè)系統(tǒng)也就癱瘓了。因此,對于關(guān)鍵功能來說:必須盡可能和其他功能進(jìn)行剝離,獨(dú)立成為一個(gè)任務(wù),然后通過通信方式再觸發(fā)其他任務(wù),完成后續(xù)操作。
除了將關(guān)鍵任務(wù)和其他功能的任務(wù)相剝離,并設(shè)置最高優(yōu)先級以外,還有一種方法能夠使得關(guān)鍵任務(wù)得到準(zhǔn)確執(zhí)行,那就是采用中斷的方式,比如說,在火警的報(bào)警系統(tǒng)中,讓傳感器的火警信號觸發(fā)一個(gè)外部中斷,中斷發(fā)生便完成了信號檢測功能,再由中斷服務(wù)函數(shù)使用某種通信機(jī)制通知其他任務(wù)。下面是示意圖:
火災(zāi)系統(tǒng)
我們知道為了提高系統(tǒng)的實(shí)時(shí)性,中斷服務(wù)函數(shù)應(yīng)該盡可能地短,所以,我們可以進(jìn)一步進(jìn)行劃分,將與任務(wù)通信這部分的程序剝離出來成為一個(gè)任務(wù)專門用于通信,這樣, ISR 負(fù)擔(dān)就更小了,下圖是示意圖:
用 ISR 完成關(guān)鍵功能
由上圖我們可以知道多出了一個(gè)任務(wù),消息分發(fā)任務(wù),消息任務(wù)的存在要不能干預(yù)到關(guān)鍵任務(wù)的運(yùn)行,但是同時(shí)呢,又必須能夠及時(shí)地通知到其他任務(wù)的運(yùn)行,因此,消息分發(fā)任務(wù)的優(yōu)先級也就確定了,其優(yōu)先級要低于所有關(guān)鍵任務(wù),優(yōu)先級要高于所有的操作任務(wù)。
還有一種情況,就是關(guān)鍵任務(wù)不能由中斷啟動(dòng),則可以將該關(guān)鍵功能用一個(gè)獨(dú)立的任務(wù)來實(shí)現(xiàn),如下圖所示:
關(guān)鍵任務(wù)完成關(guān)鍵功能
這個(gè)時(shí)候,已經(jīng)不能用中斷的方式來檢測報(bào)警信號了,那么就需要不停的查詢煙霧報(bào)警器的狀態(tài),防止漏掉了重要的信息。當(dāng)查詢到了報(bào)警信息的時(shí)候,在通過通信機(jī)制通知其他任務(wù)完成相應(yīng)的操作。
最后,要指出的一點(diǎn)是,如果關(guān)鍵任務(wù)有嚴(yán)格的實(shí)時(shí)性要求,那么必須賦予它足夠高的優(yōu)先級,以便及時(shí)獲得運(yùn)行權(quán),如果沒有實(shí)時(shí)性要求,那么高優(yōu)先級并不是必須的,關(guān)鍵是將其他非關(guān)鍵的操作進(jìn)行剝離,以免受其拖累。
緊迫任務(wù)的劃分
”緊迫性“是指某種功能必須在規(guī)定的時(shí)間內(nèi)得到運(yùn)行權(quán)(及時(shí)運(yùn)行),并在規(guī)定的時(shí)刻前執(zhí)行完畢(按時(shí)完成),可見這類功能有嚴(yán)格的實(shí)時(shí)性要求,大多數(shù)緊迫任務(wù)是由異步事件觸發(fā)的,這些異步事件一般能夠引發(fā)某種中斷。在這種情況下,將緊迫任務(wù)安排在相應(yīng)的 ISR 中是最有效的方法。如果緊迫任務(wù)不能夠安排在 ISR 中,那么為它安排盡可能高的優(yōu)先級是解決“及時(shí)性”的有效方法。要達(dá)到按時(shí)完成的目的,必須使得緊迫任務(wù)需要執(zhí)行的時(shí)間盡可能的短。辦法就是對緊迫任務(wù)進(jìn)行瘦身,盡可能地剝離不太緊迫的任務(wù),只剩下必須立刻做的操作,將被剝離的不太緊迫的操作另外封裝成一個(gè)任務(wù)。
下圖是一個(gè)數(shù)據(jù)采集任務(wù),數(shù)據(jù)采集時(shí)一個(gè)緊迫任務(wù),通過峰值檢測電路觸發(fā)中斷,在中斷里完成 A/D 轉(zhuǎn)換,下圖是整個(gè)數(shù)據(jù)采集系統(tǒng)的示意圖:
數(shù)據(jù)采集系統(tǒng)框架
數(shù)據(jù)處理任務(wù)的劃分
用戶應(yīng)用程序中消耗時(shí)間最多的就是各種數(shù)據(jù)處理單元,這種單元通常不止一個(gè),他們通常為不同的功能服務(wù)。應(yīng)該將這些單元?jiǎng)澐殖鰜?,分別包裝成不同的任務(wù)。由于這類任務(wù)需要消耗較多的時(shí)間,那么他們的優(yōu)先級必須安排的比較低,除此之外的方法,如果操作系統(tǒng)支持將多個(gè)任務(wù)安排相同優(yōu)先級的機(jī)制,那么當(dāng)有多個(gè)數(shù)據(jù)處理任務(wù)時(shí),可安排相同的優(yōu)先級,采用時(shí)間片輪轉(zhuǎn)的方式運(yùn)行,如果操作系統(tǒng)不支持多個(gè)任務(wù)具有相同的優(yōu)先級,那么可以將多個(gè)需要并行的數(shù)據(jù)處理任務(wù)分成多個(gè)數(shù)據(jù)處理任務(wù),原理如下圖所示:
模擬時(shí)間片輪轉(zhuǎn)
功能聚合任務(wù)的劃分
正如標(biāo)題的意思所示,功能聚合任務(wù)的劃分,也就是將關(guān)系緊密的任務(wù)組合成一個(gè)任務(wù),達(dá)到功能聚合的效果,那什么樣的任務(wù)才能稱之為是關(guān)系緊密的任務(wù)呢,一般滿足以下兩點(diǎn)要求:
數(shù)據(jù)關(guān)聯(lián)緊密
時(shí)序關(guān)聯(lián)緊密
至于要將其組合成一個(gè)任務(wù)的原因也很簡單,是因?yàn)槿绻麑㈥P(guān)系密切的功能分別用不同的任務(wù)來實(shí)現(xiàn),那么就需要進(jìn)行大量的數(shù)據(jù)通信和同步通信,這對于系統(tǒng)而言是一個(gè)很大的負(fù)擔(dān)。
觸發(fā)條件相同任務(wù)的劃分
如果若干功能由相同的事件觸發(fā),則可以將這些功能組合成為一個(gè)任務(wù),從而免除將事件分發(fā)給多個(gè)任務(wù)的工作量。但是這也必須有一個(gè)條件,就是當(dāng)以某種次序順序執(zhí)行這些功能的時(shí)候,各個(gè)功能的實(shí)時(shí)性要求仍然可以得到滿足,這是關(guān)鍵。同時(shí),這里說的觸發(fā)條件相同的任務(wù),通常外部觸發(fā)的任務(wù)一般是關(guān)鍵任務(wù)或者緊迫任務(wù),需要按照前文所述的方法來進(jìn)行任務(wù)的劃分,符合本類任務(wù)的觸發(fā)條件通常是內(nèi)部事件,比如說一個(gè)時(shí)鐘事件,也就是說到了指定時(shí)間就觸發(fā)這個(gè)任務(wù),或者說是某個(gè)任務(wù)運(yùn)行之后得到一個(gè)結(jié)論,這結(jié)論又觸發(fā)了一個(gè)任務(wù)。如下圖示意圖所示:
觸發(fā)條件相同的任務(wù)
另外,需要注意的是,在任務(wù)內(nèi)部,各個(gè)功能的執(zhí)行順序要盡可能安排的合理一些:
如果各個(gè)功能之間存在有因果關(guān)系。則按因果關(guān)系安排執(zhí)行順序,如先計(jì)算,后輸出結(jié)果
如果各個(gè)功能之間完全獨(dú)立,則按照實(shí)時(shí)性要求的強(qiáng)弱安排執(zhí)行順序。
運(yùn)行周期相同任務(wù)的劃分
將周期相同的功能組合在一起封裝成一個(gè)任務(wù),就能可以避免一個(gè)時(shí)間觸發(fā)幾個(gè)任務(wù),省略去事件分發(fā)操作和他們之間的通信,能夠減輕系統(tǒng)的負(fù)擔(dān)。
順序操作的任務(wù)的劃分
如果若干功能按照固定的順序進(jìn)行流水作業(yè),相互之間完全沒有并發(fā)性,那么應(yīng)該將這些功能組合成為一個(gè)任務(wù)。
總結(jié)
通過上述的論述,我們知道了在一個(gè) RTOS 中應(yīng)該如何進(jìn)行任務(wù)的劃分,在最后,再進(jìn)行精煉一下,總結(jié)為如下幾點(diǎn):
以 CPU 為中心,將與各種輸入/輸出相關(guān)的功能劃分為獨(dú)立的任務(wù)
將關(guān)鍵功能剝離出來用一個(gè)獨(dú)立的任務(wù)或者是 ISR 去完成,剩余的部分用另外一個(gè)任務(wù)實(shí)現(xiàn),兩者之間通過通信機(jī)制進(jìn)行溝通
將緊迫功能剝離出來用一個(gè)高優(yōu)先級的任務(wù)或者 ISR 去完成,剩余部分用另外一個(gè)任務(wù)實(shí)現(xiàn),兩者之間通過通信機(jī)制進(jìn)行溝通
對于既關(guān)鍵又緊迫的功能,按照緊迫功能的處理方法對齊進(jìn)行處理
將消耗 CPU 時(shí)間較多的數(shù)據(jù)處理功能劃分出來,封裝成低優(yōu)先級的任務(wù)
將關(guān)系密切的若干任務(wù)組合成一個(gè)任務(wù),達(dá)到功能聚合的效果
將由相同事件觸發(fā)的若干功能組合成為一個(gè)任務(wù),從而免除事件分發(fā)機(jī)制
將運(yùn)行周期相同的任務(wù)組合成為一個(gè)任務(wù),從而免除時(shí)間事件分發(fā)機(jī)制
將若干按固定順序執(zhí)行的功能組合成為一個(gè)功能,從而免除同步接力通信的麻煩
-
cpu
+關(guān)注
關(guān)注
68文章
10863瀏覽量
211797 -
RTOS
+關(guān)注
關(guān)注
22文章
813瀏覽量
119649
原文標(biāo)題:RTOS 是如何進(jìn)行任務(wù)劃分的?
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論