FreeRTOS专栏2:FreeRTOSConfig.h 配置

在实际使用 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 相关的宏

时间片调度在源码中如何默认使能?

/* Application specific configuration options. */
#include "FreeRTOSConfig.h"

#ifndef configUSE_TIME_SLICING
    #define configUSE_TIME_SLICING      1
#endif

在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也实现了内存的申请与释放 

void *pvPortMalloc( size_t xWantedSize )
void vPortFree( void *pv )

当使用 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...作为系统时基定时器。

发布了184 篇原创文章 · 获赞 100 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/dingyc_ee/article/details/103957964
今日推荐