在嵌入式領域中,嵌入式實時操做系統正獲得愈來愈普遍的應用。採用嵌入式實時操做系統(RTOS)能夠更合理、更有效地利用CPU的資源,簡化應用軟件的設計,縮短系統開發時間,更好地保證系統的實時性和可靠性。算法
1簡介
FreeRTOS是一個迷你操做系統內核的小型嵌入式系統。做爲一個輕量級的操做系統,功能包括:任務管理、時間管理、信號量、消息隊列、內存管理、記錄功能等,可基本知足較小系統的須要。
[1]
因爲RTOS需佔用必定的系統資源(尤爲是RAM資源),只有μC/OS-II、embOS、salvo、FreeRTOS等少數實時操做系統能在小RAM單片機上運行。相對μC/OS-II、embOS等商業操做系統,
FreeRTOS操做系統是徹底免費的操做系統,具備源碼公開、可移植、可裁減、調度策略靈活的特色,能夠方便地移植到各類單片機上運行,其最新版本爲7.6.0版。
2功能和特色
混合配置選項
提供一個高層次的信任代碼的完整性
目的是小,簡單易用
以開發C,很是便攜代碼結構
支持兩項任務和共同例程
強大的執行跟蹤功能
堆棧溢出檢測
沒有軟件任務的限制數量
沒有軟件優先事項的限制數量
沒有施加的限制,優先轉讓,多個任務能夠分配相同的優先權
隊列,二進制信號量,計數信號燈和遞歸通訊和同步的任務
Mutexes優先繼承權
免費開發工具
免費嵌入式軟件的源代碼
從一個標準的Windows主機交叉發展。
[1]
3原理與實現
任務調度機制是嵌入式實時操做系統的一個重要概念,也是其核心技術。對於可剝奪型內核,優先級高的任務一旦就緒就能剝奪優先級較低任務的CPU使用權,提升了系統的實時響應能力。
不一樣於μC/OS-II,FreeRTOS對系統任務的數量沒有限制,既支持優先級調度算法也支持輪換調度算法,所以FreeRTOS採用雙向鏈表而不是採用查任務就緒表的方法來進行任務調度。
系統定義的鏈表和鏈表節點數據結構以下所示:
//定義鏈表結構
typedef struct xLIST{
unsigned portSHORPT usNumberOfItems; //usNumberOfItems爲鏈表的長度,爲0表示鏈表爲空
volatile xListItem * pxHead; //pxHead爲鏈表的頭指針
volatile xListItem * pxIndex; //pxIndex指向鏈表當前結點的指針
volatile xListItem xListEnd; //xListEnd爲鏈表尾結點
}xList;
//定義鏈表結點的結構
struct xLIST_ITEM {
port Tick type; //port Tick Type爲時針節拍數據類型,
xItem Value; //xItem Value的值用於實現時間管理,可根據須要選擇爲16位或32位
volatile struct xLIST_ITEM * pxNext; //指向鏈表的前一個結點
void * pvOwner; //指向此鏈表結點所在的任務控制塊
void * pvContainer; //指向此鏈表結點所在的鏈表
};
FreeRTOS中每一個任務對應於一個任務控制塊(TCB),其定義以下所示:
typedef struct tskTaskControlBlock {
portSTACK_TYPE * pxTopOfStack; //指向任務堆棧結束處
portSTACK_TYPE * pxStack; //指向任務堆棧起始處
unsigned portSHORT usStackDepth; //定義堆棧深度
signed portCHAR pcTaskName[tskMAX_TASK_NAME_LEN]; //任務名稱
unsigned portCHAR ucPriority; //任務優先級
xListItem xGenericListItem; //用於把TCB插入就緒鏈表或等待鏈表
xListItem xEventListItem; //用於把TCB插入事件鏈表(如消息隊列)
unsigned portCHAR ucTCBNumber; //用於記錄功能
}tskTCB;
FreeRTOS定義就緒任務鏈表數組爲
xList pxReady—TasksLists[portMAX_PRIORITIES]。
其中portMAX_PRIORITIES爲系統定義的最大優先級。若想使優先級爲n的任務進入就緒態,須要把此任務對應的TCB中的結點xGenericListltem插入到鏈表pxReadyTasksLiStS[n]中,還要把xGenericListItem中的pvContainer指向pxReadyTasksLists[n]方可實現。
當進行任務調度時,調度算法首先實現優先級調度。系統按照優先級從高到低的順序從就緒任務鏈表數組中尋找usNumberOfItems第一個不爲0的優先級,此優先級即爲當前最高就緒優先級,
據此實現優先級調度。若此優先級下只有一個就緒任務,則此就緒任務進入運行態;若此優先級下有多個就緒任務,則需採用輪換調度算法實現多任務輪流執行。
若在優先級n下執行輪換調度算法,系統先經過執行
(pxReadyTasksLists[n])→pxIndex=(pxReadyTasks-Lists[n])→pxlndex→pxNext語句獲得當前結點所指向的下一個結點,
再經過此結點的pvOwner指針獲得對應的任務控制塊,最後使此任務控制塊對應的任務進入運行態。
因而可知,在FreeRTOS中,相同優先級任務之間的切換時間爲一個時鐘節拍週期。
以圖l爲例,設系統的最大任務數爲pottMAX_PRIORITIES,在某一時刻進行任務調度時,獲得pxReadyTasksLists.usNumberOfItems=O(i=2...portMAX_PRIORITIES)以及pxReadyTasksLists[1]。usNumberOfItems=3。由此內核可知當前最高就緒優先級爲l,且此優先級下已有三個任務已進入就緒態.因爲最高就緒優先級下有多個就緒任務,系統需執行輪換調度
算法實現任務切換;經過指針pxlndex可知任務l爲當前任務,而任務l的pxNext結點指向任務2,所以系統把pxIndex指向任務2並執行任務2來實現任務調度。當下一個時鐘節拍到來時,若最高就緒優先級仍爲1,由圖l可見,系統會把pxIndex指向任務3並執行任務3。
爲了加快任務調度的速度,FrecRTOS經過變量ucTopReadyPriotity跟蹤當前就緒的最高優先級。當把一個任務加入就緒鏈表時,若是此任務的優先級高於ucTopReadyPriority,則把這個任務的優先級賦予ucTopReadyPriority。這樣當進行優先級調度時,調度算法不是從portMAX_PRIORITIES而是從ucTopReady-Priority開始搜索。這就加快了搜索的速度,同時縮短了內核關斷時間。
2.2任務管理的實現 實現多個任務的有效管理是操做系統的主要功能。FreeRTOS下可實現建立任務、刪除任務、掛起任務、恢復任務、設定任務優先級、得到任務相關信息等功能。
下面主要討論FreeRTOS下任務建立和任務刪除的實現。當調用sTaskCreate()函數建立一個新的任務時,FreeRTOS首先爲新任務分配所需的內存。若內存分配成功,則初始化任務控制塊的任務名稱、堆棧深度和任務優先級,而後根據堆棧的增加方向初始化任務控制塊的堆棧。接着,FreeRTOS把當前建立的任務加入到就緒任務鏈表。若當前此任務的優先級爲最高,則把此優先級賦值給變量ucTopReadyPriorlty(其做用見2.1節)。若任務調度程序已經運行且當前建立的任務優先級爲最高,則進行任務切換.
不一樣於μC/OS—II,FreeRTOS下任務刪除分兩步進行。當用戶調用vTaskDelete()函數後,
執行任務刪除的第一步:FreeRTOS先把要刪除的任務從就緒任務鏈表和事件等待鏈表中刪除,而後把此任務添加到任務刪除鏈表,若刪除的任務是當前運行任務,系統就執行任務調度函數,至此完成任務刪除的第一步。
當系統空閒任務即prvldleTask()函數運行時,若發現任務刪除鏈表中有等待刪除的任務,則進行任務刪除的第二步,即釋放該任務佔用的內存空間,並把該任務從任務刪除鏈表中刪除,這樣才完全刪除了這個任務。值得注意的是,在FreeRTOS中,當系統被配置爲不可剝奪內核時,空閒任務還有實現各個任務切換的功能。
經過比較μC/OS-II和FreeRTOS的具體代碼發現,採用兩步刪除的策略有利於減小內核關斷時間,減小任務刪除函數的執行時間,尤爲是當刪除多個任務的時候。
2.3時間管理的實現 FreeRTOS提供的典型時間管理函數是vTaskDelay(),調用此函數能夠實現將任務延時一段特定時間的功能。
在FreeRT0S中,若一個任務要延時xTicksToDelay個時鐘節拍,系統內核會把當前系統已運行的時鐘節拍總數(定義爲xTickCount,32位長度)加上xTicksToDelay獲得任務下次喚醒時的時鐘節拍數xTimeToWake。而後,內核把此任務的任務控制塊從就緒鏈表中刪除,把xTimeToWake做爲結點值賦予任務的xItemValue,再根據xTimeToWake的值把任務控制塊按照順序插入不一樣的鏈表。
若xTimeToWake>xTickCount,即計算中沒有出現溢出,內核把任務控制塊插入到pxDelayedTaskList鏈表;若xTimeToWake 每發生一個時鐘節拍,內核就會把當前的xTick-Count加1。若xTickCount的結果爲0,即發生溢出,內核會把pxOverflowDelayedTaskList做爲當前鏈表;不然,內核把pxDelaycdTaskList做爲當前鏈表。內核依次比較xTickCotlrtt和鏈表各個結點的xTimcToWake。若xTick-Count等於或大於xTimeToWake,說明延時時間已到,應該把任務從等待鏈表中刪除,加入就緒鏈表。
因而可知,不一樣於μC/OS—II,FreeRTOS採用「加」的方式實現時間管理。其優勢是時間節拍函數的執行時間與任務數量基本無關,而μC/OS—II的OSTimcTick()的執行時間正比於應用程序中創建的任務數。所以當任務較多時,FreeRTOS採用的時間管理方式能有效加快時鐘節拍中斷程序的執行速度。
2.4內存分配策略 每當任務、隊列和信號量建立的時候,FreeRTOS要求分配必定的RAM。雖然採用malloc()和free()函數能夠實現申請和釋放內存的功能,但這兩個函數存在如下缺點:並非在全部的嵌入式系統中均可用,要佔用不定的程序空間,可重人性欠缺以及執行時間具備不可肯定性。爲此,除了可採用malloc()和free()函數外,FreeRTOS還提供了另外兩種內存分配的策略,用戶能夠根據實際須要選擇不一樣的內存分配策略。
第1種方法是,按照需求內存的大小簡單地把一大塊內存分割爲若干小塊,每一個小塊的大小對應於所需求內存的大小。這樣作的好處是比較簡單,執行時間可嚴格肯定,適用於任務和隊列所有建立完畢後再進行內核調度的系統;這樣作的缺點是,因爲內存不能有效釋放,系統運行時應用程序並不能實現刪除任務或隊列。
第2種方法是,採用鏈表分配內存,可實現動態的建立、刪除任務或隊列。系統根據空閒內存塊的大小按從小到大的順序組織空閒內存鏈表。當應用程序申請一塊內存時,系統根據申請內存的大小按順序搜索空閒內存鏈表,找到知足申請內存要求的最小空閒內存塊。爲了提升內存的使用效率,在空閒內存塊比申請內存大的狀況下,系統會把此空閒內存塊一分爲二。一塊用於知足申請內存的要求,一塊做爲新的空閒內存塊插入到鏈表中。
2.5FreeRTOS的移植 FreeRTOS操做系統能夠被方便地移植到不一樣處理器上工做,現已提供了ARM、MSP430、AVR、PIC、C8051F等多款處理器的移植。FrceRTOS在不一樣處理器上的移植相似於μC/0S一II,故本文再也不詳述FreeRTOS的移植。此外,TCP/IP協議棧μIP已被移植到FreeRTOS上,具體代碼可見FreeRTOS網站。
2.6FreeRTOS的不足 相對於常見的μC/OS—II操做系統,FreeRTOS操做系統既有優勢也存在不足。其不足之處,一方面體如今系統的服務功能上,如FreeRTOS只提供了消息隊列和信號量的實現,沒法之後進先出的順序向消息隊列發送消息;另外一方面,FreeRTOS只是一個操做系統內核,需外擴第三方的GUI(圖形用戶界面)、TCP/IP協議棧、FS(文件系統)等才能實現一個較複雜的系統,不像μC/OS-II能夠和μC/GUI、μC/FS、μC/TCP-IP等無縫結合。
4系統功能
做爲一個輕量級的操做系統,FreeRTOS提供的功能包括:任務管理、時間管理、信號量、消息隊列、內存管理、記錄功能等,可基本知足較小系統的須要。
FreeRTOS內核支持優先級調度算法,每一個任務可根據重要程度的不一樣被賦予必定的優先級,CPU老是讓處於就緒態的、優先級最高的任務先運行。
FreeRT0S內核同時支持輪換調度算法,系統容許不一樣的任務使用相同的優先級,在沒有更高優先級任務就緒的狀況下,同一優先級的任務共享CPU的使用時間。
FreeRTOS的內核可根據用戶須要設置爲可剝奪型內核或不可剝奪型內核。當FreeRTOS被設置爲可剝奪型內核時,處於就緒態的高優先級任務能剝奪低優先級任務的CPU使用權,這樣可保證系統知足實時性的要求;
當FreeRTOS被設置爲不可剝奪型內核時,處於就緒態的高優先級任務只有等當前運行任務主動釋放CPU的使用權後才能得到運行,這樣可提升CPU的運行效率。
5結 論
在嵌入式領域,FreeRTOS是很少的同時具備實行性,開源性,可靠性,易用性,多平臺支持等特色的嵌入式操做系統。目前,FreeRTOS已經發展到支持包含X86,Xilinx,Altera等多達30種的硬件平臺,其廣闊的應用前景已經愈來愈受到業內人士的矚目。
6版本發佈
2011年06月13日,FreeRTOS 7.0.1 發佈,嵌入式系統,該版本增長對富士通的 FM3 和 SmartFusion 的演示程序;更新了 RX 600 移植和演示程序以支持 1.0.2.0 版本的 Renesas 編譯器;修改了 RX600 以太網驅動程序,使之在高負載的狀況下更加穩定等等。
[2]
2011年10月20日,FreeRTOS 7.0.2 發佈,變化:
1。這個版本增長了港口RX200和RL78瑞薩。
2。它增長了演示的飛思卡爾Kinetis K60和富士通FM3 MB9A310。
3。在Microblaze V8港層已經被徹底取代。
4。各式各樣的API擴展。
5。代碼清理的ARM七、手臂,PIC32 IAR。
6。一個新的部分完成命令行解釋器被補充說,隨着新的演示。
[3]