STM2F407与FreeRTOS的FreeRTOSConfig.h详解<1>

FreeRTOS是一个RTOS类的嵌入式实时操作系统,并且是开源免费的,与其他实时操作系统相比,是一个很好的选择。在移植好FreeRTOS到STM32上面之后,需要根据板子外设配置相应的功能,FreeRTOSConfig.h里面的宏完成对系统的裁剪和配置。

系统配置文件FreeRTOSConfig.h

在编译移植好的FreeROTS工程之后,需要都这个系统配置文件进行宏配置,这个配置文件与我们在编译kernel时的menuconfig类似,里面定义的宏,是对板子外设的和功能的裁剪配置。这个里面主要分为两个类的宏,一个是“INCLUDE_”开始的宏,一个是“config”开始的宏。FreeRTOSConfig.h是我们自己填充的.h文件,RTOS工程自带一个FreeRTOS.h文件,我们在FreeRTOSConfig.h定义的宏会对FreeRTOS.h进行条件编译。

INCLUDE_*

这个宏的主要功能就是使能或者是失能,FreeRTOS中的API函数的,如果我们需要使用某个api函数就需要把这个宏置1,否则就是置0。在FreeRTOSConfig.h,在上面部分是宏的声明,在对应的.c文件里面会有条件编译,这个就可以达到减少系统占有的ROM和RAM。

INCLUDE_xTaskGetSchedulerState

这个宏是对xTaskGetSchedulerState函数的条件判断,是获取任务调度表状态的函数。

INCLUDE_vTaskPrioritySet

这个宏是对vTaskPrioritySet函数的条件判断,是任务优先级设置的函数。

INCLUDE_uxTaskPriorityGet

这个宏是对uxTaskPriorityGet函数的条件判断,是获得任务优先级的函数。

INCLUDE_vTaskDelete

这个宏是对vTaskDelete函数的条件判断,是获得任务优先级的函数。

INCLUDE_vTaskCleanUpResources

这个宏是对vTaskCleanUpResources函数的条件判断,是对删除的任务进行资源回收的函数。

INCLUDE_vTaskSuspend

这个宏是对vTaskSuspend函数的条件判断,是对任务进行挂起的函数。

INCLUDE_vTaskDelayUntil

这个宏是对vTaskDelayUntil函数的条件判断,是设置任务延迟绝对时间的函数。

INCLUDE_vTaskDelay

这个宏是对vTaskDelay函数的条件判断,是设置任务延迟相对时间的函数。

INCLUDE_eTaskGetState

这个宏是对eTaskGetState函数的条件判断,是获得某个任务的状态的函数。

INCLUDE_xTimerPendFunctionCall

这个宏是对xTimerPendFunctionCall函数的条件判断,是获得某个任务的状态的函数

config_*

FreeRTOS基础配置选项

1为抢占式调度,0为协程,抢占式调度器会在内核的中断中进行任务的切换,协程的话,会在三种情况下,进行任务的切换:

  1. 一个任务调用函数taskYIELD();
  2. 一个任务调用可以使任务进入阻塞状态的API函数;
  3. 应用程序明确定义了在中断中执行上下文切换;

configUSE_TIME_SLICING

为1的话,在相同优先级下的任务使用合作式调度器,也就是时间片轮流执行。为0的话则不会。

configUSE_PORT_OPTIMISED_TASK_SELECTION

选择下一个要执行的任务,为0是通用的方法,为1是特殊方法,使用硬件指令计算。

configUSE_TICKLESS_IDLE

FreerRTOS支持低功耗tickless模式,为1使能,tickless低功耗模式是RTOS通过的低功耗方法,

configUSE_QUEUE_SETS

设置成1使能队列集功能(可以阻塞、挂起到多个队列和信号量),设置成0取消队列集功能。

configCPU_CLOCK_HZ

设置CPU工作的频率。

configTICK_RATE_HZ

设置滴答定时器的中断频率,这里设置为1000,周期就是1ms。

configMAX_PRIORITIES

设置优先级的数量,范围为0~(configMAX_PRIORITIES-1),0为最低优先级,值越大优先级越高,而且我们的任务不可使用0优先级,

configMINIMAL_STACK_SIZE

设置最小任务堆栈大小,也就是空闲任务大小,单位是字,

configMAX_TASK_NAME_LEN

设置任务名最大长度,字节为单位

configUSE_16_BIT_TICKS

设置系统节拍计数器变量数据类型。设为 1后portTickType 将被定义为无符号的16位整形类型,configUSE_16_BIT_TICKS 设为0 后portTickType 则被定义为无符号的32位整型。

configIDLE_SHOULD_YIELD

这宏的作用是定义了与空闲任务(idle task)和其他任务处于同等优先级时,为1时,时间片轮到空闲任务的时候,空闲任务会将cpu的使用权交给其他任务 。

configUSE_TASK_NOTIFICATIONS

为1 则开启任务通知功能。

configUSE_MUTEXES

为1使用互斥信号量。

configQUEUE_REGISTRY_SIZE

设置可以注册队列和信号量的最大数量,在内核调试器查询队列和信号量的时候需要设置这个宏,

configCHECK_FOR_STACK_OVERFLOW

设置堆栈溢出检测,每个任务的堆栈是从FreeRTOS的ucHeap中分配的,如果任务的堆栈溢出的话,会造成程序不稳定,为1的话则设置为堆栈溢出检测功能,需要和钩子函数结合使用,也就是一个回调函数,当溢出是会调用这个回调函数。

configUSE_RECURSIVE_MUTEXES

为1的话是使能递归互斥信号量。

configUSE_MALLOC_FAILED_HOOK

为1使用内存分配失败的钩子函数,

configUSE_APPLICATION_TASK_TAG

这个宏为1是使能两个函数进行编译:

  1. configUSE_APPLICATION_TASK_TAGF()这个函数
  2. vTaskSetApplicationTaskTag(),这个函数是为任务分配一个标签值。

configUSE_COUNTING_SEMAPHORES

设置1会启动计数型信号量,

FreeRTOS与内存申请有关配置选项

configSUPPORT_DYNAMIC_ALLOCATION

定义为1的话FreeRTOS内核对象所需要的RAM会从FREERTOS的堆中动态的获取内存,为0则需要内核对象自己提供。

configTOTAL_HEAP_SIZE

设置堆空间(Heap)的大小。只有当程序中采用FreeRTOS 提供的内存分配算法时才会用到。

总结

总是我们没有用到的宏有些不会在FreeRTOSConfig.h定义,需要在FreeRTOS.h中查找,并且上面和针对config的宏还有部分配置解释。

-------------本文结束感谢您的阅读-------------