文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2010)11-0048-04
隨著嵌入式技術(shù)的發(fā)展,實(shí)時(shí)操作系統(tǒng)RTOS(Real Time Operating System)被越來越多地應(yīng)用在嵌入式系統(tǒng)中,,但是對(duì)現(xiàn)有基于軟件實(shí)現(xiàn)的RTOS,,單純依靠改進(jìn)調(diào)度算法已經(jīng)不能使系統(tǒng)的實(shí)時(shí)性有很大提高。為提高系統(tǒng)的響應(yīng)能力,,國內(nèi)外一些研究機(jī)構(gòu)提出RTOS硬化的方法,,并開始做這方面的研究工作[1]。目前,,軟件硬化常用的有兩種方法:(1)微程序方式,,特點(diǎn)是成本較低,方便靈活,;(2)組合邏輯方式,,特點(diǎn)是速度快、可靠性高,,隨著大規(guī)模集成電路的發(fā)展,,這種方式逐漸顯示出優(yōu)越性[2]。信號(hào)量管理是RTOS中頻繁運(yùn)行的程序段之一,,如果將這一部分用硬件實(shí)現(xiàn),,對(duì)提高機(jī)器的速度將有很明顯的效果。本文采用組合邏輯方式參照uC/OS-II將信號(hào)量管理及ECB管理硬化到一片芯片上,,作為獨(dú)立的模塊與處理器并行工作,。
1 信號(hào)量管理的工作原理
uC/OS-II中信號(hào)量主要數(shù)據(jù)結(jié)構(gòu)由兩部分組成:(1)信號(hào)量的計(jì)數(shù)值Cnt。當(dāng)數(shù)值為正時(shí)用于記錄可使用的資源數(shù),,當(dāng)數(shù)值為負(fù),,其絕對(duì)值表示等待當(dāng)前信號(hào)量的任務(wù)個(gè)數(shù),;(2)等待該信號(hào)量的任務(wù)列表。信號(hào)量的基本數(shù)據(jù)結(jié)構(gòu)需要申請(qǐng)一個(gè)ECB來存儲(chǔ),。一個(gè)任務(wù)或ISR可以通過ECB向另外的任務(wù)發(fā)信號(hào),,一個(gè)任務(wù)可以等待另一個(gè)任務(wù)或中斷服務(wù)子程序給它發(fā)送信號(hào),多個(gè)任務(wù)可同時(shí)等待同一個(gè)事件的發(fā)生[3],。當(dāng)事件發(fā)生后,,等待該事件的優(yōu)先級(jí)最高的任務(wù)進(jìn)入就緒狀態(tài),觸發(fā)一次任務(wù)調(diào)度[3],。任務(wù)或者中斷服務(wù)子程序都可以給ECB發(fā)信號(hào),,對(duì)ECB進(jìn)行操作。
信號(hào)量管理的工作原理框圖如圖1所示,。信號(hào)量管理模塊以及事件控制塊管理都是獨(dú)立于CPU的邏輯結(jié)構(gòu),,都可以直接從數(shù)據(jù)總線上獲得數(shù)據(jù)信息進(jìn)行處理,在信號(hào)量管理模塊與ECB的存儲(chǔ)模塊間建立一條數(shù)據(jù)通路,,在不增加總線負(fù)擔(dān)的情況下加快二者間的通信,。這些硬件邏輯獨(dú)立于CPU工作,減少了CPU的工作,,從而提高系統(tǒng)的響應(yīng)能力,。
2 信號(hào)量管理的硬件設(shè)計(jì)與實(shí)現(xiàn)
2.1 ECB的設(shè)計(jì)與實(shí)現(xiàn)
ECB是實(shí)現(xiàn)信號(hào)量管理的基本數(shù)據(jù)結(jié)構(gòu),因此在設(shè)計(jì)實(shí)現(xiàn)信號(hào)量管理之前,,要先完成ECB管理的設(shè)計(jì)與實(shí)現(xiàn),。本系統(tǒng)中ECB的結(jié)構(gòu)參照μC/OS-II中ECB的結(jié)構(gòu)設(shè)計(jì)。每個(gè)ECB存儲(chǔ)單元包含一個(gè)EventType(事件類型),,用于標(biāo)記當(dāng)前ECB被分配給信號(hào)量,、互斥型信號(hào)量、郵箱還是消息隊(duì)列,;當(dāng)一個(gè)ECB被分配給信號(hào)量時(shí),,Cnt做為信號(hào)量的計(jì)數(shù)器;ECB中的等待表lut用于存儲(chǔ)等待當(dāng)前信號(hào)量任務(wù)的優(yōu)先級(jí)(μC/OS-II中沒有兩個(gè)任務(wù)有相同的優(yōu)先級(jí))[3],。
ECB中等待表硬件實(shí)現(xiàn)的結(jié)構(gòu)示意圖如圖2所示,。等待表的結(jié)構(gòu)類似一個(gè)8行8列的矩陣,存儲(chǔ)單元編號(hào)從00~77,。當(dāng)一個(gè)任務(wù)在申請(qǐng)當(dāng)前信號(hào)量而沒有獲得時(shí),,應(yīng)將當(dāng)前任務(wù)設(shè)置為等待狀態(tài),令Wr有效,,以申請(qǐng)?jiān)撔盘?hào)量任務(wù)的優(yōu)先級(jí)為地址,,進(jìn)行譯碼,選通相應(yīng)單元后再進(jìn)行寫1操作,。例如,,申請(qǐng)?jiān)撔盘?hào)量的任務(wù)優(yōu)先級(jí)Sid為111111時(shí),,對(duì)其進(jìn)行譯碼,,高三位行地址譯碼為10000000,,低三位列地址譯碼為10000000,選中77單元向其寫入1,,則優(yōu)先級(jí)為111111的任務(wù)進(jìn)入等待狀態(tài),。若要將一個(gè)處于等待表中的任務(wù)刪除,令De有效,,同樣,,根據(jù)地址線選通某一存儲(chǔ)單元,向單元內(nèi)寫0,,從而刪除某一處于等待狀態(tài)的任務(wù),。在控制電路中設(shè)置EventGrp 8位寄存器,用于記錄當(dāng)前各行中是否有等待任務(wù),;如圖2所示,,第i行中某一位置為1,EventGrp(i)=1,,圖中狀態(tài)EventGrp(7)=1,、EventGrp(6)=1、EventGrp(0)=0,。Rd有效時(shí),,控制電路根據(jù)EventGrp采用一定算法生成優(yōu)先級(jí)的高三位;根據(jù)EventGrp讀出某行后生成優(yōu)先級(jí)低三位,;下一時(shí)鐘送出最高優(yōu)先級(jí),。以上為對(duì)等待表進(jìn)行基本讀寫操作的過程。
該硬件系統(tǒng)中ECB基本存儲(chǔ)單元通過調(diào)用系統(tǒng)的IP核來實(shí)現(xiàn),,根據(jù)存儲(chǔ)數(shù)據(jù)的不同,,采用不同的IP核;多個(gè)基本單元通過一個(gè)上層文件生成一個(gè)ECB單元,,每個(gè)單元再作為一個(gè)基本器件用于實(shí)現(xiàn)整個(gè)ECB的存儲(chǔ)體,。通過地址的譯碼選通ECB單元,根據(jù)控制信號(hào)對(duì)數(shù)據(jù)做讀寫操作,。
2.2 創(chuàng)建/刪除一個(gè)信號(hào)量
ECB是公共數(shù)據(jù)結(jié)構(gòu),,在傳統(tǒng)的操作系統(tǒng)中創(chuàng)建一個(gè)信號(hào)量時(shí),首先需要申請(qǐng)一個(gè)ECB,,初始化后才可以對(duì)這個(gè)信號(hào)量進(jìn)行P/V等操作,;在刪除一個(gè)信號(hào)量后,要對(duì)信號(hào)量占用的ECB進(jìn)行釋放,。創(chuàng)建信號(hào)量時(shí),,信號(hào)量管理模塊首先要申請(qǐng)一個(gè)空ECB,,查找ECB的整個(gè)存儲(chǔ)體判斷是否有空余的ECB。如果沒有空余ECB,,則信號(hào)量管理模塊將獲得一個(gè)申請(qǐng)失敗信號(hào),;否則將獲得一個(gè)空ECB的地址,并將其返回給創(chuàng)建該信號(hào)量的任務(wù),;再根據(jù)地址初始化ECB[3],。如果用硬件實(shí)現(xiàn)信號(hào)量管理后,按照以上過程進(jìn)行操作會(huì)浪費(fèi)很多時(shí)鐘,,數(shù)據(jù)在模塊間來回傳送增加通信次數(shù),,必然降低系統(tǒng)的執(zhí)行速度。針對(duì)這個(gè)問題,,提出了在信號(hào)量管理模塊中設(shè)置一個(gè)用于記錄ECB使用情況的映射表,,如圖3所示。為方便討論,,假設(shè)系統(tǒng)中ECB有64個(gè)(可以根據(jù)系統(tǒng)中ECB的個(gè)數(shù)來改變表的大小),,表的每個(gè)位置對(duì)應(yīng)一個(gè)ECB,當(dāng)某一位置為0時(shí)表示該位置對(duì)應(yīng)的ECB空閑,,為1時(shí)表示該位置對(duì)應(yīng)的ECB被占用,。如圖3所示,第1行,、第8列為1,,表示偏移地址為000111的ECB被占用;第2行,、第2 列為1,,偏移地址為010010的ECB被占用。
在創(chuàng)建一個(gè)信號(hào)量時(shí),,查找ECB映射表,,判斷是否有為0的位置。如果沒有則返回申請(qǐng)失??;否則尋找一個(gè)為0的位置,生成ECB的地址,,返回給創(chuàng)建該信號(hào)量的任務(wù),。在映射表中相應(yīng)位置寫1表明該ECB已經(jīng)被占用,下一時(shí)鐘對(duì)申請(qǐng)到的ECB進(jìn)行初始化,,寫入信號(hào)量初始值,。在刪除一個(gè)信號(hào)量時(shí),首先根據(jù)信號(hào)量的ECB地址查詢映射表中對(duì)應(yīng)位置是否為0,,如果為0,,則表示該信號(hào)量已經(jīng)被其他任務(wù)刪除,,返回刪除錯(cuò)誤;否則清除該信號(hào)量在映射表中的記錄,,通知ECB管理模塊將等待該信號(hào)的所有任務(wù)置為就緒態(tài),,觸發(fā)一次任務(wù)調(diào)度,清除ECB中的該信號(hào)量的所有信息,。以上過程中不需要頻繁地去ECB管理模塊中進(jìn)行整體查詢,,因此節(jié)省了大量的通信時(shí)間,。
2.3 申請(qǐng)/釋放一個(gè)信號(hào)量(P/V操作)
信號(hào)量管理中的主要操作就是P/V操作,,P/V操作實(shí)現(xiàn)的RTL圖如圖4所示。
(1)P操作(申請(qǐng)某個(gè)信號(hào)量),。令pend_sem有效,,首先應(yīng)判斷申請(qǐng)信號(hào)量的任務(wù)是否為中斷服務(wù)程序(在μC/OS-II中,中斷服務(wù)程序不允許申請(qǐng)一個(gè)信號(hào)量),,如果是則返回申請(qǐng)錯(cuò)誤信息(pend_err為高),,否則進(jìn)行以下操作:令read_cnt有效去ECB管理模塊讀Cnt值;讀回后判斷Cnt的值,。如果Cnt>0,,當(dāng)前申請(qǐng)任務(wù)獲得該信號(hào)量,任務(wù)繼續(xù)執(zhí)行,,返回申請(qǐng)成功信號(hào)pend_err為低,;否則pend_err為高阻,根據(jù)申請(qǐng)類型Pend_type(申請(qǐng)類型在μC/OS-II中分為有等待申請(qǐng)和無等待申請(qǐng))來決定是否修改Cnt值,,是否將申請(qǐng)信號(hào)量的任務(wù)置為等待態(tài),。
(2)V操作(釋放某個(gè)信號(hào)量)。令post_sem有效,,通過硬件電路使read_cnt有效,,同時(shí)給出信號(hào)量的ECB地址,下一時(shí)鐘讀出Cnt值,,并判斷,;如果Cnt>0則表示沒有任務(wù)等待當(dāng)前信號(hào)量,修改Cnt值,;如果Cnt<0則表示當(dāng)前有任務(wù)等待該信號(hào)量,,修改Cnt值,令select_h有效,,從ECB任務(wù)等待表中找出優(yōu)先級(jí)最高的任務(wù),,通知任務(wù)管理器將該任務(wù)置為就緒態(tài),觸發(fā)一次任務(wù)調(diào)度,。
3 功能仿真
為驗(yàn)證設(shè)計(jì)對(duì)系統(tǒng)性能的影響,,采用ISE 8.2軟件對(duì)各個(gè)模塊進(jìn)行時(shí)序仿真,。P/V操作仿真結(jié)果如圖5所示。P/V操作需要在兩個(gè)模塊之間進(jìn)行讀寫數(shù)據(jù),,操作過程中,,P/V信號(hào)始終有效。
(1)pend_sem有效(P操作),。申請(qǐng)信號(hào)量任務(wù)的優(yōu)先級(jí)為01,,申請(qǐng)信號(hào)量的地址為05。pend_sem有效,,令read_cnt為高,,根據(jù)地址pend_addr讀當(dāng)前信號(hào)量的值Cnt,下一個(gè)時(shí)鐘返回?cái)?shù)值Cnt_in為0002,,大于0,;任務(wù)獲得信號(hào)量繼續(xù)執(zhí)行,wr_cnt為高,,Cnt值進(jìn)行減1操作后送Cnt_out寫回ECB,。
(2)post_sem有效(V操作)。根據(jù)地址讀Cnt值,,Cnt值為FFFE<0(Cnt值以補(bǔ)碼形式存儲(chǔ)),。下一個(gè)時(shí)鐘Cnt進(jìn)行加1操作后寫回ECB,同時(shí)Select_h為高,,從等待該信號(hào)量的任務(wù)列表中選擇出優(yōu)先級(jí)最高的任務(wù)設(shè)置為就緒態(tài),,觸發(fā)一次任務(wù)調(diào)度。
(3)申請(qǐng)一個(gè)信號(hào)量,。申請(qǐng)信號(hào)量任務(wù)的優(yōu)先級(jí)為03,,申請(qǐng)的信號(hào)量的地址為09。如果下一個(gè)時(shí)鐘讀回的Cnt值為FFFD<0,,并且申請(qǐng)類型為高(有等待申請(qǐng)),,則修改Cnt值寫回,令wr_sid為高,,將當(dāng)前申請(qǐng)任務(wù)的優(yōu)先級(jí)送pend_prio_out寫入等待該信號(hào)的任務(wù)列表中,。如果pend_err為高,則通知任務(wù)管理器將當(dāng)前申請(qǐng)信號(hào)量的任務(wù)阻塞,,并觸發(fā)一次任務(wù)調(diào)度,。
(4)申請(qǐng)一個(gè)信號(hào)量,讀回的Cnt值為FFFA<0,,但當(dāng)前申請(qǐng)類型為低(無等待申請(qǐng)),,不進(jìn)行任何操作,返回申請(qǐng)失敗,通知任務(wù)管理器將當(dāng)前任務(wù)阻塞,。
用戶程序在創(chuàng)建,、刪除一個(gè)信號(hào)量以及申請(qǐng)某類共享資源進(jìn)行P/V操作時(shí),用軟件實(shí)現(xiàn)信號(hào)量管理中,,一般先從用戶態(tài)轉(zhuǎn)到系統(tǒng)態(tài),,然后進(jìn)行基本數(shù)據(jù)的查詢、讀出,、比較,、判斷等,再轉(zhuǎn)相應(yīng)的程序入口,,最后還要從系統(tǒng)態(tài)轉(zhuǎn)回用戶態(tài),。而用硬件實(shí)現(xiàn)信號(hào)量管理后進(jìn)行以上操作只需一條讀或?qū)懼噶睿⑶疫@條指令在用軟件實(shí)現(xiàn)的信號(hào)量管理中也是必須的,,其他操作都由硬件邏輯來實(shí)現(xiàn),,簡化了操作過程。從仿真結(jié)果看,,進(jìn)行P/V操作時(shí)只需要3個(gè)時(shí)鐘節(jié)拍,整體的執(zhí)行速度遠(yuǎn)遠(yuǎn)高于軟件,。同時(shí),,RTOS中信號(hào)量的個(gè)數(shù)為多個(gè),信號(hào)量管理在RTOS中頻繁運(yùn)行,。因此,,硬化信號(hào)量管理后對(duì)整個(gè)機(jī)器速度的提高是非常明顯的,特別是對(duì)資源種類多,、數(shù)量大的計(jì)算機(jī)系統(tǒng),,速度的提高就會(huì)更加明顯。另一方面,,由于硬件的可靠性遠(yuǎn)超過軟件的可靠性,,所以硬化后可提高RTOS的可靠性。
參考文獻(xiàn)
[1] 崔建華,,孫紅勝,,王保進(jìn).硬件實(shí)時(shí)操作系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)技術(shù)應(yīng)用,2008(5):34-37.
[2] 屈玉貴,,趙保華,,森下嚴(yán).操作系統(tǒng)中信號(hào)量管理的固化[J].計(jì)算機(jī)應(yīng)用與軟件,1990(06):29-33.
[3] LABROSSE J J.嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ[M].邵貝貝譯.北京:北京航空航天大學(xué)出版社,,2001:156-176