FreeRTOS 由美國的 Richard Barry 于 2003 年釋出, Richard Barry 是 FreeRTOS 的擁有者和維護者, 在過去的十多年中 FreeRTOS 曆經了 9 個版本, 與衆多半導體廠商合作密切,累計開發者數百萬,是目前市場占有率最高的 RTOS。FreeRTOS 于 2018 年被亞馬遜收購, 改名為 AWS FreeRTOS,版本号更新為 V10,且開源協定也由原來的 GPLv2+修改為 MIT,與 GPLv2+相比, MIT 更加開放,你完全可以了解為是為所欲為的免費。V9 以前的版本還是維持原樣, V10 版本相比于 V9 就是加入了一些物聯網相關的元件,核心基本不變。亞馬遜收購 FreeRTOS 也是為了進軍物聯網
FreeRTOS
FreeRTOS 是一款 “開源免費” 的實時作業系統,遵循的是 GPLv2+的許可協定。這裡說到的開源,指的是你可以免費得擷取到 FreeRTOS 的源代碼,且當你的産品使用了 FreeRTOS且沒有修改 FreeRTOS 核心源碼的時候,你的産品的全部代碼都可以閉源,不用開源,但是當你修改了 FreeRTOS 核心源碼的時候,就必須将修改的這部分開源, 回報給社群, 其它應用部分不用開源。
OpenRTOS
FreeRTOS 和 OpenRTOS 擁有的代碼是一樣的, 但是可從官方擷取到的服務卻是不一樣的。 FreeRTOS 号稱免費, OpenRTOS 号稱收費。
SaveRTOS
SaveRTOS 也是基于 FreeRTOS,但是 SaveRTOS 為某些特定的領域做了安全相關的設計,有關 SaveRTOS 獲得的安全驗證具體見表格 3-2。當然, SaveRTOS 也是需要收費。
FreeRTOS 的源碼和相應的官方書籍均可從官網 www.freertos.org 獲得
FreeRTOS 的程式設計風格
l 資料類型
FreeRTOS 中詳細的資料類型重定義在 portmacro.h 這個頭檔案中實作
在程式設計的時候,如果使用者沒有明确指定 char 的符号類型, 那麼編譯器會預設的指定char 型的變量為無符号或者有符号。正是因為這個原因,在 FreeRTOS 中,我們都需要明确的指定變量 char 是有符号的還是無符号的。在 keil 中, 預設 char 是無符号的,但是也可以配置為有符号的,具體配套過程見圖
l 變量名
在 FreeRTOS 中,定義變量的時候往往會把變量的類型當作字首加在變量上, 這樣的好處是讓使用者一看到這個變量就知道該變量的類型。比如 char 型變量的字首是 c, short 型變量的字首是 s, long 型變量的字首是 l, portBASE_TYPE 類型變量的字首是 x。還有其他的資料類型,比如資料結構,任務句柄, 隊列句柄等定義的變量名的字首也是 x。如果一個變量是無符号型的那麼會有一個字首 u, 如果是一個指針變量則會有一個字首 p。是以,當我們定義一個無符号的 char 型變量的時候會加一個 uc 字首, 當定義一個char 型的指針變量的時候會有一個 pc 字首。
l 函數名
函數名包含了函數傳回值的類型、 函數所在的檔案名和函數的功能,如果是私有的函數則會加一個 prv( private) 的字首。特别的, 在函數名中加入了函數所在的檔案名, 這大大的幫助了使用者提高尋找函數定義的效率和了解函數作用的目的, 具體的舉例如下:
1. vTaskPrioritySet()函數的傳回值為 void 型, 在 task.c 這個檔案中定義。
2. xQueueReceive()函數的傳回值為 portBASE_TYPE 型, 在 queue.c 這個檔案中定義。
3. vSemaphoreCreateBinary()函數的傳回值為 void 型, 在 semphr.h 這個檔案中定義。
l 宏
宏均是由大寫字母表示,并配有小寫字母的字首,字首用于表示該宏在哪個頭檔案定義
這裡有個地方要注意的是信号量的函數都是一個宏定義,但是它的函數的命名方法是遵循函數的命名方法而不是宏定義的方法。
在貫穿 FreeRTOS 的整個代碼中,還有幾個通用的宏定義我們也要注意下,都是表示 0和 1 的宏。
l 格式
一個 tab 鍵盤等于四個空格鍵。我們在程式設計的時候最好使用空格鍵而不是使用 tab 鍵,當兩個編譯器的 tab 鍵設定的大小不一樣的時候,代碼移植的時候代碼的格式就會變亂,而使用空格鍵則不會出現這種問題。
Hankin
2020.08.18