新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 硬件實(shí)時(shí)操作系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

硬件實(shí)時(shí)操作系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

作者: 時(shí)間:2011-01-28 來(lái)源:網(wǎng)絡(luò) 收藏

隨著嵌入式技術(shù)的發(fā)展,RTOS(Real Time Operating System)被越來(lái)越多地應(yīng)用在嵌入式系統(tǒng)中,如:航空航天、工業(yè)控制、汽車電子和核電站建設(shè)等眾多領(lǐng)域。對(duì)于現(xiàn)有基于軟件實(shí)現(xiàn)的,單純依靠改進(jìn)調(diào)度算法已不能使其實(shí)時(shí)性有更大的提高。如果采用硬件邏輯實(shí)現(xiàn)RTOS中的、中斷處理和定時(shí)器管理等功能,則可使其實(shí)時(shí)性和確定性顯著提高。因?yàn)橛布壿嫪?dú)立于處理器運(yùn)行,不占用處理器的處理時(shí)間,所節(jié)省的時(shí)間用于執(zhí)行任務(wù)程序,從而提高了任務(wù)集合的可調(diào)度性和實(shí)時(shí)性。本文基于“外部處理器+FPGA”的硬件平臺(tái)結(jié)構(gòu)[1],在FPGA上設(shè)計(jì)和實(shí)現(xiàn)了硬件

本文引用地址:http://butianyuan.cn/article/257897.htm

1 硬件實(shí)時(shí)操作系統(tǒng)的結(jié)構(gòu)和運(yùn)行原理

硬件實(shí)時(shí)操作系統(tǒng)能實(shí)現(xiàn)典型實(shí)時(shí)操作系統(tǒng)的各種功能模塊,包括:內(nèi)核、模塊、定時(shí)器模塊、資源管理模塊和內(nèi)存管理模塊等[2]。為了實(shí)現(xiàn)穩(wěn)定可靠的系統(tǒng),本文采用逐步演進(jìn)的方法。首先實(shí)現(xiàn)由內(nèi)核(也稱作硬件調(diào)度內(nèi)核)、、定時(shí)器管理和接口軟件構(gòu)成的最小系統(tǒng),然后逐步增加其他功能模塊。

硬件RTOS的結(jié)構(gòu)如圖1所示。調(diào)度內(nèi)核是系統(tǒng)的核心,負(fù)責(zé)任務(wù)的調(diào)度管理;模塊負(fù)責(zé)管理外部中斷;定時(shí)器模塊負(fù)責(zé)任務(wù)延時(shí)和周期執(zhí)行。硬件RTOS的數(shù)據(jù)通過(guò)接口總線與外部系統(tǒng)通信[3]。

任務(wù)調(diào)度內(nèi)核使用FPGA的片內(nèi)寄存器實(shí)現(xiàn)任務(wù)控制塊TCB(Task Control Block)隊(duì)列(簡(jiǎn)稱任務(wù)隊(duì)列)。所有未執(zhí)行任務(wù)放在等待隊(duì)列和就緒隊(duì)列中。等待隊(duì)列中的任務(wù)在條件滿足時(shí)將變?yōu)榫途w任務(wù)。本文中,等待任務(wù)主要等待定時(shí)器時(shí)間和中斷到達(dá)。任務(wù)調(diào)度內(nèi)核能在每個(gè)調(diào)度時(shí)機(jī)計(jì)算出優(yōu)先級(jí)最高的就緒任務(wù)。調(diào)度內(nèi)核采用搶占式調(diào)度機(jī)制,每個(gè)調(diào)度時(shí)機(jī)輸出優(yōu)先級(jí)最高的就緒任務(wù)。

中斷模塊接管處理器除通知中斷以外的所有外部中斷,中斷服務(wù)程序稱作“中斷處理任務(wù)”,與普通任務(wù)一樣被硬件內(nèi)核調(diào)度。外部中斷到來(lái)時(shí),觸發(fā)硬件內(nèi)核的調(diào)度時(shí)機(jī),保證中斷任務(wù)的實(shí)時(shí)執(zhí)行。此時(shí),軟件實(shí)時(shí)操作系統(tǒng)的中斷嵌套已經(jīng)轉(zhuǎn)換為處理器中任務(wù)的搶占,高優(yōu)先級(jí)的中斷任務(wù)可以搶占低優(yōu)先級(jí)任務(wù)。

定時(shí)器管理模塊實(shí)現(xiàn)任務(wù)的延時(shí)和周期運(yùn)行,在設(shè)定任務(wù)周期或延時(shí)時(shí)間后,每當(dāng)設(shè)定時(shí)間到時(shí)便會(huì)使對(duì)應(yīng)任務(wù)就緒,并觸發(fā)硬件內(nèi)核的調(diào)度時(shí)機(jī),由后者執(zhí)行一次任務(wù)調(diào)度。

接口總線硬件實(shí)現(xiàn)處理器與硬件RTOS之間的數(shù)據(jù)傳輸和事件通知。接口軟件從功能上分為兩類:(1)系統(tǒng)API。被應(yīng)用程序調(diào)用,能通過(guò)接口總線向硬件RTOS發(fā)送命令。硬件RTOS收到命令后,解析數(shù)據(jù),執(zhí)行相應(yīng)操作。(2)通知中斷服務(wù)程序。硬件RTOS進(jìn)行一次任務(wù)調(diào)度后,如果發(fā)現(xiàn)新“選出”的最高優(yōu)先級(jí)就緒任務(wù)與當(dāng)前處理器正在執(zhí)行的任務(wù)不同,則需要進(jìn)行現(xiàn)場(chǎng)切換。硬件調(diào)度內(nèi)核將利用通知中斷告知處理器該就緒任務(wù)的ID和堆棧地址,觸發(fā)后者執(zhí)行中斷服務(wù)程序,以執(zhí)行現(xiàn)場(chǎng)切換。

任務(wù)存在阻塞(S0)、就緒(S1)和運(yùn)行(S2)三個(gè)狀態(tài),定時(shí)器存在停止(T0)、運(yùn)行(T1)兩個(gè)狀態(tài),中斷模塊存在無(wú)效(I0)、有效(I1)兩個(gè)狀態(tài)。圖2描述了最小系統(tǒng)各模塊的運(yùn)行狀態(tài)。

2 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

本文選用ARM9系列的處理器S3C2410和Actel公司的FPGA芯片APA075,用后者實(shí)現(xiàn)硬件實(shí)時(shí)操作系統(tǒng),調(diào)度在處理器上執(zhí)行的任務(wù)。

2.1 任務(wù)調(diào)度內(nèi)核的設(shè)計(jì)實(shí)現(xiàn)

實(shí)時(shí)操作系統(tǒng)的核心是任務(wù)調(diào)度內(nèi)核,其主要功能是根據(jù)調(diào)度算法,在每個(gè)調(diào)度時(shí)機(jī)確定下一個(gè)將要執(zhí)行的任務(wù),并適時(shí)進(jìn)行現(xiàn)場(chǎng)切換。為此,調(diào)度內(nèi)核需要維護(hù)一系列的任務(wù)隊(duì)列(如就緒任務(wù)隊(duì)列和等待任務(wù)隊(duì)列),并在每個(gè)調(diào)度時(shí)機(jī),根據(jù)優(yōu)先級(jí)重新排列就緒隊(duì)列,以計(jì)算出優(yōu)先級(jí)最高的就緒任務(wù)。

合理的任務(wù)控制塊是實(shí)現(xiàn)硬件調(diào)度內(nèi)核的關(guān)鍵,應(yīng)能根據(jù)調(diào)度算法分配優(yōu)先級(jí),并利于優(yōu)先級(jí)比較,而且能夠索引最終結(jié)果。根據(jù)上述需求,設(shè)計(jì)了如圖3所示的任務(wù)控制塊結(jié)構(gòu)。其中ID為任務(wù)號(hào),State為任務(wù)狀態(tài),Prio為任務(wù)優(yōu)先級(jí),SP_End為任務(wù)堆棧終止地址,Run_Time 為任務(wù)起始運(yùn)行時(shí)間,End_Time為任務(wù)結(jié)束運(yùn)行時(shí)間。起始和截止時(shí)間能根據(jù)特定算法分配任務(wù)的優(yōu)先級(jí)。Delay_Counter為任務(wù)延時(shí)計(jì)數(shù)器,Timer_Counter為周期任務(wù)分頻計(jì)數(shù)器,Int_Number為中斷號(hào)。

硬件調(diào)度內(nèi)核使用多級(jí)比較器,能確定當(dāng)前時(shí)刻優(yōu)先級(jí)最高的就緒任務(wù),并將其信息通過(guò)接口總線發(fā)送到處理器。比較器采用相鄰任務(wù)兩兩比較的方式。所以,2n個(gè)任務(wù)需要n級(jí)比較器,構(gòu)成2n-1個(gè)比較單元。多級(jí)比較器的結(jié)構(gòu)示例如圖4。

一個(gè)比較單元的實(shí)現(xiàn)代碼如下:

process(Ready_TASK0_pro, Ready_TASK1_pro)

begin

if (Ready_TASK0_pro Ready_TASK1_pro) then

cmp_level3_01_pro= Ready_TASK0_pro;

cmp_level3_01_id= Ready_TASK0_id;

else

cmp_level3_01_pro=Ready_TASK1_pro;

cmp_level3_01_id=Ready_TASK1_id;

end if;

end process;

每個(gè)比較單元以任務(wù)ID為索引,以優(yōu)先級(jí)為比較內(nèi)容,每次比較都將優(yōu)先級(jí)高的任務(wù)送入下一級(jí)比較,經(jīng)過(guò)2n-1次比較,可以把2n個(gè)任務(wù)中優(yōu)先級(jí)最高的任務(wù)選出。硬件邏輯是物理并行執(zhí)行的,所以與軟件實(shí)現(xiàn)的實(shí)時(shí)操作系統(tǒng)調(diào)度內(nèi)核相比,硬件調(diào)度內(nèi)核的執(zhí)行速度快,而且這種優(yōu)勢(shì)在多任務(wù)虛擬并行和高時(shí)鐘節(jié)拍的情況下將更加明顯。

硬件調(diào)度內(nèi)核邏輯結(jié)構(gòu)如圖5所示,處理器和硬件調(diào)度內(nèi)核之間通過(guò)接口總線通信。硬件調(diào)度內(nèi)核在調(diào)度時(shí)機(jī)進(jìn)行任務(wù)調(diào)度,調(diào)度時(shí)機(jī)在以下幾種情況產(chǎn)生:(1)周期任務(wù)周期時(shí)間到達(dá),任務(wù)狀態(tài)由等待變?yōu)榫途w。(2)延時(shí)時(shí)間到達(dá),等待任務(wù)狀態(tài)由等待變?yōu)榫途w。(3)外部中斷到達(dá),中斷任務(wù)狀態(tài)由等待變?yōu)榫途w。(4)應(yīng)用程序調(diào)用由硬件RTOS提供的系統(tǒng)API改變了任務(wù)狀態(tài)或優(yōu)先級(jí)。

以上述第4種情況為例,描述調(diào)度執(zhí)行過(guò)程如下:處理器在執(zhí)行到應(yīng)用程序調(diào)用的系統(tǒng)API時(shí),將其轉(zhuǎn)換成對(duì)應(yīng)的命令和數(shù)據(jù),經(jīng)編碼后傳遞到調(diào)度內(nèi)核,觸發(fā)硬件調(diào)度內(nèi)核的一次調(diào)度時(shí)機(jī)。后者解析收到的數(shù)據(jù),并執(zhí)行調(diào)度操作,通過(guò)比較各任務(wù)優(yōu)先級(jí),計(jì)算出優(yōu)先級(jí)最高的就緒任務(wù)。若該任務(wù)與當(dāng)前處理器中正在運(yùn)行的任務(wù)不同,則將該任務(wù)的ID號(hào)和堆棧終止地址利用通知中斷回送給處理器。

2.2 中斷管理模塊的設(shè)計(jì)實(shí)現(xiàn)

普通任務(wù)控制塊的中斷號(hào)為0,而中斷任務(wù)的中斷號(hào)為大于0的整數(shù)值,并與中斷號(hào)對(duì)應(yīng)的外部中斷相關(guān)。中斷管理模塊使用FPGA的I/O(輸入/輸出)管腳,每個(gè)管腳對(duì)應(yīng)一個(gè)外部中斷,一個(gè)或者多個(gè)外部中斷對(duì)應(yīng)一個(gè)中斷處理任務(wù)。應(yīng)用程序初始化階段設(shè)定任務(wù)控制塊中斷號(hào)字段Int_Number,能注冊(cè)中斷處理任務(wù)。在FPGA中建立以外部中斷為敏感信號(hào)的守護(hù)進(jìn)程,當(dāng)外部中斷到達(dá)時(shí),該進(jìn)程將中斷任務(wù)置于就緒狀態(tài),其偽代碼如下:

process(Task_Int_Number)//外部中斷為敏感信號(hào)

begin

if (Task_Int_Number’event and Task_Int_Number=0) then//下降沿觸發(fā)

Task_State =1;//任務(wù)置于就緒態(tài)

else

Task_State=0;

end if;

end process;

硬件調(diào)度內(nèi)核以任務(wù)狀態(tài)為敏感信號(hào),當(dāng)外部中斷通過(guò)中斷管理模塊使中斷任務(wù)就緒時(shí),會(huì)觸發(fā)調(diào)度內(nèi)核執(zhí)行一次任務(wù)調(diào)度。中斷管理模塊的邏輯結(jié)構(gòu)如圖6所示。為了保證外部事件的實(shí)時(shí)處理,應(yīng)用程序可為中斷任務(wù)設(shè)置高于普通任務(wù)的優(yōu)先級(jí)。

2.3 定時(shí)器管理模塊的設(shè)計(jì)實(shí)現(xiàn)

  定時(shí)器管理模塊以FPGA外部晶振為基準(zhǔn)進(jìn)行分頻,創(chuàng)建多個(gè)定時(shí)器以設(shè)定任務(wù)周期。與定時(shí)器關(guān)聯(lián)的任務(wù)稱作周期任務(wù)。定時(shí)器管理模塊在每個(gè)定時(shí)器的周期到達(dá)后,使對(duì)應(yīng)的周期任務(wù)就緒,觸發(fā)調(diào)度內(nèi)核進(jìn)行任務(wù)調(diào)度。

  設(shè)定任務(wù)控制塊中的Timer_Number注冊(cè)周期任務(wù)。如圖7所示,定時(shí)器管理模塊實(shí)現(xiàn):(1)任務(wù)周期運(yùn)行。在應(yīng)用程序設(shè)置并使能周期計(jì)數(shù)器Timer_Counter后,每當(dāng)系統(tǒng)時(shí)鐘到達(dá),計(jì)數(shù)器減1。當(dāng)計(jì)數(shù)器為0時(shí),觸發(fā)對(duì)應(yīng)的守護(hù)進(jìn)程,使任務(wù)進(jìn)入就緒態(tài)并重置周期計(jì)數(shù)器。任務(wù)狀態(tài)的改變觸發(fā)FPGA中的調(diào)度進(jìn)程,執(zhí)行一次任務(wù)調(diào)度。(2)任務(wù)延時(shí)。在應(yīng)用程序設(shè)置并使能延時(shí)計(jì)數(shù)器Delay_Counter后,模塊使任務(wù)變?yōu)榈却隣顟B(tài)。每次系統(tǒng)時(shí)鐘到達(dá),計(jì)數(shù)器減1。當(dāng)計(jì)數(shù)器為0時(shí),觸發(fā)對(duì)應(yīng)守護(hù)進(jìn)程,使任務(wù)進(jìn)入就緒態(tài),并執(zhí)行一次任務(wù)調(diào)度。

2.4 接口設(shè)計(jì)

接口總線的硬件由32位數(shù)據(jù)總線、5位地址總線、1個(gè)片選引線和1個(gè)通知中斷引線構(gòu)成。接口軟件包括系統(tǒng)API和通知中斷處理程序。

2.4.1 系統(tǒng)API的設(shè)計(jì)

系統(tǒng)API實(shí)現(xiàn)處理器中應(yīng)用程序與硬件RTOS的交互。首先為任務(wù)調(diào)度內(nèi)核、中斷管理和定時(shí)器管理等各硬件模塊分配處理器訪問(wèn)地址;然后,定義各模塊使用的API,確定其功能和轉(zhuǎn)換后向硬件RTOS發(fā)出的數(shù)據(jù)格式及內(nèi)容。

任務(wù)管理API包括:創(chuàng)建任務(wù)(Task_Creat)、阻塞任務(wù)(Task_Block)、改變?nèi)蝿?wù)優(yōu)先級(jí)(Task_Change_Prio)和改變?nèi)蝿?wù)狀態(tài)(Task_Change_State)。

定時(shí)器管理API包括:設(shè)定分頻值(Set_Timer_Fre)、使能周期任務(wù)(Set_Timer_Task)和延時(shí)(Delay)。

中斷管理API包括:設(shè)定中斷任務(wù)(Set_Int_Task)和等待中斷(Wait_IRQ)。

下面以創(chuàng)建任務(wù)API為例,描述其偽代碼和功能注釋:

Task_Creat(ID,PRO,STATE)//創(chuàng)建任務(wù),ID為任務(wù)索引, //PRO為優(yōu)先級(jí),STATE為起始狀態(tài)

{

Senddata=0001∷ID:PRO:STATE;//拼裝數(shù)據(jù), //變成發(fā)送數(shù)據(jù)格式

TASKADD=Senddata;//將數(shù)據(jù)發(fā)送給硬件RTOS

}

2.4.2 通知中斷服務(wù)程序的設(shè)計(jì)

實(shí)時(shí)操作系統(tǒng)中,每個(gè)任務(wù)都有堆??臻g,用于現(xiàn)場(chǎng)切換時(shí)保存各寄存器值和棧指針。其中,棧指針指向的堆棧起始地址和保存現(xiàn)場(chǎng)后的終止地址最為重要。保存當(dāng)前運(yùn)行任務(wù)的現(xiàn)場(chǎng)時(shí),從其堆棧的起始地址開(kāi)始執(zhí)行入棧操作;而恢復(fù)將運(yùn)行任務(wù)的現(xiàn)場(chǎng)時(shí),從其堆棧的終止地址開(kāi)始執(zhí)行出棧操作。

任務(wù)堆棧在處理器使用的內(nèi)存中分配。應(yīng)用程序初始化時(shí),將任務(wù)堆棧終止地址利用接口總線寫入硬件調(diào)度內(nèi)核維護(hù)的任務(wù)控制塊中。每次調(diào)度結(jié)束后,若需要現(xiàn)場(chǎng)切換,硬件調(diào)度內(nèi)核會(huì)將下一運(yùn)行任務(wù)的ID和堆棧終止地址利用通知中斷發(fā)送給處理器。通知中斷處理程序首先將當(dāng)前任務(wù)的寄存器保存在該任務(wù)以SP_START為起始地址的堆棧中,然后從接口總線讀取下一運(yùn)行任務(wù)的ID和堆棧終止地址,恢復(fù)該任務(wù)的現(xiàn)場(chǎng)并開(kāi)始運(yùn)行。圖8顯示了通知中斷服務(wù)程序的執(zhí)行過(guò)程。

3 實(shí)驗(yàn)與結(jié)果分析

對(duì)本文實(shí)現(xiàn)的硬件RTOS,在時(shí)鐘節(jié)拍為10μs時(shí),分別測(cè)試在4、8、16、32和64個(gè)任務(wù)下、由定時(shí)器中斷觸發(fā)調(diào)度時(shí)機(jī)引起現(xiàn)場(chǎng)切換,所占處理器時(shí)間(系統(tǒng)開(kāi)銷)的情況。其結(jié)果與軟件實(shí)時(shí)操作系統(tǒng)μC/OS進(jìn)行比較,如表1所示。

測(cè)試結(jié)果表明,硬件RTOS中,由定時(shí)器中斷引起的系統(tǒng)開(kāi)銷不隨任務(wù)個(gè)數(shù)的增加而顯著變化,但與μC/OS相比,差值越來(lái)越大。

表2列出了任務(wù)32時(shí),在10μs、20μs、40μs、80μs和100μs的時(shí)鐘節(jié)拍下,硬件RTOS和μC/OS由定時(shí)器中斷引起現(xiàn)場(chǎng)切換所占處理器時(shí)間的情況。

測(cè)試結(jié)果表明,隨著時(shí)鐘節(jié)拍降低,硬件RTOS的系統(tǒng)開(kāi)銷變化不明顯,而與μC/OS相比,差值越來(lái)越大。時(shí)鐘節(jié)拍很小時(shí),硬件RTOS比μC/OS的系統(tǒng)開(kāi)銷低許多。

目前,硬件RTOS實(shí)現(xiàn)了任務(wù)調(diào)度內(nèi)核等基本模塊。今后的工作中,將進(jìn)一步擴(kuò)展其功能,增加以下幾個(gè)部分:(1)任務(wù)間通信和同步。(2)內(nèi)存管理。(3)支持更多的調(diào)度算法,實(shí)現(xiàn)調(diào)度算法可配置。(4)針對(duì)可在FPGA中實(shí)現(xiàn)的可配置處理器,用硬件實(shí)現(xiàn)上下文切換邏輯。

實(shí)時(shí)操作系統(tǒng)是嵌入式應(yīng)用的核心,本文采用FPGA實(shí)現(xiàn)硬件實(shí)時(shí)操作系統(tǒng),包括任務(wù)調(diào)度內(nèi)核、中斷管理和定時(shí)器管理等基本功能。硬件RTOS能降低處理器系統(tǒng)開(kāi)銷,提高其利用率,從而提高實(shí)時(shí)系統(tǒng)任務(wù)集合的可調(diào)度性,具有一定的研究和使用價(jià)值。



評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉