FreeRTOS嵌入式實(shí)時(shí)操作系統開(kāi)發(fā)介紹
作為一個(gè)輕量級的操作系統,FreeRTOS提供的功能包括:任務(wù)管理、時(shí)間管理、信號量、消息隊列、內存管理、記錄功能等,可基本滿(mǎn)足較小系統的需要。FreeRTOS內核支持優(yōu)先級調度算法,每個(gè)任務(wù)可根據重要程度的不同被賦予一定的優(yōu)先級,CPU總是讓處于就緒態(tài)的、優(yōu)先級最高的任務(wù)先運行。FreeRT0S內核同時(shí)支持輪換調度算法,系統允許不同的任務(wù)使用相同的優(yōu)先級,在沒(méi)有更高優(yōu)先級任務(wù)就緒的情況下,同一優(yōu)先級的任務(wù)共享CPU的使用時(shí)間。
FreeRTOS的內核可根據用戶(hù)需要設置為可剝奪型內核或不可剝奪型內核。當FreeRTOS被設置為可剝奪型內核時(shí),處于就緒態(tài)的高優(yōu)先級任務(wù)能剝奪低優(yōu)先級任務(wù)的CPU使用權,這樣可保證系統滿(mǎn)足實(shí)時(shí)性的要求;當FreeRTOS被設置為不可剝奪型內核時(shí),處于就緒態(tài)的高優(yōu)先級任務(wù)只有等當前運行任務(wù)主動(dòng)釋放CPU的使用權后才能獲得運行,這樣可提高CPU的運行效率。
2 FreeRTOS操作系統的原理與實(shí)現
2. 1任務(wù)調度機制的實(shí)現
任務(wù)調度機制是嵌入式實(shí)時(shí)操作系統的一個(gè)重要概念,也是其核心技術(shù)。對于可剝奪型內核,優(yōu)先級高的任務(wù)一旦就緒就能剝奪優(yōu)先級較低任務(wù)的CPU使用權,提高了系統的實(shí)時(shí)響應能力。不同于μC/OS-II,FreeRTOS對系統任務(wù)的數量沒(méi)有限制,既支持優(yōu)先級調度算法也支持輪換調度算法,因此FreeRTOS采用雙向鏈表而不是采用查任務(wù)就緒表的方法來(lái)進(jìn)行任務(wù)調度。系統定義的鏈表和鏈表節點(diǎn)數據結構如下所示:

FreeRTOS定義就緒任務(wù)鏈表數組為xList pxReady—TasksLists[portMAX_PRIORITIES]。其中portMAX_PRIORITIES為系統定義的最大優(yōu)先級。若想使優(yōu)先級為n的任務(wù)進(jìn)入就緒態(tài),需要把此任務(wù)對應的TCB中的結點(diǎn)xGenericListltem插入到鏈表pxReadyTasksLiStS[n]中,還要把xGenericListItem中的pvContainer指向pxReadyTasksLists[n]方可實(shí)現。
當進(jìn)行任務(wù)調度時(shí),調度算法首先實(shí)現優(yōu)先級調度。系統按照優(yōu)先級從高到低的順序從就緒任務(wù)鏈表數組中尋找usNumberOfItems第一個(gè)不為0的優(yōu)先級,此優(yōu)先級即為當前最高就緒優(yōu)先級,據此實(shí)現優(yōu)先級調度。若此優(yōu)先級下只有一個(gè)就緒任務(wù),則此就緒任務(wù)進(jìn)入運行態(tài);若此優(yōu)先級下有多個(gè)就緒任務(wù),則需采用輪換調度算法實(shí)現多任務(wù)輪流執行。
若在優(yōu)先級n下執行輪換調度算法,系統先通過(guò)執行(pxReadyTasksLists[n])→pxIndex=( pxReadyTasks-Lists[n ]) → pxlndex→pxNext語(yǔ)句得到當前結點(diǎn)所指向的下一個(gè)結點(diǎn),再通過(guò)此結點(diǎn)的pvOwner指針得到對應的任務(wù)控制塊,最后使此任務(wù)控制塊對應的任務(wù)進(jìn)入運行態(tài)。由此可見(jiàn),在FreeRTOS中,相同優(yōu)先級任務(wù)之間的切換時(shí)間為一個(gè)時(shí)鐘節拍周期。
以圖1為例,設系統的最大任務(wù)數為pottMAX_PRIORITIES,在某一時(shí)刻進(jìn)行任務(wù)調度時(shí),得到pxReadyTasksLists[ i].usNumberOfItems=O(i=2...portMAX_PRIORITIES)以及pxReadyTasksLists。usNumberOfItems=3。由此內核可知當前最高就緒優(yōu)先級為l,且此優(yōu)先級下已有三個(gè)任務(wù)已進(jìn)入就緒態(tài).由于最高就緒優(yōu)先級下有多個(gè)就緒任務(wù),系統需執行輪換調度算法實(shí)現任務(wù)切換;通過(guò)指針pxlndex可知任務(wù)l(shuí)為當前任務(wù),而任務(wù)l(shuí)的pxNext結點(diǎn)指向任務(wù)2,因此系統把pxIndex指向任務(wù)2并執行任務(wù)2來(lái)實(shí)現任務(wù)調度。當下一個(gè)時(shí)鐘節拍到來(lái)時(shí),若最高就緒優(yōu)先級仍為1,由圖可見(jiàn),系統會(huì )把pxIndex指向任務(wù)3并執行任務(wù)3。

評論