以下轉載自安富萊電子: http://forum.armfly.com/forum.php
FreeRTOS 的特點
FreeRTOS 的主要特點如下:
1. 支持搶占式調度,合作式調度和時間片調度。
2. SafeRTOS 作為 FreeRTOS 的衍生品大大提高了 FreeRTOS 在代碼完整性方面的信心。
3. 用於低功耗的 Tickless 模式。
4. 支持 35 種系統架構。
5. FreeRTOS-MPU 支持 M3/M4/M7 內核的 MPU(內存保護單元)。
6. 設計的簡單易用,典型的內核使用大小在 4k-9k。
7. 移植非常簡單,代碼主要用 C 編寫。
8. 同時支持合作式和搶占式任務。
9. 支持消息隊列、 二值信號量、 計數信號量、 遞歸信號量和互斥信號量,可用於任務與任務間的消息傳
遞和同步,任務與中斷間的消息傳遞和同步。
10. 優先級繼承方式的互斥信號量。
11. 高效的軟件定時器。
12. 強大的跟蹤執行函數。
13. 堆棧溢出檢查。
14. 提供豐富的,配置好的工程例子。
15. 提供論壇技術支持,有可選的商業支持和許可版本。
16. 任務的數量不限。
17. 任務優先級數量不限。
18. 多個任務可以分配相同優先級,即支持時間片調度。
19. 免費的開發工具。
20. 免費的嵌入式軟件源碼。
21. 免版權費。
FreeRTOS 的編碼標准
FreeRTOS 核心源碼文件的編寫遵循 MISRA 代碼規則,同時支持各種編譯器。 但考慮到有些編譯器
的性能還比較弱,不支持 C 語言的新標准 C99 和 C11 的一些特性和語法,所以 FreeRTOS 的源碼中就沒
有引入 C99 和 C11 的新特性,但是有一個例外,源碼中有用到頭文件 stdint.h(這個文件是 C99 標准才
引入的)。如果用戶使用的編譯器沒有這個頭文件的話,可以將 FreeRTOS 源碼文件中,此路徑下
FreeRTOS/Source/include 的一個 stdint.readme 文件修改為 stdint.h 文件后用於這個編譯器。
MISRA (The Motor Industry Software Reliability Association 汽車工業軟件可靠性聯會) 是位於
英國的一個跨國汽車工業協會,其成員包括了大部分歐美汽車生產商。其核心使命是為汽車工業提供
服務和協助,幫助廠方開發安全的、高可靠性的嵌入式軟件。這個組織最出名的成果是所謂的 MISRA C
Coding Standard,這一標准中包括了 127 條 C 語言編碼標准,通常認為,如果能夠完全遵守這些標
准, 那你的 C 代碼是易讀、可靠、可移植和易於維護的。 現在很多嵌入式開發者都以 MISRA C 來衡量
自己的編碼風格,比如 uC/OS-II 就宣傳 99%遵守 MISRA 標准。
FreeRTOS 的命名規則
初學 FreeRTOS 的用戶對其變量和函數的命名比較迷惑,下面專門做一下介紹:
變量
uint32_t 定義的變量都加上前綴 ul。 u 代表 unsigned 無符號,l 代表 long 長整型。
uint16_t 定義的變量都加上前綴 us。 u 代表 unsigned 無符號,s 代表 short 短整型。
uint8_t 定義的變量都加上前綴 uc。 u 代表 unsigned 無符號,c 代表 char 字符型。
stdint.h 文件中未定義的變量類型,在定義變量時需要加上前綴 x,比如 BaseType_t 和
TickType_t 定義的變量。
stdint.h 文件中未定義的無符號變量類型,在定義變量時要加上前綴 u,比如 UBaseType_t 定義
的變量要加上前綴 ux。
size_t 定義的變量也要加上前綴 ux。
枚舉變量會加上前綴 e。
指針變量會加上前綴 p,比如 uint16_t 定義的指針變量會加上前綴 pus。
根據 MISRA 代碼規則,char 定義的變量只能用於 ASCII 字符,前綴使用 c。
根據 MISRA 代碼規則,char *定義的指針變量只能用於 ASCII 字符串,前綴使用 pc。
函數
加上了 static 聲明的函數,定義時要加上前綴 prv,這個是單詞 private 的縮寫。
帶有返回值的函數,根據返回值的數據類型,加上相應的前綴,如果沒有返回值,即 void 類型
,函數的前綴加上字母 v。
根據文件名,文件中相應的函數定義時也將文件名加到函數命名中,比如 tasks.c 文件中函數
vTaskDelete,函數中的 task 就是文件名中的 task。
宏定義
根據宏定義所在的文件,文件中的宏定義聲明時也將文件名加到宏定義中,比如宏定義
configUSE_PREEMPTION 是定義在文件 FreeRTOSConfig.h 里面。 宏定義中的 config 就是文
件名中的 config。 另外注意,前綴要小寫。
除了前綴,其余部分全部大寫,同時用下划線分開。
FreeRTOS 中數據類型
FreeRTOS 使用的數據類型主要分為 stdint.h 文件中定義的和自己定義的兩種。 其中 char 和 char *
定義的變量要特別注意。
FreeRTOS 主要自定義了以下四種數據類型:
TickType_t
如果用戶使能了宏定義 configUSE_16_BIT_TICKS,那么 TickType_t 定義的就是 16 位無符號數,如
果沒有使能,那么 TickType_t 定義的就是 32 位無符號數。 對於 32 位架構的處理器,一定要禁止此
宏定義,即設置此宏定義數值為 0 即可。
BaseType_t
這個數據類型根據系統架構的位數而定,對於 32 位架構,BaseType_t 定義的是 32 位有符號數,對
於 16 位架構,BaseType_t 定義的是 16 位有符號數。 如果 BaseType_t 被定義成了 char 型,要特別
注意將其設置為有符號數,因為部分函數的返回值是用負數來表示錯誤類型。
UBaseType_t
這個數據類型是 BaseType_t 類型的無符號版本。
StackType_t
棧變量數據類型定義,這個數量類型由系統架構決定,對於 16 位系統架構,StackType_t 定義的是
16 位變量,對於 32 位系統架構,StackType_t 定義的是 32 位變量。
移植前准備工作說明
1. 本章節的 IDE 開發環境使用 MDK,用 MDK4.7X 或者 MDK5.XX 均可,保證支持 STM32F103,F407
和 F429 即可(不可以使用 MDK4.7X 以下版本,一方面是不支持 F429,另外就是 FreeRTOS V8.2.3
要用到 C 代碼中嵌套匯編代碼,MDK4.7X 以下版本是不支持的)。
2. 找一個簡單的工程,最好是跑馬燈之類的,越簡單越好,我們就在這個簡單的工程上面移植即可。
3. 大家使用的簡單工程里面不能有 SysTick,PendSV 和 SVC 三個系統中斷的使用,因為 FreeRTOS 系
統要使用這三個中斷。
free-rtos地移植算是比較簡單的了,作為一般應用,能夠調用API就夠了。
以上轉載自安富萊電子PDF資料。