FreeRTOS系统配置详解:Config宏与INCLUDE宏的使用指南
FreeRTOS系统配置详解:Config宏与INCLUDE宏的使用指南
本文详细介绍了FreeRTOS系统配置中各种Config宏的配置方法和作用,涵盖了内核配置、其他配置以及"INCLUDE_"开头的宏配置等多个方面。每个配置项都给出了详细的使用说明和配置建议,对于学习和使用FreeRTOS的开发者来说,是一篇很好的参考文档。
系统配置说明
大部分配置选项在FreeRTOS.h文件中都有默认的配置,在应用时,把需要的配置选项放在FreeRTOSConfig.h文件即可。在配置这些选择时候,尽量不要在FreeRTOSConfig.h或者FreeRTOS.h直接修改,建议在STM32CubeMX软件中设置然后在更新过去即可。
前缀为"config"的宏表示某种参数设置,一般的,值为1表示开启此功能,值为0表示禁用此功能。前缀为"INCLUDE_"的宏表示是否编译某个函数的源码。
文件FreeRTOS.h包含系统默认的一些参数的宏定义,不要直接修改此文件的内容,用户可以通过修改的配置文件是FreeRTOSConfig.h,这个文件中包含大量前缀为"config"和"INCLUDE_"的宏定义。
Config宏-内核配置
在STM32CubeMX的配置会更新到FreeRTOSConfig.h文件中
1. configUSE_PREEMPTION
使用说明:于控制任务调度的方式,一般配置-1
- 配置为 1 -使能抢占式调度器
- 配置为 0-使能合作式调度器
2. configUSE_PORT_OPTIMISED_TASK_SELECTION
使用说明:STM32配置为1就可以了
功能: 此配置用于优化优先级列表中要执行的最高优先级任务的算法。对 CM 内核的移植文件,默认已经在文件 portmacro.h 文件中使能。
- 配置为 0-通用方式
- 所有平台的移植文件都可以配置为 0,因为这是通用方式。
- 纯 C 编写,比专用方式效率低。
- 可用的优先级数量不限制。
- 配置为 1-专用方式
- 部分平台支持。
- 这些平台架构有专用的汇编指令,比如 CLZ(Count Leading Zeros)指令,通过这些指令可以加快算法执行速度。
- 比通用方式高效。
- 有最大优先级数限制,通常限制为 32 个。
3. configUSE_TICKLESS_IDLE
使用说明:配置为0
- 配置为 1-使能 tickless 低功耗模式
- 配置为 0-禁能 tickless 低功耗模式
4. configCPU_CLOCK_HZ
使用说明:和单片机主频一样就行、一般STM32CubeMX已经给生成
此参数用于定义 CPU 的主频,单位 Hz
5. configTICK_RATE_HZ
使用说明:一般1Khz
此参数用于定义系统时钟节拍数,单位 Hz,一般取 1000Hz 即可。
比如1000HZ,就是系统会每1ms 进行一次任务调度
这个参数了影响了系统的实时性
6. configMAX_PRIORITIES
此参数用于定义可供用户使用的最大任务优先级数,
- 如果这个定义的是 5,那么用户可以使用的优先级号是 0,1,2,3,4,不包含 5。
- 优先级号越小,优先级就约低。
- 如果configUSE_PORT_OPTIMISED_TASK_SELECTION配置为1、configMAX_PRIORITIES就不能超过32
- 一般设置5-7左右就够使用
7. configMINIMAL_STACK_SIZE
使用说明:一般为128
此参数用于定义空闲任务的栈空间大小,单位字,即 4 字节。
8. configTOTAL_HEAP_SIZE
(FreeRTOS堆中可用的RAM总量)定义freeRTOS系统堆大小。
configTOTAL_HEAP_SIZE
设置了 FreeRTOS从芯片的SRAM分配的堆内存的总大小,这个堆内存用于FreeRTOS的所有动态内存分配,具体将用于FreeRTOS的任务栈的分配,队列、信号量等资源,内存池或动态内存分配。
FreeRTOS 提供了
xPortGetFreeHeapSize()
函数来监控当前堆内存的剩余空间。你可以在程序中定期调用该函数,查看堆内存的使用情况,以确保内存不会耗尽。
size_t heapRemaining = xPortGetFreeHeapSize();
9. configMAX_TASK_NAME_LEN
如果自己的任务名16字符数一下,就不需要更改
定义任务名最大的字符数,末尾的结束符 '\0’也要计算在内。
10. configUSE_16_BIT_TICKS
32位单片机配置0
16位单片机配置1
系统时钟节拍计数使用 TickType_t 数据类型定义的。
- 配置为1-TickType_t 定义是 16 位无符号数
- 配置为0-TickType_t 是32位
11. configIDLE_SHOULD_YIELD
一般配置为0
此参数用于使能与空闲任务同优先级的任务,只有满足以下两个条件时,此参数才有效果:
- 使能抢占式调度器。
- 有创建与空闲任务同优先级的任务。
12. configUSE_TASK_NOTIFICATIONS
配置为 1-使能任务间直接的消息传递,包含信号量,事件标志组和消息邮箱。
配置为 0-禁能此特性。
13. configUSE_MUTEXES
配置为 1-使能互斥信号量
配置为 0-禁能互斥信号量
14. configUSE_RECURSIVE_MUTEXES
配置为 1-使能递归互斥信号量
配置为 0-禁能递归互斥信号量
15. configUSE_COUNTING_SEMAPHORES
配置为 1-使能计数信号量
配置为 0-禁能计数信号量
16. configQUEUE_REGISTRY_SIZE
通过此定义来设置可以注册的信号量和消息队列个数。队列注册有两个目的,这两个目的都与内核调试有关:
- 注册队列的时候,可以给队列起一个名字,当使用调试组件的时候,通过名字可以很容易的区分不同队列
- 通过队列的相关信息,调试器可以很容易定位队列和信号量,能够定位信号量是因为 FreeRTOS 信号量也是基于队列实现的。当然,如果用户没有使用内核方面的调试器,这个宏定义是没有意义的。
17. configUSE_QUEUE_SETS
配置为 1-使能消息队列。
配置为 0-禁能消息队列。
18. configUSE_TIME_SLICING
使用:默认使能 配置1
- 配置为 1-使能时间片调度。
- 配置为 0-禁能时间片调度。
- 作用:用于在一个优先级有多个任务,就会每1ms 调度一次
- 用户没有配置此选项如果用户没有配置此选项
- 默认在 FreeRTOS.h 文件中已经配置为 1,即使能时间片调度。
Confi开始的其他宏-其他配置
图片是样例 不是按照图片设置的意思
钩子函数配置:1、2、3、4
钩子函数的主要功能是用于函数的扩展,用户可以根据自己的需要往里面添加相关的测试函数。就不会在用更改源码,就像回调函数一样。
1. configUSE_IDLE_HOOK
配置为 1-使能空闲任务的钩子函数
配置为 0-禁能空闲任务钩子函数
2. configUSE_MALLOC_FAILED_HOOK
配置为 1-使能动态内存申请失败时的钩子函数
配置为 0-禁能动态内存申请失败时的钩子函数
当创建任务,信号量或者消息队列时,FreeRTOS 通过函数 pvPortMalloc()申请动态内存。
3. configUSE_TICK_HOOK
配置为 1-使能滴答定时器中断里面执行的钩子函数
配置为 0-禁能滴答定时器中断里面执行的钩子函数
4. configCHECK_FOR_STACK_OVERFLOW
配置为 2-使用一种方法检测栈溢出。
配置为 1-使用另一种方法检测栈溢出。
配置为 0-禁止栈溢出检测。
任务运行信息获取配置:5、6、7、
5. configGENERATE_RUN_TIME_STATS
配置为 1-使能任务运行状态参数统计。
配置为 0-禁止此特性。
6. configUSE_TRACE_FACILITY
配置为 1-使能此配置将添加额外的结构体成员和函数,以此来协助可视化和跟踪。
配置为 0-禁能此特性。
7. configUSE_STATS_FORMATTING_FUNCTIONS
用户配置宏定义 configUSE_TRACE_FACILITY 和 configUSE_STATS_FORMATTING_FUNCTIONS都为 1 的时候,将使能函数 vTaskList() 和 vTaskGetRunTimeStats(),如果两者中任何一个为 0,那么这两个函数都将被禁能。
(不用使用)合作式任务配置:8、9
8. configUSE_CO_ROUTINES
配置为 1-使能合作式调度相关函数。
配置为 0-禁能合作式调度相关函数。
9. configMAX_CO_ROUTINE_PRIORITIES
此参数用于定义可供用户使用的最大的合作式任务优先级数,如果这个定义的是 5,那么用户可以使用的优先级号是 0,1,2,3,4,不包含 5,对于这一点,初学者要特别的注意。
软件定时器配置:10、11、
10. configUSE_TIMERS
配置为 1-使能软件定时器。
配置为 0-0禁能软件定时器。
11. configTIMER_TASK_PRIORITY
配置软件定时器任务的优先级。
12. configTIMER_QUEUE_LENGTH
配置软件定时器命令队列的长度。
13. configTIMER_TASK_STACK_DEPTH
配置软件定时器任务的栈空间大小
断言配置:
会判断函数输入实参是否满足要求,方便调试代码
STM32cubeMX生成的:
中断配置:
configLIBRARY_LOWEST_INTERRUPT_PRIORITY:
通常15
配置中断最低优先级,通常为15(因为STM32的抢占式优先级最多设置为4bit,优先级最低只能设置为15),此参数用于配置SysTick(滴答中断)与PendSV(挂起中断)。
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY:
配置系统可管理的最高优先级,此参数用于配置BASEPRI寄存器。 如果设置为5,则优先级数值为0,1,2,3,4的中断是不受FreeRTOS管理的,不可被屏蔽,也不能调用FreeRTOS中的API接口函数,而中断优先级在5-15的中断受系统FreeRTOS管理,可以被屏蔽.(用于临界保护、防止其他中断打断重要程序)
“INCLUDE_”开始的宏
以“INCLUDE”开头的宏允许您的应用程序将未使用的实时内核组件从您的工程中移除(主要通过C语言预编译溢出的), 这可节约嵌入式应用程序所需的任何 ROM 或 RAM。
每个宏都采用以下形式:
INCLUDE_FunctionName
其中 FunctionName 表示可以选择性地排除的 API 函数(或函数集)。
要包含 API 函数,请将宏设置为 1,要排除该函数,请将宏设置为 0。
例如:
要包含 vTaskDelete() API 函数,请使用:
#define INCLUDE_vTaskDelete 1
要从构建中排除 vTaskDelete(),请使用:
#define INCLUDE_vTaskDelete 0