?

實時操作系統FreeRTOS移植的實驗研究

2016-11-22 06:54王劍平楊曉洪
化工自動化及儀表 2016年7期
關鍵詞:編譯器二值任務調度

夏 鑫 張 果 王劍平 楊曉洪

(昆明理工大學信息工程與自動化學院,昆明 650500)

實時操作系統FreeRTOS移植的實驗研究

夏 鑫 張 果 王劍平 楊曉洪

(昆明理工大學信息工程與自動化學院,昆明 650500)

分析了實時操作系統FreeRTOS的原理、內核組成與任務管理機制。完成FreeRTOS實時操作系統在S3C44b0x硬件平臺上跨平臺、跨編譯器的移植。同時設計了固定優先級調度與二值信號量任務間的同步通信實驗,驗證了FreeRTOS操作系統移植的正確性和實驗設計的合理性。

FreeRTOS 移植 S3C44b0x 任務同步通信 任務調度

隨著計算機技術和微電子技術的推進,嵌入式技術這門新興學科產生并且迅速發展,因此傳統的單機、單任務模式已經無法滿足現代嵌入式設備在功能上的需求,在這種情況下,引入操作系統是嵌入式系統發展的必然趨勢。

將嵌入式設備引入操作系統,對于整個系統的硬件和軟件資源,操作系統都可以合理有效地管理,這對整個系統的性能有了很大程度的提升。而當執行一個復雜的應用程序時,嵌入式操作系統可將它分解為若干個實現特定獨立功能的子任務模塊,模塊之間則通過任務通信機制、任務管理來實現一個完整的功能,這種“自下而上”的結構化設計同時也便于系統開發。

FreeRTOS(Free Real Time Operating System)作為一個輕量級嵌入式實時操作系統,憑借其開源和完全免費的優勢,滿足了大多數中小型嵌入式系統對RTOS的需求,得到了越來越廣泛地應用。FreeRTOS擁有源代碼公開、可移植、可裁剪、調度策略靈活及輕量級等特點,適用于絕大多數處理器,在國外業界倍受開發者青睞。在此,筆者對實時操作系統FreeRTOS在S3C44b0x上的移植進行了分析研究,并設計相關實驗進行驗證,最后指出FreeRTOS操作系統的優勢與不足。

1 FreeRTOS內核分析①

FreeRTOS內核管理(圖1)包括任務管理、時間管理、內存管理和通信管理4部分[1]。

圖1 FreeRTOS內核管理結構

FreeRTOS通過任務控制塊對任務施行管理;時間管理包括時鐘的產生管理和任務延時管理;內存管理中,FreeRTOS為用戶提供了4種不同的內存分配管理方案,用戶可以根據需求選擇合適的一種;此外,內核中還提供任務通信管理機制,分為消息管理和任務同步管理。其中同步機制又包括信號量和互斥量,FreeRTOS沒有消息郵箱同步機制,所有的同步機制都是基于消息隊列來實現的[2]。

2 FreeRTOS任務管理

2.1FreeRTOS任務模型

FreeRTOS對任務數量沒有限制。相較于其他實時操作系統,FreeRTOS有一個突出的特點,即在任務的優先級管理中允許不同任務之間可以設置相同的優先級。在FreeRTOS中任務可設置0~255個不同的優先級,設置的數值決定了任務的優先級別,數值越大對應任務的優先級別越高,空閑任務的優先級最低,對應的數值默認為0,它能執行的前提是CPU中不存在其他更高優先級的任務需要執行。除此之外,每當創建一個任務時,系統都會為它分配獨立的任務堆??臻g和一個任務控制塊TCB,而FreeRTOS整個內存空間的大小用戶可以在系統配置文件中進行相應配置[3]。

2.2FreeRTOS任務調度策略

FreeRTOS實時操作系統內核在工作時可設置為兩種類型,即可剝奪方式和不可剝奪方式[4]。當系統內核設置為可剝奪工作方式時,最高優先級的任務一旦就緒,總能得到CPU的控制權,系統允許優先級別高的任務搶占剝奪優先級別低的任務的CPU使用權。同時,FreeRTOS允許不同的任務之間使用相同優先級,任務調度器可以通過時間片輪詢方式來執行優先級別相同的任務。此外,FreeRTOS支持搶占式和協作式混合任務調度策略。從搶占式調度時序圖(圖2)可以看到,task1、task2、task3和系統空閑任務idle task,所對應的優先級分別為5、2、2、0;在t3和t6時刻,任務task2處于就緒狀態,剝奪空閑任務idle task對于CPU的使用權,進入運行狀態,在t7時刻,CPU的使用權則被更高優先級的任務task1剝奪。

圖2 搶占式調度時序

FreeRTOS支持固定優先級任務調度,即當有兩個任務處于就緒狀態時,系統將優先執行優先級別高的,但在某些應用場合中系統需改變任務的優先級[5]。如遇到兩個相同優先級別的任務時,系統在固定優先級調度策略中,可以通過采用FIFO(先進先出)的調度機制,即先獲得CPU執行權的任務先執行,實現CPU時間片輪詢的調度方式,從而處理相同優先級別的任務[1,6]。如圖2所示,優先級相同的任務task2和task3在t3時刻都處于就緒狀態,由于task2先進就緒鏈表,從而task2先獲得CPU執行權,按照時間片輪詢調度原則執行task2與task3。

2.3任務同步通信

FreeRTOS操作系統中,任務間的同步通信是通過信號量與互斥量兩種機制來實現的,其中信號量包括計數信號量、二值信號量和遞歸信號量[7,8]。這兩種任務同步通信機制都是基于隊列機制來實現的。通過獲取信號量,需執行的任務獲得CPU執行權,執行完后再通過釋放信號量來讓出CPU使用權。需要注意的是,通信的信號量必須在使用之前先創建[1,9]。

計數信號量的作用是事件計數和資源管理。在事件計數中,通過獲取和給出信號量,對信號量的計數值減1或加1,來計數已發生的事件數與已處理的事件數之間的差值。在資源管理中,計數值用來統計資源的可用數目。具體的做法是:在初始化創建時先設定一個可用資源總數,當一個任務需獲取資源的使用權時,先獲得信號量同時計數信號量的值減1;在任務執行完后將給出信號量釋放資源,信號量計數值加1;當系統沒有可用資源時其計數值為0[1,10]。

二值信號量實質就是一個特殊的隊列的宏[1,11]。定義一個二值信號量為深度為1的一個隊列,隊列不滿時即為空,此時信號量的值為0或1,所以稱為二值信號量。二值信號量和互斥量極為相似,兩者不同的地方是互斥量包含了優先級繼承機制,而二值信號量并沒有包括。因此,在任務與任務、任務與中斷之間同步運用最好選擇二值信號量;而兩個任務間相互排斥時更適合運用互斥量[12]。

利用二值信號量實現任務與中斷同步的時序圖如圖3所示。在t2時刻中斷發生,執行相應的中斷服務函數,在中斷服務函數中調用xSemaphoreGiveFromISR函數釋放信號量。在FreeRTOS中只有帶ISR結尾的API函數才能在中斷處理函數中被調用。Handler_Task同步任務的優先級必須比被中斷前執行的任務優先級高。中斷服務例程釋放信號量,同步任務被喚醒并獲得CPU使用權。在t3時刻中斷服務函數處理完之后,同步任務隨之執行,執行完后釋放信號量。同步任務又進入阻塞狀態,等待下一次中斷的到來。在中斷服務例程中快速處理少量的操作,大量處理置于同步任務當中完成,如此便完成了中斷與任務之間的同步通信。

圖3 任務與中斷同步時序

3 FreeRTOS的移植

3.1內核源代碼

與大多數嵌入式實時操作系統一樣,FreeRTOS也針對不同編譯器和不同微處理器為開發者提供了移植接口的模板。但并非所有型號都有,開發者可以根據自己選用的編譯器和微處理器類型選擇相應或相近的模板作為參照來進行移植。在此,筆者以ARM7_LPC2129_Kiel_RVDS例程為模板,移植到S3C44b0x處理器的目標板和ADSv1.2編譯器上。此外,FreeRTOS在設計時,大部分內核代碼都是由C語言編寫,只有很少一部分與硬件相關的代碼是用匯編實現[1,12],以便于開發者移植應用。

如圖4所示,FreeRTOS支持的與硬件無關的內核所有源代碼包含在4個.c文件中,分別是queue.c、tasks.c、list.c和croutine.c,其中前3個是FreeRTOS 內核接口,croutine.c實現了常規功能封裝,一般用于在內存資源極為有限的系統中,這里不考慮。另一部分與硬件相關的源代碼,LPC2129例程中包含port.c、portasm.s、portmacro.inc和portmacro.h共4個接口文件,在移植過程中只需對這部分做相應修改即可。

圖4 FreeRTOS移植接口

3.2移植接口實現

當以匯編代碼來實現操作系統進行任務切換時,portmacro.h和portmacro.inc這兩個宏文件起到保存和恢復現場的作用,分別保存寄存器R0~R14的值。相關程序如下:

MACRO

portSAVE_CONTEXT;保存現場

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

參考上述代碼可以根據堆?!昂筮M先出”的原則寫出portRESTORE_CONTEXT恢復現場部分的代碼,這里不做贅述。

portmacro.h文件中定義了堆棧的增長方向、一些操作系統的數據類型及臨界區管理函數等與編譯器相關的宏定義。

portasm.s文件在移植過程中需要根據不同CPU提供的時鐘和不同的編譯器語法進行修改從而給操作系統提供時鐘滴答、軟中斷等功能。此處,編譯器需修改為ADSv1.2編譯器以識別語法,相關處理要以不同處理器時鐘為準,這里選用S3C44b0x定時器0為系統提供時鐘嘀嗒,需自行實現如下代碼:

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文件中包含為系統任務創建堆棧初始化、啟動任務調度、時鐘中斷和臨界保護的代碼。另外需自行實現的一部分代碼是,為臨界保護提供的開/關CPU中斷函數,這兩個函數是通過對S3C44b0x中CPSR寄存器中斷位寫1或清0,在portasm.s文件中以匯編的形式實現的,具體代碼如下:

EXPORT ARMDisableInt;關中斷

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 實驗測試

4.1任務調度實驗測試與分析

根據任務的調度算法原理,系統總是運行進入就緒態任務級最高的任務。為此,首先創建一個主任務,優先級為2,在主任務中再創建3個子任務分別是燈閃爍任務Task_LED、RTC系統時鐘顯示任務Task_Rtc_Disp和流水燈任務Task_GroupLed,優先級分別為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("執行主任務 ");

vTaskDelay(200);

}

}

系統執行流程如圖5所示。

圖5 系統執行流程

串口打印的任務調度畫面如圖6所示??梢钥闯?,Task_LED任務的優先級最高為5,CPU首先執行Task_LED燈閃爍任務,其他任務優先級相同,以時間片輪換調度執行,輸出結果與任務調度策略分析的任務執行策略吻合。

圖6 串口打印任務調度畫面

4.2任務同步通信測試與分析

以二值信號量為例,進一步說明FreeRTOS操作系統中的任務間進行同步通信的過程。在二值信號量被使用之前首先需要被創建,創建一個二值信號量的代碼如下:

static xSemaphoreHandle xSemaphore=NULL;

vSemaphoreCreateBinary(xSemaphore);

當二值信號量被創建成功后,根據其宏定義會釋放出信號量。由于主任務的優先級最高,因此主任務通過 xSemaphoreTake函數首先獲得信號量,獲得CPU的執行權,最先執行Task_Main任務,代碼如下:

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("執行主任務 ");

xSemaphoreGive(xSemaphore);

}

vTaskDelay(400);

}

}

通過PC串口終端打印出來的任務調度執行情況畫面如圖7所示??梢钥闯?,信號量創建完成后發出并由Task_Main任務最先獲取,當執行完Task_Main任務后,主任務調用xSemaphoreGive函數,隨后讓出CPU使用權,之后調用延遲函數vTaskDelay使主任務進入阻塞態。燈閃爍任務通過xSemaphoreTake函數獲得信號量,獲得CPU執行權,并開始執行,依此類推??梢钥闯?,每個任務之間同步執行策略與任務同步執行策略的分析相符。

圖7 任務調度執行情況畫面

5 結束語

通過分析FreeRTOS實時操作系統內核,操作系統完成了從ARM7_LPC2129芯片到ARM7_S3C44b0x芯片、Kiel_RVDS編譯器到ADSv1.2編譯器的移植,并通過任務調度和任務同步通信實驗測試證明,FreeRTOS具有內核小、移植簡單及功能完善等特點,為嵌入式系統的開發與應用提供了一定參考。雖然FreeRTOS在我國仍處于初步應用階段,但憑借其開源、內核小、開發周期短及支持較多處理器架構和多種集成開發環境等優勢,在我國將會成為嵌入式開發者較好的選擇。

[1] 余曉光.基于實時操作系統FreeRTOS的Lwip協議的移植研究[D].昆明:昆明理工大學,2013.

[2] 王錚,靳世久,李健,等.嵌入式實時操作系統C/OS-II在管道泄漏檢測中的應用[J].化工自動化及儀表,2006,33(5):55~57.

[3] 黃義仿,朱曉然,趙榮珍,等.基于小波分析和矩不變量的轉子故障量化特征提取研究[J].化工機械,2007,34(6):309~312.

[4] 李志丹,姜印平,李亞南.基于S3C44B0X和SL811HS的USB主/從機模塊設計[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調度機制與實時通信剖析[J].自動化儀表,2013,34(2):84~88.

[8] 孫偉,陳楊,張明偉,等.基于ARM CM3和RTOS的礦用電磁調速電機控制器軟件設計[J].煤礦機械,2014,35(9):236~238.

[9] 甘勤操,陳西曲.基于V4L2的嵌入式視頻監控系統的研究[J].武漢輕工大學學報,2014,33(1):61~64.

[10] 梁艷.基于OpenCV的ARM嵌入式網絡視頻監控系統[J].微型機與應用,2013,32(9):29~31.

[11] 段永顥,陳睿.基于啟發式的靜態中斷數據競爭檢測方法[J].計算機工程與設計,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

國家自然科學基金項目(61364008);云南省應用基礎研究重點項目(2014FA029);云南省教育廳重點基金項目(2013Z127)

TH89

A

1000-3932(2016)07-0720-06

猜你喜歡
編譯器二值任務調度
基于PEPA的云計算任務調度性能分析
基于相異編譯器的安全計算機平臺交叉編譯環境設計
運行速度大突破華為《方舟編譯器》詳解
基于改進NSGA-Ⅱ算法的協同制造任務調度研究
面向網絡邊緣應用的新一代神經網絡
基于二值圖像數字水印算法研究
基于稀疏表示的二值圖像超分辨率重建算法
基于曲率局部二值模式的深度圖像手勢特征提取
基于小生境遺傳算法的相控陣雷達任務調度
云計算環境中任務調度策略
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合