在实际使用 FreeRTOS 的时,经常要根据需求来配置 FreeRTOS,而且不同架构的 MCU 在使用的时候配置也不同。FreeRTOS 的系统配置文件为 FreeRTOSConfig.h,在此配置文件中可以完成 FreeRTOS 的裁剪和配置。
1 INCLUDE_ 开始的宏
INCLUDE_” 宏:用来表示使能或除能 FreeRTOS 中相应的 API 函数,作用就是用来配置 FreeRTOS 中的可选 API 函数的。
如下为野火推荐的 INCLUDE_ 配置:
如何实现的 INCLUDE_ 条件编译?以下是 FreeRTOS 源码:
使用 INCLUDE_ 宏的作用:
可以看到,当 INCLUDE_xTaskGetSchedulerState == 1 时,函数 xTaskGetSchedulerState 才会被编译。FreeRTOS中的裁剪和配置就是这种用条件编译的方法来实现的,不止FreeRTOS这么干,很多的协议栈、RTOS 系统和 GUI 库等都是使用条件编译的方法来完成配置和裁剪的。条件编译的好处就是节省空间,不需要的功能就不用编译,这样就可以根据实际需求来减少系统占用
的 ROM 和 RAM 大小,根据自己所使用的 MCU 来调整系统消耗,降低成本。
2 config 开始的宏
“config”开始的宏和“INCLUDE_”开始的宏一样,都是用来完成 FreeRTOS 的配置和裁剪的。
以下是几个 config 相关的宏
时间片调度在源码中如何默认使能?
在FreeRTOS.h中,会先包含 FreeRTOSConfig.h 文件,如果 FreeRTOSConfig.h 中没有配置 configUSE_TIME_SLICING 宏,那么就会直接配置为 1(不配置时默认使能)。
实际上,FreeRTOS.h 会先判断宏是否在 FreeRTOSConfig.h 被定义,如果已经定义则不做修改,如果在 FreeRTOSConfig.h 中未定义,那么 FreeRTOS.h 会定义宏并给一个默认值。
内存池:
FreeRTOS 创建动态任务时,采用的是动态内存申请。按常理来说,动态内存申请使用堆空间,而 stm32f103 系列启动文件的默认配置堆空间大小为 0X0400,这肯定不够 FreeRTOS 使用。如何处理?
a 设置总的堆(内存池)空间大小(FreeRTODConfig.h)
b 创建静态大数组(heap_4.c)
c 同样的,heap_4.c也实现了内存的申请与释放
当使用 stm32cubemx 配置 FreeRTOS 时,会提示 when FreeRtos is used.It is strongly recommended to use a HAL timebase source other than the Systick,如何解决?
意思是,当使用了FreeRtos的时候,强烈建议HAL库使用除了Systick以外的时钟源。也就是说当不使用FreeRtos的时候,HAL使用的是systick作为时钟源,现在使用了rtos,不建议hal库和rtos一起使用systick作为时钟源。
解决办法:使用 TIM1、TIM2...作为系统时基定时器。
转载于:https://blog.csdn.net/dingyc_ee/article/details/103957964
文章评论(0条评论)
登录后参与讨论