freertos 準備工作和思考
freertos操作系統
freertos操作系統:可以理解爲一個大程序,這個大程序裏面有很多任務(函數),這個大程序會按照優先級或事件發生的先後來控制各個任務有條不紊的運行。類似於一個大循環,裏面有很多子函數,但是子函數的運行不是按照編程的先後順序運行,而是由調度器控制,來決定哪個任務運行,哪個任務阻塞(休息)。
源碼分析建議
首先對操作系統有個基本認識,知道堆、棧、任務、調度、內存管理等基本概念。建議看操作系統相關書籍。如果是有學習過其他操作系統經驗的,可以直接上手freertos,freertos的源碼還是相對容易分析的。
首先學會使用 freertos,然後深入學習freertos源碼,有助於更好的使用。
操作系統的源碼,爲了適配更多硬件,實現更多的方案,通常存在很多條件編譯,學會抓住主幹分析。
freertos 源碼閱讀
freertos 命名規則
知道命名規則之後,對分析代碼很有用,知道一個符號來自哪裏,是函數還是宏定義,有沒有返回值,等,都可以從函數名看出來。
變量
1. uint32_t 定義的變量都加上前綴 ul。 u 代表 unsigned 無符號,l 代表 long 長整型。
2. uint16_t 定義的變量都加上前綴 us。 u 代表 unsigned 無符號,s 代表 short 短整型。
3. uint8_t 定義的變量都加上前綴 uc。 u 代表 unsigned 無符號,c 代表 char 字符型。
4. stdint.h 文件中未定義的變量類型,在定義變量時需要加上前綴 x,比如 BaseType_t 和
5. TickType_t 定義的變量。
6. stdint.h 文件中未定義的無符號變量類型,在定義變量時要加上前綴 u,比如 UBaseType_t 定義的變量要加上前綴 ux。
7. size_t 定義的變量也要加上前綴 ux。
8. 枚舉變量會加上前綴 e。
9. 指針變量會加上前綴 p,比如 uint16_t 定義的指針變量會加上前綴 pus。
10. 根據 MISRA 代碼規則,char 定義的變量只能用於 ASCII 字符,前綴使用 c。
11. 根據 MISRA 代碼規則,char *定義的指針變量只能用於 ASCII 字符串,前綴使用 pc。
函數
1. 加上了 static 聲明的函數,定義時要加上前綴 prv,這個是單詞 private 的縮寫。
2.帶有返回值的函數,根據返回值的數據類型,加上相應的前綴,如果沒有返回值,即 void 類型,函數的前綴加上字母 v。
根據文件名,文件中相應的函數定義時也將文件名加到函數命名中,比如 tasks.c 文件中函數vTaskDelete,函數中的 task 就是文件名中的 task。
宏定義
1.根據宏定義所在的文件,文件中的宏定義聲明時也將文件名加到宏定義中,比如宏定義
configUSE_PREEMPTION 是定義在文件 FreeRTOSConfig.h 裏面。 宏定義中的 config 就是文件名中的 config。 另外注意,前綴要小寫。
2.除了前綴,其餘部分全部大寫,同時用下劃線分開。
閱讀工具
建議使用 source insight 閱讀源碼
結合書籍
《cortex-m3權威指南》 必看
《freertos開發手冊》
《freertos源碼一份》。freertos官網
《Mastering the FreeRTOS™ Real Time Kernel》
疑問
在成功移植freertos之後,提出瞭如下疑問?帶着疑問學習。
- freertos是實時操作系統,它的實時性從哪裏體現,源碼中哪裏實現,相比於Linux有什麼區別?
- 搶佔式內核的任務調度,一個任務等待事件發生後,哪一時刻出發任務切換?由誰來完成?
- 任務切換是如何實現的,cortex M3中的任務切換 需要做哪些事?
- freertos 的內存管理,ucheap這個大數組是什麼?freertos中的任務棧和堆在哪裏分配,怎麼分配,之間是什麼關係?
參考資料
freertos
《cortex M3 權威指南》
《freertos 開發手冊》
公衆號:嵌入式軟件和硬件