在實際應用中并不會用到FreeRTOS的所有功能,因此可以對RTOS內核進行裁剪,這樣也可以節省MCU的Flash和RAM資源。FreeRTOS內核的裁剪是使用名為FreeRTOSConfig.h的配置文件進行定制的,關于FreeRTOSConfig.h 的詳細解析在FreeRTOS官網有詳細說明,參見鏈接https://www.freertos.org/a00110.html。
FreeRTOSConfig.h 是特定于工程,而不是RTOS自身的,對于基于FreeRTOS的任何工程所有的RTOS文件都是不需要做任何更改的除了這個FreeRTOSConfig.h。下圖是例程工程示例圖,可以看出將FreeRTOSConfig.h放在了頭文件的Config目錄下,而沒有和FreeRTOS的頭文件和C源文件放在一起。
從上圖中我們可以看出另一個信息,工程用了大約5%的RAM(1186 bytes5 )和6%的Flash(5551 words ),花費并不是很大,這還包括與器件的初始化相關等非FreeRTOS內容,如MCC Generated Files文件夾下內容。同時這是在用免費的XC16編譯器,代碼優化等級為0的情況下獲得的。如此小的代價換來的是最基本的FreeRTOS搶占式內核開發環境,這將給邏輯任務開發帶來極大的便利,如定義了優先級遞減的100us、1ms、10ms和100ms時基任務,這些任務的調度會自動進行,用戶不用在考慮某一瞬間100us、1ms、10ms、100ms的任務撞到一起而導致100us的任務不能及時執行。
FreeRTOS的配置和裁剪,是借助FreeRTOSConfig.h 中各種宏的值通過條件編譯的方法實現的,不需要的功能就不用編譯,這樣就可以根據實際需求來減少系統占用的Flash和RAM的大小。這里首先介紹“config”開頭的宏, 例程中“config”開頭的宏配置如下。
接著介紹“INCLUDE_”開頭的宏,使用“INCLUDE_ ”開頭的宏用來表示使能或禁止FreeRTOS中的相應API函數,作用就是用來配置FreeRTOS中的可選API函數,例程中配置如下。
最后,在實際的項目中如應用程序各個任務里有較多的局部變量,那么configTOTAL_HEAP_SIZE要定義的更大些;如果用到了互斥信號量、遞歸互斥信號量和計數值信號量等,則相應的宏定義開關要打開。這也就是FreeRTOSConfig.h 是特定于具體的工程項目的意思。