在实际应用中并不会用到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 是特定于具体的工程项目的意思。