<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 利用實(shí)時(shí)內核開(kāi)發(fā)嵌入式多任務(wù)程序

利用實(shí)時(shí)內核開(kāi)發(fā)嵌入式多任務(wù)程序

作者: 時(shí)間:2004-12-10 來(lái)源:網(wǎng)絡(luò ) 收藏
摘要:系統應用日益復雜化,傳統的前臺/后臺機制已經(jīng)不能滿(mǎn)足需求,目前更多地采用搶占式系統。為多應用提供最基本和最重要的服務(wù)。本文介紹和多,并提出實(shí)時(shí)內核進(jìn)行系統時(shí),根據系統功能合理構成任務(wù)的方法。

關(guān)鍵詞:實(shí)時(shí)內核 多任務(wù) 任務(wù)構造 系統

隨著(zhù)嵌入式系統的廣泛使用,傳統的前臺/后臺開(kāi)發(fā)機制已經(jīng)不能滿(mǎn)足日益復雜和多樣化的嵌入式應用需求,因而常常采用嵌入式實(shí)時(shí)操作系統內核(簡(jiǎn)稱(chēng)實(shí)時(shí)內核)開(kāi)發(fā)實(shí)時(shí)多任務(wù)程序。嵌入式實(shí)時(shí)內核提供多任務(wù)、任務(wù)管理、時(shí)間管理、任務(wù)間通信和同步、內存管理等重要服務(wù),使嵌入式應用程序容易設計和擴展。內核是管理微處理器或者微控制器時(shí)間的軟件,確保所有時(shí)間關(guān)鍵的事件盡可能高效地得到處理;允許將系統分成多個(gè)獨立的任務(wù),每個(gè)任務(wù)處理程序的一部分,從而簡(jiǎn)化系統的設計過(guò)程。

一、非搶占式內核和搶占式內核

實(shí)時(shí)內核分為兩種:非搶占式內核和搶占式內核。這兩種內核都由中斷服務(wù)例程(ISR)處理異步事件。在非搶占式內核中,一個(gè)ISR使優(yōu)先級更高的任務(wù)就緒,并不立即將CPU控制權交給優(yōu)先級高的任務(wù),而是返回到被中斷的當前任務(wù)。只有當前任務(wù)執行某種操作明確放棄CPU時(shí),優(yōu)先級高的新任務(wù)才得到CPU控制權。非搶占式內核對實(shí)時(shí)事件的響應時(shí)間不確定,因而極少在實(shí)時(shí)應用中使用。圖1所示為非搶占式內核程序流程:①低優(yōu)先級任務(wù)(LPT)執行;②低優(yōu)先級任務(wù)被中斷;③執行中斷服務(wù)例程,使高優(yōu)先級任務(wù)(HPT)就緒;④中斷服務(wù)例程返回到被中斷的低優(yōu)先級任務(wù);⑤低優(yōu)先級任務(wù)繼續執行;⑥低優(yōu)先級任務(wù)放棄CPU;⑦高優(yōu)先級任務(wù)運行。

目前在大多數嵌入式實(shí)時(shí)多任務(wù)系統應用中,對系統實(shí)時(shí)響應要求很高,因此采用搶占式內核確保時(shí)間關(guān)鍵的任務(wù)最先執行,使優(yōu)先級最高的就緒任務(wù)總是最先得到CPU控制權。優(yōu)先級低的當前任務(wù)能夠被優(yōu)先級更高的任務(wù)搶占,暫時(shí)掛起執行,將CPU控制權交給優(yōu)先級高的任務(wù)。圖2所示為搶占式內核程序流程:①低優(yōu)先級任務(wù)執行;②異步事件使任務(wù)中斷;③響應異步事件,運行中斷服務(wù)例程,使高優(yōu)先級任務(wù)就緒;④中斷服務(wù)例程返回到高優(yōu)先級任務(wù);⑤高優(yōu)先級任務(wù)執行,直到它被中斷轉向執行優(yōu)先級更高的任務(wù);⑥高優(yōu)先級任務(wù)結束,內核切換到低優(yōu)先級任務(wù);⑦低優(yōu)先級任務(wù)繼續執行。

二、多任務(wù)

實(shí)時(shí)內核開(kāi)發(fā)嵌入式多任務(wù)系統程序,要根據明確的設計目的確認系統功能,將系統功能合理分解,構造不同的任務(wù),使每個(gè)任務(wù)負責完成應用要求的一部分功能;并根據任務(wù)相對于其他任務(wù)的重要性決定其優(yōu)先級。多個(gè)任務(wù)彼此獨立運行,具有獨立的私有堆??臻g,在被其他進(jìn)程搶占時(shí)能夠保持任務(wù)執行線(xiàn)程的上下文。

1.任務(wù)

任務(wù)是單線(xiàn)程序列指令形成的一個(gè)無(wú)限循環(huán),在系統程序中用函數表示(如下)。任務(wù)執行時(shí)要調用內核提供的服務(wù),以等待某個(gè)事件發(fā)生。事件可以是定時(shí)間,或者是另一個(gè)任務(wù)、一個(gè)中斷服務(wù)例程發(fā)出事件通知。

Void Task (void)

{

While (true) {

Run Application-specific codes;

Wait for event by calling a service provided by the kernel;

Run Application - specific codes;

}

}

2.任務(wù)管理

每個(gè)任務(wù)有5種狀態(tài);休眠、就緒、運行、等待、中斷。圖3所示為任務(wù)之間的狀態(tài)轉換。休眠狀態(tài)的任務(wù)駐留在存儲器中,還未被內核使用;就緒狀態(tài)的任務(wù)準備執行,優(yōu)先級低于當前執行的任務(wù),沒(méi)有得到CPU控制權;任務(wù)得到CPU控制權后就處于運行狀態(tài);等待事件發(fā)生的任務(wù)處于等待狀態(tài),事件可以是I/O操作完成、共享資源可以、時(shí)鐘脈沖發(fā)生等;任務(wù)執行過(guò)程被中斷服務(wù)例程中斷,任務(wù)就處于中斷狀態(tài)。

實(shí)時(shí)內核通過(guò)任務(wù)控制塊(TCB)管理任務(wù)。TCB數據結構中包括任務(wù)的狀態(tài)、優(yōu)先、指向任務(wù)棧頂的指針、以及其他與內核有關(guān)的信息。程序調用內核服務(wù)(如調用內核函數OSTaskCreate)創(chuàng )建任務(wù),為此任務(wù)在內存中分配一個(gè)TCB、進(jìn)行初始化,使任務(wù)從休眠狀態(tài)轉變到就緒狀態(tài)。任務(wù)可以在多任務(wù)執行之前靜態(tài)創(chuàng )建,也可以在多任務(wù)執行過(guò)程動(dòng)態(tài)創(chuàng )建。

內核為實(shí)時(shí)多任務(wù)應用程序提供任務(wù)調度和轉換、任務(wù)間通信、定時(shí)順等服務(wù),并作為系統調用提供給任務(wù)使用。實(shí)時(shí)內核以事件為基礎、根據任務(wù)執行狀態(tài)對任務(wù)進(jìn)行切換,任務(wù)的狀態(tài)也隨之相應改變。在實(shí)時(shí)多任務(wù)程序中,內存中存在多個(gè)任務(wù)控制塊以及各個(gè)任務(wù)獨立的私有堆棧。進(jìn)行任務(wù)切換首先要保存CPU寄存器內容到當前任務(wù)堆棧,將堆棧指針保存到當前任務(wù)的TCB中,然后從新任務(wù)的TCB中裝載堆棧指針,并將新任務(wù)上下文裝載到CPU寄存器中。這樣就從一個(gè)任務(wù)轉換到另一個(gè)任務(wù)運行。任務(wù)使用這時(shí)內核提供的定時(shí)器系統調用,可以保持休眠狀態(tài)一段時(shí)間,或者等待一段時(shí)間后成為就緒狀態(tài)。在實(shí)時(shí)嵌入式系統中,外部中斷事件產(chǎn)生的任務(wù)具有高優(yōu)先級,因而以搶占方式獲得CPU控制權。

三、任務(wù)構造

1.I/O任務(wù)構造

根據3種不同的I/O事件;中斷驅動(dòng)事件、輪詢(xún)事件、輸出事件來(lái)構造I/O任務(wù)。輪詢(xún)事件通常由1個(gè)任務(wù)實(shí)現,實(shí)時(shí)內核以固定周期對此任務(wù)進(jìn)行調度,輸出事件常被設計為可重入程序而不是任務(wù);中斷驅動(dòng)事件是一類(lèi)典型的異步事件。

下面將以1個(gè)簡(jiǎn)單的串行設備驅動(dòng)程序來(lái)說(shuō)明I/O分解,突出I/O任務(wù)構造的重要特征。此設備分配得到1個(gè)中斷向量,在3種情況下產(chǎn)生中斷:接收到字符、輸出就緒、設備出錯。因為采用搶占式內核,在I/O中斷發(fā)生進(jìn)入中斷處理例程以后,程序要保存處理器狀態(tài),并根據不同的中斷原因進(jìn)行任務(wù)調度;在中斷處理完成退出中斷處理例程之前,還要恢復處理器狀態(tài)。

設備中斷處理:

IF 接收到字符THEN

將字符放入字符接收隊列;

執行接收任務(wù);

IF 輸出就緒 THEN

IF 繼續輸出 THEN

送下一個(gè)字符;

ELSE

保存"設備輸出就緒"情況;

IF 設備出錯 THEN

將錯誤狀態(tài)放入錯誤隊列;

執行出錯處理任務(wù);

接收任務(wù):

Void Task_receive()

{

While (true){

Wait on input char queue;

If end of input string then

Process input string;

Else

Save input;

}

}

對于中斷事件要合理劃分事件的處理級別,盡可能多地在任務(wù)級處理,從而最小化系統中斷延遲。對這個(gè)串行設備驅動(dòng)中斷的處理就是一個(gè)劃分事件到中斷級和任務(wù)級處理的例子。中斷服務(wù)例程及時(shí)響應實(shí)時(shí)中斷,將實(shí)時(shí)要求相對低一些的事件(如字符出錯、出錯狀態(tài)處理)交給不同的任務(wù)處理。隊列是內核提供的一種任務(wù)間通信結構,支持消息發(fā)送者和接收者異步訪(fǎng)問(wèn)。在這里用于驅動(dòng)程序和任務(wù)之間的通信,為驅動(dòng)程序進(jìn)程和任務(wù)進(jìn)程提供消息緩沖。設備驅動(dòng)程序負責及時(shí)響應中斷事件,并不關(guān)心接收任務(wù)的狀態(tài)。為了簡(jiǎn)化接收任務(wù)的結構,減小系統延遲,這里將出錯處理劃分為獨立的任務(wù),分配不同的優(yōu)先級。

2.內部任務(wù)構造

系統內部任務(wù)可以分為:①周期性任務(wù)--實(shí)時(shí)內核基于固定周期調度的任務(wù);②異步任務(wù)--非周期或事件驅動(dòng)的任務(wù),內核根據需要進(jìn)行調度,用于處理系統內部產(chǎn)生的事件;③控制對象--為狀態(tài)機創(chuàng )建的控制任務(wù),用于實(shí)現狀態(tài)轉換;④用戶(hù)接口⑤--對應于用戶(hù)任務(wù),在用戶(hù)驅動(dòng)的系統中,用戶(hù)任務(wù)是具有高優(yōu)先級。

在嵌入式實(shí)時(shí)多任務(wù)系統中,大部分任務(wù)是非周期或事件驅動(dòng)的異步任務(wù),其函數形式如下:

Void Task_aperiodic ()

{

While (true){

Wait on an async data structure;

Process input;

Process output;

}

}

在異步任務(wù)中,驅動(dòng)任務(wù)的異步數據是由實(shí)時(shí)內核提供的任務(wù)間通信數據。內核為應用程序提供信號量、消息隊列、消息郵箱、插口或管道等結構,進(jìn)行事件管理和任務(wù)間通信。設計這些異步任務(wù)時(shí)采用合適的數據結構、正確定義數據能夠節省寶貴的調試時(shí)間,而且任務(wù)處理的函數不能太多,過(guò)于復雜,否則會(huì )增加調試的難度。

3.任務(wù)合并

利用任務(wù)的共同特征進(jìn)行適當的任務(wù)合并,可以簡(jiǎn)化系統任務(wù)模型、減小系統復雜度、消除某些任務(wù)的切換開(kāi)銷(xiāo)從而減少系統總體開(kāi)銷(xiāo)。任務(wù)合并可分為:①根據時(shí)間一致合并,將同一事件激活的優(yōu)先級相同的函數合并在1個(gè)任務(wù)中;②根據控制一致合并,③根據函數一致合并,將幾個(gè)使用相同數據的函數合并,使原來(lái)共享的數據成為任務(wù)內的局部數據,從而減少互斥。

結束語(yǔ)

目前有許多廠(chǎng)商提供面向嵌入式應用領(lǐng)域的實(shí)時(shí)操作系統(RTOS),提供實(shí)時(shí)內核、輸入/輸出管理器、窗口系統、文件系統、網(wǎng)絡(luò )、語(yǔ)言接口庫、調試器和交叉平臺編譯器的軟件包。其中實(shí)時(shí)內核為嵌入式多任務(wù)程序提供最基本和最重要的功能。本文從利用實(shí)時(shí)內核開(kāi)發(fā)多任務(wù)應用程序的角度,對實(shí)時(shí)內核和任務(wù)進(jìn)行介紹,提出合理構造任務(wù)的方法??梢钥吹?,利用實(shí)時(shí)內核提供的服務(wù),采用正確的開(kāi)發(fā)方法,可以增加嵌入式實(shí)時(shí)多任務(wù)系統的功能,降低開(kāi)發(fā)方法,可以增加嵌入式實(shí)時(shí)多任務(wù)系統的功能,降低開(kāi)發(fā)難度。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>