目录
一、基础配置选项
二、内存分配相关定义
三、钩子函数的相关定义
四、运行时间和任务状态统计相关定义
五、软件定时器相关配置
FreeRTOSConfig.h配置文件的作用:
对FreeRTOS进行功能配合和裁剪,以及API函数的使能
对于FreeRTOS配置文件主要分为以下三类:
1、“INCLUDE”:主要用于配置FreeRTOS中可选的API函数
2、“config”:完成FreeRTOS的功能配置和裁剪
3、其他配置选项:PendSV宏定义、SVC宏定义
一、基础配置选项
(1)configUSE_PREEMPTION宏定义的配置
#define configUSE_PREEMPTION 1
/* 1: 抢占式调度器, 0: 协程式调度器, 无默认需定义 */
(2)configUSE_PORT_OPTIMISED_TASK_SELECTION宏定义的配置
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
/* 1: 使用硬件计算下一个要运行的任务(硬件),
0: 使用软件算法计算下一个要运行的任务(通用的方式)-效率较低, 默认: 0
特殊方法的效率高于通用方法,但是特殊方法依赖于一个或多个架构的汇编指令
(一般是类似前导零[CLZ]的指令),因此特殊方法并不支持所有硬件,并且对任务优先级的最大值
也有限制,通常为32*/
(3)configUSE_TICKLESS_IDLE宏定义的配置
#define configUSE_TICKLESS_IDLE 0
/* 1: 使能tickless低功耗模式, 默认: 0 */
(4)configCPU_CLOCK_HZ宏定义的配置
#define configCPU_CLOCK_HZ SystemCoreClock
/* 定义CPU主频, 单位: Hz, 无默认需定义 */
这里我们定义的时钟频率并不是16M
我们在main.c有一个时钟使能,跳进去以后,这一块才是真正的初始化。
(5)configSYSTICK_CLOCK_HZ 宏定义的配置,直接屏蔽
//#define configSYSTICK_CLOCK_HZ (configCPU_CLOCK_HZ / 8)
/* 定义SysTick时钟频率,当SysTick时钟频率与内核时钟频率不同时才可以定义,
单位: Hz, 默认: 不定义 */
为什么要屏蔽?是因为滴答定时器的时钟源和内核时钟源是相同的,所以不需要定义的
(6)configTICK_RATE_HZ宏定义的配置
#define configTICK_RATE_HZ 1000
/* 定义系统时钟节拍频率, 单位: Hz, 无默认需定义 */
(7)configMAX_PRIORITIES宏定义配置
#define configMAX_PRIORITIES 32
/* 定义最大优先级数, 最大优先级=configMAX_PRIORITIES-1, 无默认需定义 */
定义的最大优先级是32.因为是硬件计算,所以与硬件系统的位数有关
(8)configMINIMAL_STACK_SIZE宏定义配置
#define configMINIMAL_STACK_SIZE 128
/* 定义空闲任务的栈空间大小, 单位: Word, 无默认需定义 */
我们要创建空闲任务,不能让CPU空闲下来
(9)configMAX_TASK_NAME_LEN宏定义配置
#define configMAX_TASK_NAME_LEN 16
/* 定义任务名最大字符数, 默认: 16 */
(10) configUSE_16_BIT_TICKS宏定义配置
#define configUSE_16_BIT_TICKS 0
/* 1: 定义系统时钟节拍计数器的数据类型为16位无符号数, 无默认需定义 */
此宏用于定义系统节拍计数器的数据类型,当宏 configUSE_16_BIT_TICKS 设置为 1 时, 系统节拍计数器的数据类型为 16 位无符号整形;当宏 configUSE_16_BIT_TICKS 设置为 0 时, 系统节拍计数器的数据类型为 32 为无符号整型。
(11)configIDLE_SHOULD_YIELD宏定义配置
#define configIDLE_SHOULD_YIELD 1
/* 1: 使能在抢占式调度下,同优先级的任务能抢占空闲任务, 默认: 1 */
当宏 configIDLE_SHOULD_YIELD 设置为 1 时,在抢占调度下,同等优先级的任务可抢占 空闲任务,并延用空闲任务剩余的时间片。
(12)configUSE_TASK_NOTIFICATIONS宏定义配置
#define configUSE_TASK_NOTIFICATIONS 1
/* 1: 使能任务间直接的消息传递,包括信号量、事件标志组和消息邮箱, 默认: 1 */
当宏 configUSE_TASK_NOTIFICATIONS 设置为 1 时,开启任务通知功能。当开启任务通 知功能后,每个任务将多占用 8 字节的内存空间。
(13) configTASK_NOTIFICATION_ARRAY_ENTRIES宏定义配置
#define configTASK_NOTIFICATION_ARRAY_ENTRIES 1
/* 定义任务通知数组的大小, 默认: 1 */
此宏用于定义任务通知数组的大小。
(14) configUSE_MUTEXES宏定义配置
#define configUSE_MUTEXES 1
/* 1: 使能互斥信号量, 默认: 0 */
此宏用于使能互斥信号量,当宏 configUSE_MUTEXS 设置为 1 时,使能互斥信号量;当宏 configUSE_MUTEXS 设置为 0 时,则不使能互斥信号量。
(15)configUSE_RECURSIVE_MUTEXES宏定义配置
#define configUSE_RECURSIVE_MUTEXES 1
/* 1: 使能递归互斥信号量, 默认: 0 */
此宏用于使能递归互斥信号量,当宏 configUSE_RECURSIVE_MUTEXES 设置为 1 时,使 能递归互斥信号量;当宏 configUSE_RECURSIVE_MUTEXES 设置为 0 时,则不使能递归互斥 信号量。
(16) configUSE_COUNTING_SEMAPHORES宏定义配置
#define configUSE_COUNTING_SEMAPHORES 1
/* 1: 使能计数信号量, 默认: 0 */
此宏用于使能计数型信号量,当宏 configUSE_COUNTING_SEMAPHORES 设置为 1 时, 使能计数型信号量;当宏 configUSE_COUNTING_SEMAPHORES 设置为 0 时,则不使能计数 型信号量。
(17)configUSE_ALTERNATIVE_API宏定义配置
#define configUSE_ALTERNATIVE_API 0 /* 已弃用!!! */
此宏在 FreeRTOS V9.0.0 之后已弃用。
(18)configQUEUE_REGISTRY_SIZE宏定义配置
#define configQUEUE_REGISTRY_SIZE 8 /* 定义可以注册的信号量和消息队列的个数, 默认: 0 */
此宏用于定义可以注册的队列和信号量的最大数量。此宏定义仅用于调试使用。
(19) configUSE_QUEUE_SET宏定义配置
此宏用于使能队列集,当宏 configUSE_QUEUE_SETS 设置为 1 时,使能队列集;当宏 configUSE_QUEUE_SETS 设置为 0 时,则不使能队列集。
#define configUSE_QUEUE_SETS 1
/* 1: 使能队列集, 默认: 0 */
(20)configUSE_TIME_SLICING宏定义配置
#define configUSE_TIME_SLICING 1
/* 1: 使能时间片调度, 默认: 1 */
此宏用于使能时间片调度,当宏 configUSE_TIMER_SLICING 设置为 1 且使用抢占式调度 时,使能时间片调度;当宏 configUSE_TIMER_SLICING 设置为 0 时,则不使能时间片调度。
(21)configUSE_NEWLIB_REENTRANT宏定义配置
#define configUSE_NEWLIB_REENTRANT 0
/* 1: 任务创建时分配Newlib的重入结构体, 默认: 0 */
此宏用于为每个任务分配一个 NewLib 重 入 结 构 体 , 当 宏 configUSE_NEWLIB_REENTRANT 设置为 1 时,FreeRTOS 将为每个创建的任务的任务控制块 正点原子 FreeRTOS 开发教程 57 FreeRTOS 开发指南 中分配一个 NewLib 重入结构体。
(22)configENABLE_BACKWARD_COMPATIBILITY宏定义配置
#define configENABLE_BACKWARD_COMPATIBILITY 0
/* 1: 使能兼容老版本, 默认: 1 */
此宏用于兼容 FreeRTOS 老版本的 API 函数。
(23)configNUM_THREAD_LOCAL_STORAGE_POINTERS宏定义配置
#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0
/* 定义线程本地存储指针的个数, 默认: 0 */
此宏用于在任务控制块中分配一个线程本地存储指着数组,当此宏被定义为大于 0 时, configNUM_THREAD_LOCAL_STORAGE_POINTERS 为线程本地存储指针数组的元素个数; 当宏 configNUM_THREAD_LOCAL_STORAGE_POINTERS 为 0 时,则禁用线程本地存储指针 数组。
(24)configSTACK_DEPTH_TYPE宏定义配置
#define configSTACK_DEPTH_TYPE uint16_t
/* 定义任务堆栈深度的数据类型, 默认: uint16_t */
此宏用于定义任务堆栈深度的数据类型,默认为 uint16_t。
(25) configMESSAGE_BUFFER_LENGTH_TYPE宏定义配置
#define configMESSAGE_BUFFER_LENGTH_TYPE size_t
/* 定义消息缓冲区中消息长度的数据类型, 默认: size_t */
此宏用于定义消息缓冲区中消息长度的数据类型,默认为 size_t。
二、内存分配相关定义
1. configSUPPORT_STATIC_ALLOCATION宏定义配置
#define configSUPPORT_STATIC_ALLOCATION 0
/* 1: 支持静态申请内存, 默认: 0 */
当宏 configSUPPORT_STSTIC_ALLOCATION 设置为 1 时,FreeRTOS 支持使用静态方式 管理内存,此宏默认设置为 0。如果将 configSUPPORT_STATIC_ALLOCATION 设置为 1,用户 还 需 要 提 供 两 个 回 调 函 数 : vApplicationGetIdleTaskMemory() 和 vApplicationGetTimerTaskMemory(),更详细的内容请参考第六章的“静态创建与删除任务实验”。 2. configSUPPORT_DYNAMIC_ALLOCATION宏定义配置
#define configSUPPORT_DYNAMIC_ALLOCATION 1
/* 1: 支持动态申请内存, 默认: 1 */
当宏 configSUPPORT_DYNAMIC_ALLOCATION 设置为 1 时,FreeRTOS 支持使用动态方 式管理内存,此宏默认设置为 1。
3. configTOTAL_HEAP_SIZE宏定义配置
#define configTOTAL_HEAP_SIZE ((size_t)(10 * 1024))
/* FreeRTOS堆中可用的RAM总量, 单位: Byte, 无默认需定义 */
此宏用于定义用于 FreeRTOS 动态内存管理的内存大小,即 FreeRTOS 的内存堆,单位为 Byte。
4. configAPPLICATION_ALLOCATED_HEAP宏定义配置
#define configAPPLICATION_ALLOCATED_HEAP 0
/* 1: 用户手动分配FreeRTOS内存堆(ucHeap), 默认: 0 */
此宏用于自定义 FreeRTOS 的内存堆,当宏 configAPPLICATION_ALLOCATED_HEAP 设 置为 1 时,用户需要自行创建 FreeRTOS 的内存堆,否则 FreeRTOS 的内存堆将由编译器进行分 配。利用此宏定义,可以使用 FreeRTOS 动态管理外扩内存。
5. configSTACK_ALLOCATION_FROM_SEPARATE_HEAP宏定义胚配置
#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0
/* 1: 用户自行实现任务创建时使用的内存申请与释放函数, 默认: 0 */
此宏用于自定义动态创建和删除任务时,任务栈内存的申请与释放函数pvPortMallocStack() 和vPortFreeStack(),当宏configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 设置为1是, 用户需提供 pvPortMallocStack()和 vPortFreeStack()函数。
三、钩子函数的相关定义
所谓的钩子函数就是回调函数
1. configUSE_IDLE_HOOK
#define configUSE_IDLE_HOOK 0
/* 1: 使能空闲任务钩子函数, 无默认需定义 */
此宏用于使能使用空闲任务钩子函数,当宏 configUSE_IDLE_HOOK 设置为 1 时,使能使 用空闲任务钩子函数,用户需自定义相关钩子函数;当宏 configUSE_IDLE_HOOK 设置为 0 时, 则不使能使用空闲任务钩子函数。
2. configUSE_TICK_HOOK
#define configUSE_TICK_HOOK 0
/* 1: 使能系统时钟节拍中断钩子函数, 无默认需定义 */
此宏用于使能使用系统时钟节拍中断钩子函数,当宏 configUSE_TICK_HOOK 设置为 1 时, 使 能 使 用 系 统 时 钟 节 拍 中 断 钩 子 函 数 , 用 户 需 自 定 义 相 关 钩 子 函 数 ; 当 宏 configUSE_TICK_HOOK 设置为 0 时,则不使能使用系统时钟节拍中断钩子函数。
3. configCHECK_FOR_STACK_OVERFLOW
#define configCHECK_FOR_STACK_OVERFLOW 0
/* 1: 使能栈溢出检测方法1, 2: 使能栈溢出检测方法2, 默认: 0 */
此宏用于使能栈溢出检测,当宏 configCHECK_FOR_STACK_OVERFLOW 设置为 1 时, 使用栈溢出检测方法一;当宏 configCHECK_FOR_STACK_OVERFLOW 设置为 2 时,栈溢出 检测方法二;当宏 configCHECK_FOR_STACK_OVERFLOW 设置为 0 时,不使能栈溢出检测。
4. configUSE_MALLOC_FAILED_HOOK
#define configUSE_MALLOC_FAILED_HOOK 0
/* 1: 使能动态内存申请失败钩子函数, 默认: 0 */
此 宏 用 于 使 能 使 用 动 态 内 存 分 配 失 败 钩 子 函 数 , 当configUSE_MALLOC_FAILED_HOOK 设置为 1 时,使能使用动态内存分配失败钩子函数,用 户需自定义相关钩子函数;当宏 configUSE_MALLOC_FAILED_HOOK 设置为 0 时,则不使能 使用动态内存分配失败钩子函数。
5. configUSE_DAEMON_TASK_STARTUP_HOOK
#define configUSE_DAEMON_TASK_STARTUP_HOOK 0
/* 1: 使能定时器服务任务首次执行前的钩子函数, 默认: 0 */
此 宏 用 于 使 能 使 用 定 时 器 服 务 任 务 首 次 执 行 前 的 钩 子 函 数 , 当 宏 configUSE_DEAMON_TASK_STARTUP_HOOK 设置为 1 时,使能使用定时器服务任务首次执 行前的钩子函数,此时用户需定义定时器服务任务首次执行的相关钩子函数;当宏 configUSE_DEAMON_TASK_STARTUP_HOOK 设置为 0 时,则不使能使用定时器服务任务首 次执行前的钩子函数。
四、运行时间和任务状态统计相关定义
1. configGENERATE_RUN_TIME_STATS
#define configGENERATE_RUN_TIME_STATS 0
/* 1: 使能任务运行时间统计功能, 默认: 0 */
此宏用于使能任务运行时间统计功能,当宏 configGENERATE_RUN_TIME_STATS 设置为 正点原子 FreeRTOS 开发教程 59 FreeRTOS 开发指南 1 时,使能任务运行时间统计功能,此时用户需要提供两个函数,一个是用于配置任务运行时 间统计功能的函数 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS(),一般是完成定时器的 初始化,另一个函数是 portGET_RUN_TIME_COUNTER_VALUE(),该函数用于获取定时器的 计时值;当宏 configGENERATE_RUN_TIME_STATS 设置为 0 时,则不使能任务运行时间统计 功能。
2. configUSE_TRACE_FACILITY
#define configUSE_TRACE_FACILITY 1
/* 1: 使能可视化跟踪调试, 默认: 0 */
此宏用于使能可视化跟踪调试,当宏 configUSE_TRACE_FACILITY 设置为 1 时,使能可 视化跟踪调试;当宏 configUSE_TRACE_FACILITY 设置为 0 时,则不使能可视化跟踪调试。
3. configUSE_STATS_FORMATTING_FUNCTIONS
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
/* 1: configUSE_TRACE_FACILITY为1时,会编译vTaskList()
和vTaskGetRunTimeStats()函数,默认: 0 */
当此宏与 configUSE_TRACE_FACILITY 同时设置为 1 时,将编译函数 vTaskList()和函数 vTaskGetRunTimeStats(),否则将忽略编译函数 vTaskList()和函数 vTaskGetRunTimeStats()。
五、软件定时器相关配置
1. configUSE_TIMERS
#define configUSE_TIMERS 1
/* 1: 使能软件定时器, 默认: 0 */
此宏用于启用软件定时器功能,当宏 configUSE_TIMERS 设置为 1 时,启用软件定时器功 能;当宏 configUSE_TIMERS 设置为 0 时,则不启用软件定时器功能。
2. configTIMER_TASK_PRIORITY
#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 )
/* 定义软件定时器任务的优先级, 无默认configUSE_TIMERS为1时需定义 */
此宏用于设置软件定时器处理任务的优先级,当启用软件定时器功能时,系统会创建一个 用于处理软件定时器的软件定时器处理任务。
3. configTIMER_QUEUE_LENGTH
#define configTIMER_QUEUE_LENGTH 5
/* 定义软件定时器命令队列的长度, 无默认configUSE_TIMERS为1时需定义 */
此宏用于定义软件定时器队列的长度,软件定时器的开启、停止与销毁等操作都是通过队 列实现的。
4. configTIMER_TASK_STACK_DEPTH
#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2) /* 定义软件定时器任务的栈空间大小, 无默认configUSE_TIMERS为1时需定义 */
当启用软件定时器功能时,系统会创建 一个用于处理软件定时器的软件定时器处理任务。