FreeRTOS概覽

  • 簡介

FreeRTOS是一個以MIT許可協議開源的嵌入式實時操作系統,它的核心是多任務調度,內存佔用量極低,提供了任務優先級搶佔、任務間通信和同步的機制、堆內存分配與保護等基本功能。FreeRTOS可以運行在資源受限的微控制器上,支持非常多的處理器平臺,是一個可配置可裁剪的嵌入式操作系統內核。FreeRTOS有很完善的文檔及學習資料,而且現在由亞馬遜旗下一個項目組在維護。但FreeRTOS只是一個操作系統內核,只提供了最基本的功能,諸如網絡通信、圖形顯示、文件系統這些一個完整操作系統應該具備的功能,需要接入第三方庫或者自已去實現。

  • 基本術語

多任務系統:從整體上看,能夠實現多個任務並行運行的系統就叫作多任務系統。對於單核cpu來說只是操作系統以極短的時間來切換不同的任務執行,看起來像是多個任務並行運行一樣。但對於多核cpu來說,可以真正做到任一時刻都可以在不同的線程運行不同的任務。

任務:任務和桌面操作系統的線程很類似,每個任務實現一個具體的功能,它是FreeRTOS最小的代碼執行單元,是實現多任務輪流執行的最小粒度。

中斷:中斷是響應外設信號的處理程序,當一個外設產生了輸入輸出信號觸發了中斷,cpu就會執行對應的中斷服務例程(ISR),ISR要儘可能的短小且不能有阻塞,以提高系統的響應速度。

任務優先級:每個任務都會被分派一個執行優先級,內核會根據這個優先級決定任務的運行次序。

優先級搶佔:如果系統配置爲允許任務搶佔,那麼當高優先級的任務準備就緒時,系統就會暫停當前低優先級的任務運行,切換爲就緒的高優先級運行,以保證實時性。

優先級反轉:在某些特定的條件下,會發生高優先級的任務等待低優先級任務運行結束的情況,就叫作優先級反轉。比如當高優級任務訪問一個被低優先級任務同步佔用的資源時。

優先級繼承:當高優先級任務訪問一個被低優先級任務佔用的使用mutex保護的資源時,內核會把該低優先級的任務臨時提升優先級別,儘可能地讓該任務得到更多的時間運行,從而儘快釋放資源,以保證等待資源的高優先級任務在最短時間內能夠執行。

調度:內核根據一定的算法協調分配各個任務的運行時間與次序,以實現多任務同時運行以及實時性的目的。每個任務都有一個TCB塊和棧內存,當發生任務切換時,內核會先保存當前任務的上下文環境,然後切換回要運行的任務之前的上下文環境。

  • 通信與同步

FreeRTOS實現任務間以及任務與中斷間的通信與同步的方式有很多種,各有各的優缺點以及應用場景,包括隊列、信號燈、互斥量、任務通知等。

隊列:隊列是任務間通信的基本方式。一個任務從隊列讀數據,另一個從隊列寫數據,當讀空隊列或者寫滿隊列時,對應的任務會被阻塞。可以直接把小數據寫入隊列,也可以把大數據的地址寫入隊列,隊列的內存是由內核負責分配的。

信號燈:信號燈分爲二進制信號燈與計數信號燈。區別是前者控制資源任一時刻只能有一個佔用者,後者允許資源可以同時被特定數量的訪問者佔用。對於二進制信號燈,當信號燈爲1時表示信號燈可被獲取,爲0時表示信號燈也經被其他任務獲取,當前任務需要等待或放棄。對於計數信號燈來說,可以同步事件與資源兩種,如果同步的是事件,當事件發生時計數加1,當事件被處理後,計數減1,信號燈的初始數量是0。如果同步的是資源,當資源被佔用時計數減1,當資源釋放時計數加1,信號燈的初始數量爲資源最大數量。

互斥量:基本和二進制信號燈功能一樣,只是多了個優先級繼承的功能。對於使用互斥量同步的資源,在特定情況下會臨時提升相應任務的優先級。

任務通知:每一個任務都有一個32位的通知值,一個任務可以等待接收通知,另一個任務可以發送通知以喚醒等待的任務,實現同步。可以使用任務通知實現一些輕量級的信號燈、事件組等功能。任務通知不需要佔用額外的內核資源與內存,比二進制信號燈解鎖任務快45%。但任務通知只能用在一對一的情況下,比如說,一個任務不能同時通知多個任務,但信號燈與互斥量就可以。當用任務通知實現信號燈時,任務的通知值就做爲信號燈的計數值。

  • 調度算法

FreeRTOS的調度算法大概分爲三類,可以在FreeRTOSConfig.h中配置使用什麼樣的調度算法。

時間分片的優先級搶佔算法:高優先級任務會搶佔低優先級任務執行,相同優先級任務會輪流執行特定時間片的時間。

不帶時間分片的優先級搶佔算法:高優先級任務會搶佔低優先級任務執行,當前任務只有在進入等待或阻塞狀態,或者被其他高優先級任務搶佔後,其他任務纔有機會執行。

協作調度算法:當前任務如果沒有進入等待或阻塞狀態,其他任務沒有機會執行。當發生任務切換時,高優先級的任務優先被調度。

  • 內存分配

FreeRTOS支持靜態分配與動態分配內存兩種。

靜態分配內存:內核提供了特定的api可以對一些內核對象靜態分配內存,靜態分配內存有下面一些好處:鏈接時就能確定對象的大小及內存地址和最大的內存佔用量;應用程序編寫者不用關心內存分配失敗的情況;適用於不允行任務動態內存分配的情況。

動態分配內存:內核預置了5種動態分配內存方法,分別位於heap_1.c到heap_5.c文件中,也支持開發者編寫針對自己平臺的內存分配函數,但必須保留至少一種預置方法,因爲內核api分配內存時要用到。

FreeRTOS對特定平臺也提供了內存訪問保護機制,比如特定內存只讀或者可執行等。FreeRTOS也提供了一些棧溢出的檢測手段,比如棧指針是否超出了有效區,棧內存特定字節是否被覆蓋等,但因爲增加了開銷,所以棧溢出檢測儘量用在開發和測試中。

  • 軟定時器與HOOK函數

FreeRTOS在內核啓動時會運行一個軟定時器守護任務,該任務負責接收定時器的控制消息,比如創建、刪除、重置定時器,同時負責在定時器超時時調用定時器回調函數。該守護任務還保證只有在定時器回調函數實際執行時才佔用cpu時間,其他時候都處於阻塞狀態。定時器的回調函數要寫的儘量簡短,不能有阻塞,以免造成其他定時器回調不能按時執行。

FreeRTOS也提供了很多的hook函數方便實現一些功能:

Idle Hook函數:當最低優先級的空閒任務運行時,就會調用這個回調,可以在這裏把cpu設爲深度睡眠狀態以節能。

Tick Hook函數:可以實現定時功能。

Malloc Failed Hook函數:當內存分配失敗時調用。

Stack Overflow Hook函數:棧溢出時調用。

Daemon Task Hook函數:軟定時器守護任務調用的回調函數。

  • 編碼標準與命名規範

FreeRTOS遵從MISRA的編碼標準,有一套自己的命名規範,可以參考對應文檔。FreeRTOS爲了最大化各平臺的兼容性,沒有采用C99標準以後新引入的C特性。

  • 優勢與劣勢

優勢:免費、開源、資源佔用小、實時多任務、內核可移植可裁剪、資料完整學習成本低、官方提供支持、使用羣體龐大開源社區活躍。

劣勢:只提供最基本內核,如果想搭建完整的操作系統,需要整合第三方的庫,比如網絡通信、文件系統、圖形系統等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章