4.FreeRTOS系统配置文件详解(FreeRTOSConfig.h)

目录

一、基础配置选项

二、内存分配相关定义

三、钩子函数的相关定义

四、运行时间和任务状态统计相关定义

五、软件定时器相关配置

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时需定义 */

        当启用软件定时器功能时,系统会创建 一个用于处理软件定时器的软件定时器处理任务。

猜你喜欢

转载自blog.csdn.net/zywcxz/article/details/131520802
今日推荐