隨著嵌入式技術的發展,實時操作系統RTOS(Real Time Operating System)被越來越多地應用在嵌入式系統中,如:航空航天、工業控制、汽車電子和核電站建設等眾多領域。對于現有基于軟件實現的實時操作系統,單純依靠改進調度算法已不能使其實時性有更大的提高。如果采用硬件邏輯實現RTOS中的任務調度、中斷處理和定時器管理等功能,則可使其實時性和確定性顯著提高。因為硬件邏輯獨立于處理器運行,不占用處理器的處理時間,所節省的時間用于執行任務程序,從而提高了任務集合的可調度性和實時性。本文基于“外部處理器+FPGA”的硬件平臺結構[1],在FPGA上設計和實現了硬件實時操作系統。
1 硬件實時操作系統的結構和運行原理
硬件實時操作系統能實現典型實時操作系統的各種功能模塊,包括:任務調度內核、中斷管理模塊、定時器模塊、資源管理模塊和內存管理模塊等[2]。為了實現穩定可靠的系統,本文采用逐步演進的方法。首先實現由任務調度內核(也稱作硬件調度內核)、中斷管理、定時器管理和接口軟件構成的最小系統,然后逐步增加其他功能模塊。
硬件RTOS的結構如圖1所示。調度內核是系統的核心,負責任務的調度管理;中斷管理模塊負責管理外部中斷;定時器模塊負責任務延時和周期執行。硬件RTOS的數據通過接口總線與外部系統通信[3]。
任務調度內核使用FPGA的片內寄存器實現任務控制塊TCB(Task Control Block)隊列(簡稱任務隊列)。所有未執行任務放在等待隊列和就緒隊列中。等待隊列中的任務在條件滿足時將變為就緒任務。本文中,等待任務主要等待定時器時間和中斷到達。任務調度內核能在每個調度時機計算出優先級最高的就緒任務。調度內核采用搶占式調度機制,每個調度時機輸出優先級最高的就緒任務。
中斷模塊接管處理器除通知中斷以外的所有外部中斷,中斷服務程序稱作“中斷處理任務”,與普通任務一樣被硬件內核調度。外部中斷到來時,觸發硬件內核的調度時機,保證中斷任務的實時執行。此時,軟件實時操作系統的中斷嵌套已經轉換為處理器中任務的搶占,高優先級的中斷任務可以搶占低優先級任務。
定時器管理模塊實現任務的延時和周期運行,在設定任務周期或延時時間后,每當設定時間到時便會使對應任務就緒,并觸發硬件內核的調度時機,由后者執行一次任務調度。
接口總線硬件實現處理器與硬件RTOS之間的數據傳輸和事件通知。接口軟件從功能上分為兩類:(1)系統API。被應用程序調用,能通過接口總線向硬件RTOS發送命令。硬件RTOS收到命令后,解析數據,執行相應操作。(2)通知中斷服務程序。硬件RTOS進行一次任務調度后,如果發現新“選出”的最高優先級就緒任務與當前處理器正在執行的任務不同,則需要進行現場切換。硬件調度內核將利用通知中斷告知處理器該就緒任務的ID和堆棧地址,觸發后者執行中斷服務程序,以執行現場切換。
任務存在阻塞(S0)、就緒(S1)和運行(S2)三個狀態,定時器存在停止(T0)、運行(T1)兩個狀態,中斷模塊存在無效(I0)、有效(I1)兩個狀態。圖2描述了最小系統各模塊的運行狀態。
2 系統設計與實現
本文選用ARM9系列的處理器S3C2410和Actel公司的FPGA芯片APA075,用后者實現硬件實時操作系統,調度在處理器上執行的任務。
2.1 任務調度內核的設計實現
實時操作系統的核心是任務調度內核,其主要功能是根據調度算法,在每個調度時機確定下一個將要執行的任務,并適時進行現場切換。為此,調度內核需要維護一系列的任務隊列(如就緒任務隊列和等待任務隊列),并在每個調度時機,根據優先級重新排列就緒隊列,以計算出優先級最高的就緒任務。
合理的任務控制塊是實現硬件調度內核的關鍵,應能根據調度算法分配優先級,并利于優先級比較,而且能夠索引最終結果。根據上述需求,設計了如圖3所示的任務控制塊結構。其中ID為任務號,State為任務狀態,Prio為任務優先級,SP_End為任務堆棧終止地址,Run_Time 為任務起始運行時間,End_Time為任務結束運行時間。起始和截止時間能根據特定算法分配任務的優先級。Delay_Counter為任務延時計數器,Timer_Counter為周期任務分頻計數器,Int_Number為中斷號。
硬件調度內核使用多級比較器,能確定當前時刻優先級最高的就緒任務,并將其信息通過接口總線發送到處理器。比較器采用相鄰任務兩兩比較的方式。所以,2n個任務需要n級比較器,構成2n-1個比較單元。多級比較器的結構示例如圖4。
一個比較單元的實現代碼如下:
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;
每個比較單元以任務ID為索引,以優先級為比較內容,每次比較都將優先級高的任務送入下一級比較,經過2n-1次比較,可以把2n個任務中優先級最高的任務選出。硬件邏輯是物理并行執行的,所以與軟件實現的實時操作系統調度內核相比,硬件調度內核的執行速度快,而且這種優勢在多任務虛擬并行和高時鐘節拍的情況下將更加明顯。
硬件調度內核邏輯結構如圖5所示,處理器和硬件調度內核之間通過接口總線通信。硬件調度內核在調度時機進行任務調度,調度時機在以下幾種情況產生:(1)周期任務周期時間到達,任務狀態由等待變為就緒。(2)延時時間到達,等待任務狀態由等待變為就緒。(3)外部中斷到達,中斷任務狀態由等待變為就緒。(4)應用程序調用由硬件RTOS提供的系統API改變了任務狀態或優先級。
以上述第4種情況為例,描述調度執行過程如下:處理器在執行到應用程序調用的系統API時,將其轉換成對應的命令和數據,經編碼后傳遞到調度內核,觸發硬件調度內核的一次調度時機。后者解析收到的數據,并執行調度操作,通過比較各任務優先級,計算出優先級最高的就緒任務。若該任務與當前處理器中正在運行的任務不同,則將該任務的ID號和堆棧終止地址利用通知中斷回送給處理器。
2.2 中斷管理模塊的設計實現
普通任務控制塊的中斷號為0,而中斷任務的中斷號為大于0的整數值,并與中斷號對應的外部中斷相關。中斷管理模塊使用FPGA的I/O(輸入/輸出)管腳,每個管腳對應一個外部中斷,一個或者多個外部中斷對應一個中斷處理任務。應用程序初始化階段設定任務控制塊中斷號字段Int_Number,能注冊中斷處理任務。在FPGA中建立以外部中斷為敏感信號的守護進程,當外部中斷到達時,該進程將中斷任務置于就緒狀態,其偽代碼如下:
process(Task_Int_Number)//外部中斷為敏感信號
begin
if (Task_Int_Number’event and Task_Int_Number=0) then//下降沿觸發
Task_State 《=1;//任務置于就緒態
else
Task_State《=0;
end if;
end process;
硬件調度內核以任務狀態為敏感信號,當外部中斷通過中斷管理模塊使中斷任務就緒時,會觸發調度內核執行一次任務調度。中斷管理模塊的邏輯結構如圖6所示。為了保證外部事件的實時處理,應用程序可為中斷任務設置高于普通任務的優先級。
2.3 定時器管理模塊的設計實現
定時器管理模塊以FPGA外部晶振為基準進行分頻,創建多個定時器以設定任務周期。與定時器關聯的任務稱作周期任務。定時器管理模塊在每個定時器的周期到達后,使對應的周期任務就緒,觸發調度內核進行任務調度。
設定任務控制塊中的Timer_Number注冊周期任務。如圖7所示,定時器管理模塊實現:(1)任務周期運行。在應用程序設置并使能周期計數器Timer_Counter后,每當系統時鐘到達,計數器減1。當計數器為0時,觸發對應的守護進程,使任務進入就緒態并重置周期計數器。任務狀態的改變觸發FPGA中的調度進程,執行一次任務調度。(2)任務延時。在應用程序設置并使能延時計數器Delay_Counter后,模塊使任務變為等待狀態。每次系統時鐘到達,計數器減1。當計數器為0時,觸發對應守護進程,使任務進入就緒態,并執行一次任務調度。
2.4 接口設計
接口總線的硬件由32位數據總線、5位地址總線、1個片選引線和1個通知中斷引線構成。接口軟件包括系統API和通知中斷處理程序。
2.4.1 系統API的設計
系統API實現處理器中應用程序與硬件RTOS的交互。首先為任務調度內核、中斷管理和定時器管理等各硬件模塊分配處理器訪問地址;然后,定義各模塊使用的API,確定其功能和轉換后向硬件RTOS發出的數據格式及內容。
任務管理API包括:創建任務(Task_Creat)、阻塞任務(Task_Block)、改變任務優先級(Task_Change_Prio)和改變任務狀態(Task_Change_State)。
定時器管理API包括:設定分頻值(Set_Timer_Fre)、使能周期任務(Set_Timer_Task)和延時(Delay)。
中斷管理API包括:設定中斷任務(Set_Int_Task)和等待中斷(Wait_IRQ)。
下面以創建任務API為例,描述其偽代碼和功能注釋:
Task_Creat(ID,PRO,STATE)//創建任務,ID為任務索引, //PRO為優先級,STATE為起始狀態
{
Senddata=0001∷ID:PRO:STATE;//拼裝數據, //變成發送數據格式
&TASKADD=Senddata;//將數據發送給硬件RTOS
}
2.4.2 通知中斷服務程序的設計
實時操作系統中,每個任務都有堆??臻g,用于現場切換時保存各寄存器值和棧指針。其中,棧指針指向的堆棧起始地址和保存現場后的終止地址最為重要。保存當前運行任務的現場時,從其堆棧的起始地址開始執行入棧操作;而恢復將運行任務的現場時,從其堆棧的終止地址開始執行出棧操作。
任務堆棧在處理器使用的內存中分配。應用程序初始化時,將任務堆棧終止地址利用接口總線寫入硬件調度內核維護的任務控制塊中。每次調度結束后,若需要現場切換,硬件調度內核會將下一運行任務的ID和堆棧終止地址利用通知中斷發送給處理器。通知中斷處理程序首先將當前任務的寄存器保存在該任務以SP_START為起始地址的堆棧中,然后從接口總線讀取下一運行任務的ID和堆棧終止地址,恢復該任務的現場并開始運行。圖8顯示了通知中斷服務程序的執行過程。
3 實驗與結果分析
對本文實現的硬件RTOS,在時鐘節拍為10μs時,分別測試在4、8、16、32和64個任務下、由定時器中斷觸發調度時機引起現場切換,所占處理器時間(系統開銷)的情況。其結果與軟件實時操作系統μC/OS進行比較,如表1所示。
測試結果表明,硬件RTOS中,由定時器中斷引起的系統開銷不隨任務個數的增加而顯著變化,但與μC/OS相比,差值越來越大。
表2列出了任務32時,在10μs、20μs、40μs、80μs和100μs的時鐘節拍下,硬件RTOS和μC/OS由定時器中斷引起現場切換所占處理器時間的情況。
測試結果表明,隨著時鐘節拍降低,硬件RTOS的系統開銷變化不明顯,而與μC/OS相比,差值越來越大。時鐘節拍很小時,硬件RTOS比μC/OS的系統開銷低許多。
目前,硬件RTOS實現了任務調度內核等基本模塊。今后的工作中,將進一步擴展其功能,增加以下幾個部分:(1)任務間通信和同步。(2)內存管理。(3)支持更多的調度算法,實現調度算法可配置。(4)針對可在FPGA中實現的可配置處理器,用硬件實現上下文切換邏輯。
實時操作系統是嵌入式應用的核心,本文采用FPGA實現硬件實時操作系統,包括任務調度內核、中斷管理和定時器管理等基本功能。硬件RTOS能降低處理器系統開銷,提高其利用率,從而提高實時系統任務集合的可調度性,具有一定的研究和使用價值。
評論