夏 鑫 張 果 王劍平 楊曉洪
(昆明理工大學(xué)信息工程與自動化學(xué)院,昆明 650500)
實時操作系統(tǒng)FreeRTOS移植的實驗研究
夏 鑫 張 果 王劍平 楊曉洪
(昆明理工大學(xué)信息工程與自動化學(xué)院,昆明 650500)
分析了實時操作系統(tǒng)FreeRTOS的原理、內(nèi)核組成與任務(wù)管理機制。完成FreeRTOS實時操作系統(tǒng)在S3C44b0x硬件平臺上跨平臺、跨編譯器的移植。同時設(shè)計了固定優(yōu)先級調(diào)度與二值信號量任務(wù)間的同步通信實驗,驗證了FreeRTOS操作系統(tǒng)移植的正確性和實驗設(shè)計的合理性。
FreeRTOS 移植 S3C44b0x 任務(wù)同步通信 任務(wù)調(diào)度
隨著計算機技術(shù)和微電子技術(shù)的推進,嵌入式技術(shù)這門新興學(xué)科產(chǎn)生并且迅速發(fā)展,因此傳統(tǒng)的單機、單任務(wù)模式已經(jīng)無法滿足現(xiàn)代嵌入式設(shè)備在功能上的需求,在這種情況下,引入操作系統(tǒng)是嵌入式系統(tǒng)發(fā)展的必然趨勢。
將嵌入式設(shè)備引入操作系統(tǒng),對于整個系統(tǒng)的硬件和軟件資源,操作系統(tǒng)都可以合理有效地管理,這對整個系統(tǒng)的性能有了很大程度的提升。而當(dāng)執(zhí)行一個復(fù)雜的應(yīng)用程序時,嵌入式操作系統(tǒng)可將它分解為若干個實現(xiàn)特定獨立功能的子任務(wù)模塊,模塊之間則通過任務(wù)通信機制、任務(wù)管理來實現(xiàn)一個完整的功能,這種“自下而上”的結(jié)構(gòu)化設(shè)計同時也便于系統(tǒng)開發(fā)。
FreeRTOS(Free Real Time Operating System)作為一個輕量級嵌入式實時操作系統(tǒng),憑借其開源和完全免費的優(yōu)勢,滿足了大多數(shù)中小型嵌入式系統(tǒng)對RTOS的需求,得到了越來越廣泛地應(yīng)用。FreeRTOS擁有源代碼公開、可移植、可裁剪、調(diào)度策略靈活及輕量級等特點,適用于絕大多數(shù)處理器,在國外業(yè)界倍受開發(fā)者青睞。在此,筆者對實時操作系統(tǒng)FreeRTOS在S3C44b0x上的移植進行了分析研究,并設(shè)計相關(guān)實驗進行驗證,最后指出FreeRTOS操作系統(tǒng)的優(yōu)勢與不足。
FreeRTOS內(nèi)核管理(圖1)包括任務(wù)管理、時間管理、內(nèi)存管理和通信管理4部分[1]。
圖1 FreeRTOS內(nèi)核管理結(jié)構(gòu)
FreeRTOS通過任務(wù)控制塊對任務(wù)施行管理;時間管理包括時鐘的產(chǎn)生管理和任務(wù)延時管理;內(nèi)存管理中,F(xiàn)reeRTOS為用戶提供了4種不同的內(nèi)存分配管理方案,用戶可以根據(jù)需求選擇合適的一種;此外,內(nèi)核中還提供任務(wù)通信管理機制,分為消息管理和任務(wù)同步管理。其中同步機制又包括信號量和互斥量,F(xiàn)reeRTOS沒有消息郵箱同步機制,所有的同步機制都是基于消息隊列來實現(xiàn)的[2]。
2.1FreeRTOS任務(wù)模型
FreeRTOS對任務(wù)數(shù)量沒有限制。相較于其他實時操作系統(tǒng),F(xiàn)reeRTOS有一個突出的特點,即在任務(wù)的優(yōu)先級管理中允許不同任務(wù)之間可以設(shè)置相同的優(yōu)先級。在FreeRTOS中任務(wù)可設(shè)置0~255個不同的優(yōu)先級,設(shè)置的數(shù)值決定了任務(wù)的優(yōu)先級別,數(shù)值越大對應(yīng)任務(wù)的優(yōu)先級別越高,空閑任務(wù)的優(yōu)先級最低,對應(yīng)的數(shù)值默認(rèn)為0,它能執(zhí)行的前提是CPU中不存在其他更高優(yōu)先級的任務(wù)需要執(zhí)行。除此之外,每當(dāng)創(chuàng)建一個任務(wù)時,系統(tǒng)都會為它分配獨立的任務(wù)堆??臻g和一個任務(wù)控制塊TCB,而FreeRTOS整個內(nèi)存空間的大小用戶可以在系統(tǒng)配置文件中進行相應(yīng)配置[3]。
2.2FreeRTOS任務(wù)調(diào)度策略
FreeRTOS實時操作系統(tǒng)內(nèi)核在工作時可設(shè)置為兩種類型,即可剝奪方式和不可剝奪方式[4]。當(dāng)系統(tǒng)內(nèi)核設(shè)置為可剝奪工作方式時,最高優(yōu)先級的任務(wù)一旦就緒,總能得到CPU的控制權(quán),系統(tǒng)允許優(yōu)先級別高的任務(wù)搶占剝奪優(yōu)先級別低的任務(wù)的CPU使用權(quán)。同時,F(xiàn)reeRTOS允許不同的任務(wù)之間使用相同優(yōu)先級,任務(wù)調(diào)度器可以通過時間片輪詢方式來執(zhí)行優(yōu)先級別相同的任務(wù)。此外,F(xiàn)reeRTOS支持搶占式和協(xié)作式混合任務(wù)調(diào)度策略。從搶占式調(diào)度時序圖(圖2)可以看到,task1、task2、task3和系統(tǒng)空閑任務(wù)idle task,所對應(yīng)的優(yōu)先級分別為5、2、2、0;在t3和t6時刻,任務(wù)task2處于就緒狀態(tài),剝奪空閑任務(wù)idle task對于CPU的使用權(quán),進入運行狀態(tài),在t7時刻,CPU的使用權(quán)則被更高優(yōu)先級的任務(wù)task1剝奪。
圖2 搶占式調(diào)度時序
FreeRTOS支持固定優(yōu)先級任務(wù)調(diào)度,即當(dāng)有兩個任務(wù)處于就緒狀態(tài)時,系統(tǒng)將優(yōu)先執(zhí)行優(yōu)先級別高的,但在某些應(yīng)用場合中系統(tǒng)需改變?nèi)蝿?wù)的優(yōu)先級[5]。如遇到兩個相同優(yōu)先級別的任務(wù)時,系統(tǒng)在固定優(yōu)先級調(diào)度策略中,可以通過采用FIFO(先進先出)的調(diào)度機制,即先獲得CPU執(zhí)行權(quán)的任務(wù)先執(zhí)行,實現(xiàn)CPU時間片輪詢的調(diào)度方式,從而處理相同優(yōu)先級別的任務(wù)[1,6]。如圖2所示,優(yōu)先級相同的任務(wù)task2和task3在t3時刻都處于就緒狀態(tài),由于task2先進就緒鏈表,從而task2先獲得CPU執(zhí)行權(quán),按照時間片輪詢調(diào)度原則執(zhí)行task2與task3。
2.3任務(wù)同步通信
FreeRTOS操作系統(tǒng)中,任務(wù)間的同步通信是通過信號量與互斥量兩種機制來實現(xiàn)的,其中信號量包括計數(shù)信號量、二值信號量和遞歸信號量[7,8]。這兩種任務(wù)同步通信機制都是基于隊列機制來實現(xiàn)的。通過獲取信號量,需執(zhí)行的任務(wù)獲得CPU執(zhí)行權(quán),執(zhí)行完后再通過釋放信號量來讓出CPU使用權(quán)。需要注意的是,通信的信號量必須在使用之前先創(chuàng)建[1,9]。
計數(shù)信號量的作用是事件計數(shù)和資源管理。在事件計數(shù)中,通過獲取和給出信號量,對信號量的計數(shù)值減1或加1,來計數(shù)已發(fā)生的事件數(shù)與已處理的事件數(shù)之間的差值。在資源管理中,計數(shù)值用來統(tǒng)計資源的可用數(shù)目。具體的做法是:在初始化創(chuàng)建時先設(shè)定一個可用資源總數(shù),當(dāng)一個任務(wù)需獲取資源的使用權(quán)時,先獲得信號量同時計數(shù)信號量的值減1;在任務(wù)執(zhí)行完后將給出信號量釋放資源,信號量計數(shù)值加1;當(dāng)系統(tǒng)沒有可用資源時其計數(shù)值為0[1,10]。
二值信號量實質(zhì)就是一個特殊的隊列的宏[1,11]。定義一個二值信號量為深度為1的一個隊列,隊列不滿時即為空,此時信號量的值為0或1,所以稱為二值信號量。二值信號量和互斥量極為相似,兩者不同的地方是互斥量包含了優(yōu)先級繼承機制,而二值信號量并沒有包括。因此,在任務(wù)與任務(wù)、任務(wù)與中斷之間同步運用最好選擇二值信號量;而兩個任務(wù)間相互排斥時更適合運用互斥量[12]。
利用二值信號量實現(xiàn)任務(wù)與中斷同步的時序圖如圖3所示。在t2時刻中斷發(fā)生,執(zhí)行相應(yīng)的中斷服務(wù)函數(shù),在中斷服務(wù)函數(shù)中調(diào)用xSemaphoreGiveFromISR函數(shù)釋放信號量。在FreeRTOS中只有帶ISR結(jié)尾的API函數(shù)才能在中斷處理函數(shù)中被調(diào)用。Handler_Task同步任務(wù)的優(yōu)先級必須比被中斷前執(zhí)行的任務(wù)優(yōu)先級高。中斷服務(wù)例程釋放信號量,同步任務(wù)被喚醒并獲得CPU使用權(quán)。在t3時刻中斷服務(wù)函數(shù)處理完之后,同步任務(wù)隨之執(zhí)行,執(zhí)行完后釋放信號量。同步任務(wù)又進入阻塞狀態(tài),等待下一次中斷的到來。在中斷服務(wù)例程中快速處理少量的操作,大量處理置于同步任務(wù)當(dāng)中完成,如此便完成了中斷與任務(wù)之間的同步通信。
圖3 任務(wù)與中斷同步時序
3.1內(nèi)核源代碼
與大多數(shù)嵌入式實時操作系統(tǒng)一樣,F(xiàn)reeRTOS也針對不同編譯器和不同微處理器為開發(fā)者提供了移植接口的模板。但并非所有型號都有,開發(fā)者可以根據(jù)自己選用的編譯器和微處理器類型選擇相應(yīng)或相近的模板作為參照來進行移植。在此,筆者以ARM7_LPC2129_Kiel_RVDS例程為模板,移植到S3C44b0x處理器的目標(biāo)板和ADSv1.2編譯器上。此外,F(xiàn)reeRTOS在設(shè)計時,大部分內(nèi)核代碼都是由C語言編寫,只有很少一部分與硬件相關(guān)的代碼是用匯編實現(xiàn)[1,12],以便于開發(fā)者移植應(yīng)用。
如圖4所示,F(xiàn)reeRTOS支持的與硬件無關(guān)的內(nèi)核所有源代碼包含在4個.c文件中,分別是queue.c、tasks.c、list.c和croutine.c,其中前3個是FreeRTOS 內(nèi)核接口,croutine.c實現(xiàn)了常規(guī)功能封裝,一般用于在內(nèi)存資源極為有限的系統(tǒng)中,這里不考慮。另一部分與硬件相關(guān)的源代碼,LPC2129例程中包含port.c、portasm.s、portmacro.inc和portmacro.h共4個接口文件,在移植過程中只需對這部分做相應(yīng)修改即可。
圖4 FreeRTOS移植接口
3.2移植接口實現(xiàn)
當(dāng)以匯編代碼來實現(xiàn)操作系統(tǒng)進行任務(wù)切換時,portmacro.h和portmacro.inc這兩個宏文件起到保存和恢復(fù)現(xiàn)場的作用,分別保存寄存器R0~R14的值。相關(guān)程序如下:
MACRO
portSAVE_CONTEXT;保存現(xiàn)場
STMDB SP!,{R0}
STMDB SP,{SP}^
NOP
SUB SP,SP,#4
LDMIA SP!,{R0}
STMDB R0!,{LR}
MOV LR,R0
LDMIA SP!,{R0}
STMDB LR,{R0-LR}^
NOP
SUB LR,LR,#60
MRS R0,SPSR
STMDB LR!,{R0}
LDR R0,=ulCriticalNesting
LDR R0,[R0]
STMDB LR!,{R0}
LDR R0,=pxCurrentTCB
LDR R1,[R0]
STR LR,[R1]
MEND
參考上述代碼可以根據(jù)堆?!昂筮M先出”的原則寫出portRESTORE_CONTEXT恢復(fù)現(xiàn)場部分的代碼,這里不做贅述。
portmacro.h文件中定義了堆棧的增長方向、一些操作系統(tǒng)的數(shù)據(jù)類型及臨界區(qū)管理函數(shù)等與編譯器相關(guān)的宏定義。
portasm.s文件在移植過程中需要根據(jù)不同CPU提供的時鐘和不同的編譯器語法進行修改從而給操作系統(tǒng)提供時鐘滴答、軟中斷等功能。此處,編譯器需修改為ADSv1.2編譯器以識別語法,相關(guān)處理要以不同處理器時鐘為準(zhǔn),這里選用S3C44b0x定時器0為系統(tǒng)提供時鐘嘀嗒,需自行實現(xiàn)如下代碼:
T0IR EQU 0x1e00024
T0MATCHBIT EQU (0x1<<13)
vPreemptiveTick;時鐘中斷0
PRESERVE8
portSAVE_CONTEXT
LDR R0,=vTaskIncrementTick
MOV LR,PC
BX R0
LDR R0,=vTaskSwitchContext
MOV LR,PC
BX R0
MOV R0,#T0MATCHBIT
LDR R1,=T0IR
STR R0,[R1]
portRESTORE_CONTEXT
vPortYieldProcessor;軟中斷
PRESERVE8
ADD LR,LR,#4
portSAVE_CONTEXT
LDR R0,=vTaskSwitchContext
MOV LR,PC
BX R0
portRESTORE_CONTEXT
port.c文件中包含為系統(tǒng)任務(wù)創(chuàng)建堆棧初始化、啟動任務(wù)調(diào)度、時鐘中斷和臨界保護的代碼。另外需自行實現(xiàn)的一部分代碼是,為臨界保護提供的開/關(guān)CPU中斷函數(shù),這兩個函數(shù)是通過對S3C44b0x中CPSR寄存器中斷位寫1或清0,在portasm.s文件中以匯編的形式實現(xiàn)的,具體代碼如下:
EXPORT ARMDisableInt;關(guān)中斷
ARMDisableInt
STMFD sp!,{r0}
MRS r0,cpsr
ORR r0,r0,#0xC0
MSR cpsr_c,r0
MOV pc,lr
EXPORT ARMEnableInt;開中斷
ARMEnableInt
LDMFD sp!,{r0}
MRS r0,cpsr
BIC r0,r0,#0xC0
MSR cpsr_c,r0
MOV pc,lr
4.1任務(wù)調(diào)度實驗測試與分析
根據(jù)任務(wù)的調(diào)度算法原理,系統(tǒng)總是運行進入就緒態(tài)任務(wù)級最高的任務(wù)。為此,首先創(chuàng)建一個主任務(wù),優(yōu)先級為2,在主任務(wù)中再創(chuàng)建3個子任務(wù)分別是燈閃爍任務(wù)Task_LED、RTC系統(tǒng)時鐘顯示任務(wù)Task_Rtc_Disp和流水燈任務(wù)Task_GroupLed,優(yōu)先級分別為5、2、2。主代碼如下:
void Task_Main(void*pvParameters)
{
xTaskCreate(Task_LED,(signed portCHAR*)"Task_LED",configMINIMAL_STACK_SIZE,NULL,
skIDLE_PRIORITY+5,NULL)
xTaskCreate(Task_Rtc_Disp,…);
xTaskCreate(Task_GroupLed,…);
for( ; ; )
{
Uart_Printf("執(zhí)行主任務(wù) ");
vTaskDelay(200);
}
}
系統(tǒng)執(zhí)行流程如圖5所示。
圖5 系統(tǒng)執(zhí)行流程
串口打印的任務(wù)調(diào)度畫面如圖6所示??梢钥闯?,Task_LED任務(wù)的優(yōu)先級最高為5,CPU首先執(zhí)行Task_LED燈閃爍任務(wù),其他任務(wù)優(yōu)先級相同,以時間片輪換調(diào)度執(zhí)行,輸出結(jié)果與任務(wù)調(diào)度策略分析的任務(wù)執(zhí)行策略吻合。
圖6 串口打印任務(wù)調(diào)度畫面
4.2任務(wù)同步通信測試與分析
以二值信號量為例,進一步說明FreeRTOS操作系統(tǒng)中的任務(wù)間進行同步通信的過程。在二值信號量被使用之前首先需要被創(chuàng)建,創(chuàng)建一個二值信號量的代碼如下:
static xSemaphoreHandle xSemaphore=NULL;
vSemaphoreCreateBinary(xSemaphore);
當(dāng)二值信號量被創(chuàng)建成功后,根據(jù)其宏定義會釋放出信號量。由于主任務(wù)的優(yōu)先級最高,因此主任務(wù)通過 xSemaphoreTake函數(shù)首先獲得信號量,獲得CPU的執(zhí)行權(quán),最先執(zhí)行Task_Main任務(wù),代碼如下:
xTaskCreate(Task_Main,(signed portCHAR*)"Task_Main",configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY+6,NULL);
void Task_Main(void*pvParameters)
{
xTaskCreate(Task_LED,…);
xTaskCreate(Task_Rtc_Disp,…);
xTaskCreate(Task_GroupLed,…);
for( ; ; )
{
if(xSemaphoreTake(xSemaphore,(portTickType)0)==pdTRUE){
Uart_Printf("執(zhí)行主任務(wù) ");
xSemaphoreGive(xSemaphore);
}
vTaskDelay(400);
}
}
通過PC串口終端打印出來的任務(wù)調(diào)度執(zhí)行情況畫面如圖7所示??梢钥闯觯盘柫縿?chuàng)建完成后發(fā)出并由Task_Main任務(wù)最先獲取,當(dāng)執(zhí)行完Task_Main任務(wù)后,主任務(wù)調(diào)用xSemaphoreGive函數(shù),隨后讓出CPU使用權(quán),之后調(diào)用延遲函數(shù)vTaskDelay使主任務(wù)進入阻塞態(tài)。燈閃爍任務(wù)通過xSemaphoreTake函數(shù)獲得信號量,獲得CPU執(zhí)行權(quán),并開始執(zhí)行,依此類推??梢钥闯觯總€任務(wù)之間同步執(zhí)行策略與任務(wù)同步執(zhí)行策略的分析相符。
圖7 任務(wù)調(diào)度執(zhí)行情況畫面
通過分析FreeRTOS實時操作系統(tǒng)內(nèi)核,操作系統(tǒng)完成了從ARM7_LPC2129芯片到ARM7_S3C44b0x芯片、Kiel_RVDS編譯器到ADSv1.2編譯器的移植,并通過任務(wù)調(diào)度和任務(wù)同步通信實驗測試證明,F(xiàn)reeRTOS具有內(nèi)核小、移植簡單及功能完善等特點,為嵌入式系統(tǒng)的開發(fā)與應(yīng)用提供了一定參考。雖然FreeRTOS在我國仍處于初步應(yīng)用階段,但憑借其開源、內(nèi)核小、開發(fā)周期短及支持較多處理器架構(gòu)和多種集成開發(fā)環(huán)境等優(yōu)勢,在我國將會成為嵌入式開發(fā)者較好的選擇。
[1] 余曉光.基于實時操作系統(tǒng)FreeRTOS的Lwip協(xié)議的移植研究[D].昆明:昆明理工大學(xué),2013.
[2] 王錚,靳世久,李健,等.嵌入式實時操作系統(tǒng)C/OS-II在管道泄漏檢測中的應(yīng)用[J].化工自動化及儀表,2006,33(5):55~57.
[3] 黃義仿,朱曉然,趙榮珍,等.基于小波分析和矩不變量的轉(zhuǎn)子故障量化特征提取研究[J].化工機械,2007,34(6):309~312.
[4] 李志丹,姜印平,李亞南.基于S3C44B0X和SL811HS的USB主/從機模塊設(shè)計[J].化工自動化及儀表,2006,33(4):37~39.
[5] Sakairi T,Palachi E,Cohen C,et al.Model Based Control System Design Using SysML,Simulink,and Computer Algebra System[J].Journal of Control Science and Engineering,2013,2013:1~14.
[6] Bauer A,Leucher M,Schallhart C.Runtime Verification for LTL and TLTL[J].ACM Transactions on Software Engineering and Methodology,2011,20(4):14.
[7] 江杰,趙鳳鳴,陳洪翰,等.Ethernet Powerlink調(diào)度機制與實時通信剖析[J].自動化儀表,2013,34(2):84~88.
[8] 孫偉,陳楊,張明偉,等.基于ARM CM3和RTOS的礦用電磁調(diào)速電機控制器軟件設(shè)計[J].煤礦機械,2014,35(9):236~238.
[9] 甘勤操,陳西曲.基于V4L2的嵌入式視頻監(jiān)控系統(tǒng)的研究[J].武漢輕工大學(xué)學(xué)報,2014,33(1):61~64.
[10] 梁艷.基于OpenCV的ARM嵌入式網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)[J].微型機與應(yīng)用,2013,32(9):29~31.
[11] 段永顥,陳睿.基于啟發(fā)式的靜態(tài)中斷數(shù)據(jù)競爭檢測方法[J].計算機工程與設(shè)計,2013,34(1):140~145.
[12] Mu Y M,Wang R,Zhang Z H,et al.Automatic Test Method Research on the Word Part of Document Format Translator[J]. Chinese Journal of Clectronics,2013,22(1):55~60.
ExperimentalResearchonTransplantofFreeRTOS
XIA Xin, ZHANG Guo, WANG Jian-ping, YANG Xiao-hong
(FacultyofInformationEngineeringandAutomation,KunmingUniversityofScienceandTechnology,Kunming650500,China)
The FreeRTOS’ working principle, kernel composition and task management were analyzed, including FreeRTOS’ cross-platform and cross-complier transplant on S3C44b0x platform. The experiment on synchronous communication between fixed priority scheduling and binary semaphore was implemented to verify FreeRTOS transplant’s correctness and experimental design’s reasonability.
FreeRTOS, transplant, S3C44b0x, synchronization communication between tasks, task scheduling
2015-11-13
國家自然科學(xué)基金項目(61364008);云南省應(yīng)用基礎(chǔ)研究重點項目(2014FA029);云南省教育廳重點基金項目(2013Z127)
TH89
A
1000-3932(2016)07-0720-06