FreeRTOSConfig 配置文件详解

以下转载自安富莱电子: http://forum.armfly.com/forum.php

本章节为大家讲解 FreeRTOS 的配置文件 FreeRTOSConfig.h 中每个选项的作用。初学的话,一定要有个了解,随着以后的学习一定要熟练操作每个配置选项。 

基本配置:

configUSE_PREEMPTION
配置为 1
使能抢占式调度器。
配置为 0

使能合作式调度器。

configUSE_PORT_OPTIMISED_TASK_SELECTION

此配置用于优化优先级列表中要执行的最高优先级任务的算法。 对 CM 内核的移植文件,默认已经在
文件 portmacro.h 文件中使能。
通用方式---配置为 0:
所有平台的移植文件都可以配置为 0,因为这是通用方式。
纯 C 编写,比专用方式效率低。
可用的优先级数量不限制。
专用方式---配置为 1:
部分平台支持。
这些平台架构有专用的汇编指令,比如 CLZ(Count Leading Zeros)指令,通过这些指令可以
加快算法执行速度。
比通用方式高效。
有最大优先级数限制,通常限制为 32 个。

configUSE_TICKLESS_IDLE
此配置用于使能 tickless 低功耗模式
配置为 1
使能 tickless 低功耗模式
配置为 0
禁能 tickless 低功耗模式
configCPU_CLOCK_HZ
此参数用于定义 CPU 的主频,单位 Hz。
 configTICK_RATE_HZ
此参数用于定义系统时钟节拍数,单位 Hz,一般取 1000Hz 即可。 本教程配套的例子也全部采用这
个时钟节拍数。过高的的系统时钟节拍将使得 FreeRTOS 内核运行占用过多的时间,增加系统负荷。

configMAX_PRIORITIES
此参数用于定义可供用户使用的最大优先级数,如果这个定义的是 5,那么用户可以使用的优先级号
是 0,1,2,3,4,不包含 5,对于这一点,初学者要特别的注意。
configMINIMAL_STACK_SIZE
此参数用于定义空闲任务的栈空间大小,单位字,即 4 字节。
configTOTAL_HEAP_SIZE
定义堆大小,FreeRTOS 内核,用户动态内存申请,任务栈,任务创建,信号量创建,消息队列创建
等都需要用这个空间。
configMAX_TASK_NAME_LEN
定义任务名最大的字符数,末尾的结束符 '\0'也要计算在内。

configUSE_16_BIT_TICKS
系统时钟节拍计数使用 TickType_t 数据类型定义的。
如果用户使能了宏定义 configUSE_16_BIT_TICKS,那么 TickType_t 定义的就是 16 位无符号数,如
果没有使能,那么 TickType_t 定义的就是 32 位无符号数。 对于 32 位架构的处理器,一定要禁止此宏定
义,即设置此宏定义数值为 0 即可。 而 16 位无符号数类型主要用于 8 位和 16 位架构的处理器。
configIDLE_SHOULD_YIELD
此参数用于使能与空闲任务同优先级的任务,只有满足以下两个条件时,此参数才有效果:
1. 使能抢占式调度器。
2. 有创建与空闲任务同优先级的任务。
配置为 1,就可以使能此特性了,实际应用中不建议用户使用此功能,将其配置为 0 即可。
configUSE_TASK_NOTIFICATIONS
配置为 1
使能任务间直接的消息传递,包含信号量,事件标志组和消息邮箱。
配置为 0
禁能此特性。
configUSE_MUTEXES
配置为 1
使能互斥信号量
配置为 0
禁能互斥信号量
configUSE_RECURSIVE_MUTEXES
配置为 1
使能递归互斥信号量
配置为 0
禁能递归互斥信号量
configUSE_COUNTING_SEMAPHORES
配置为 1
使能计数信号量
配置为 0
禁能计数信号量
configUSE_ALTERNATIVE_API
此配置将在以后的版本中被删除,建议用户不要再使用。
configQUEUE_REGISTRY_SIZE
通过此定义来设置可以注册的信号量和消息队列个数。
队列注册有两个目的,这两个目的都与内核调试有关:
注册队列的时候,可以给队列起一个名字,当使用调试组件的时候,通过名字可以很容易的区分不同
队列。
通过队列的相关信息,调试器可以很容易定位队列和信号量,能够定位信号量是因为 FreeRTOS 信号
量也是基于队列实现的。
当然,如果用户没有使用内核方面的调试器,这个宏定义是没有意义的。
configUSE_QUEUE_SETS
配置为 1
使能消息队列。
配置为 0
禁能消息队列。
configUSE_TIME_SLICING
配置为 1
使能时间片调度。
配置为 0
禁能时间片调度。
用户没有配置此选项
如果用户没有配置此选项,默认在 FreeRTOS.h 文件中已经配置为 1,即使能时间片调度。
configUSE_NEWLIB_REENTRANT
配置为 1
每个任务创建的时候将分配 Newlib 的重入结构体。
配置为 0
禁止此特性。
configENABLE_BACKWARD_COMPATIBILITY
配置为 1
使能新版本对老版本的兼容特性,即向后兼容或者说向下兼容。
配置为 0
禁止此特性。
configNUM_THREAD_LOCAL_STORAGE_POINTERS
此配置用于定义线程局部指针变量的个数。


 钩子函数配置:
钩子函数的主要功能是用于函数的扩展,用户可以根据自己的需要往里面添加相关的测试函数。
configUSE_IDLE_HOOK
配置为 1
使能空闲任务的钩子函数
配置为 0
禁能空闲任务钩子函数
configUSE_MALLOC_FAILED_HOOK
当创建任务,信号量或者消息队列时,FreeRTOS 通过函数 pvPortMalloc()申请动态内存。
配置为 1
使能动态内存申请失败时的钩子函数
配置为 0
禁能动态内存申请失败时的钩子函数
configUSE_TICK_HOOK
配置为 1
使能滴答定时器中断里面执行的钩子函数
配置为 0
禁能滴答定时器中断里面执行的钩子函数
configCHECK_FOR_STACK_OVERFLOW
FreeRTOS 的栈溢出检测支持两种方法,为了方便描述,我们这里将其称之为方法一和方法二。
配置为 2
栈溢出检测使用方法二
配置为 1
栈溢出检测使用方法一。
配置为 0
禁止栈溢出检测。


任务运行信息获取配置:
configGENERATE_RUN_TIME_STATS
配置为 1
使能任务运行状态参数统计。
配置为 0
禁止此特性。
 configUSE_TRACE_FACILITY
配置为 1
使能此配置将添加额外的结构体成员和函数,以此来协助可视化和跟踪,在使用 IAR 中的 FreeRTOS
插件时要使能这个配置,否则无法显示任务栈的使用情况
配置为 0
禁能此特性。
configUSE_STATS_FORMATTING_FUNCTIONS
用户配置宏定义 configUSE_TRACE_FACILITY 和 configUSE_STATS_FORMATTING_FUNCTIONS
都为 1 的时候,将使能函数 vTaskList() 和 vTaskGetRunTimeStats(),如果两者中任何一个为 0,那么
这两个函数都将被禁能。


合作式任务配置:
configUSE_CO_ROUTINES
配置为 1
使能合作式调度相关函数。
配置为 0
禁能合作式调度相关函数。
configMAX_CO_ROUTINE_PRIORITIES
此参数用于定义可供用户使用的最大的合作式任务优先级数,如果这个定义的是 5,那么用户可以使
用的优先级号是 0,1,2,3,4,不包含 5,对于这一点,初学者要特别的注意。


软件定时器配置:
configUSE_TIMERS
配置为 1
使能软件定时器。
配置为 0
禁能软件定时器。
configTIMER_TASK_PRIORITY
配置软件定时器任务的优先级。
configTIMER_QUEUE_LENGTH
配置软件定时器命令队列的长度。
configTIMER_TASK_STACK_DEPTH
配置软件定时器任务的栈空间大小。

 

内核配置
内核配置相关的几个宏定义参看第 12 章的 12.3 小节,这几个配置稍复杂些,专门放在了 12.3 小节
进行详细说明。

 

断言配置
FreeRTOS 中的断言函数 configASSERT()和标准 C 中的断言函数 assert()是一样的, 如果断言函数的
参数为 0 时将触发断言函数的执行。
FreeRTOS 的断言功能在调试阶段是非常有用的,可以有效地检查参数错误和运行中的错误,但在正
式发布软件时,请将此功能关闭,因为断言功能会增加工程代码大小并降低工程执行效率。 关闭断言也比
较简单,如果 FreeRTOSConfig.h 文件中有断言的宏定义,将其注释掉即可,如果没有宏定义,默认在
FreeRTOS.h 文件中就是关闭的。
教程配套的例子统一采用如下的断言方法:
/* Define configASSERT() to disable interrupts and sit in a loop. */
#define configASSERT( ( x ) ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
在使用调试器的情况下,一旦出现断言失败,会关闭中断,程序会死在这个 for 循环中,此时用户可以很
容易就锁定函数出错位置。
当然,采用下面这种方法也是可以的:
/* Define configASSERT() to call vAssertCalled() if the assertion fails. The assertion
has failed if the value of the parameter passed into configASSERT() equals zero. */
#define configASSERT( ( x ) ) if( ( x ) == 0 ) vAssertCalled( __FILE__, __LINE__ )
其中关键字 __LINE__ 表示源代码行号,关键字__FILE__表示源代码文件名。 用户可以自行测试下这个函
数 vAssertCalled,在这个函数里面调用一下串口打印之类的功能,将出现错误的源文件和代码行号打印
出来。 这种方法也可以很方便的锁定出错的位置。
调试阶段出现断言失败的情况下,不限制以上两种处理方法,用户采用适合自己的方法即可。

 

函数 Include 配置
函数 Include 配置主要是指用户可以根据需要使能或者禁止在工程中使用相应的函数,配置为 1,表
示使能,即可以在工程中使用相应函数。 配置为 0,表示禁止,即禁止在工程中使用相应函数。可以这样
设置的函数主要有如下几种:
/* Optional functions - most linkers will remove unused functions anyway. */
#define INCLUDE_vTaskPrioritySet 1
#define INCLUDE_uxTaskPriorityGet 1
#define INCLUDE_vTaskDelete 1
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_xResumeFromISR 1
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1
#define INCLUDE_xTaskGetSchedulerState 1
#define INCLUDE_xTaskGetCurrentTaskHandle 1
#define INCLUDE_uxTaskGetStackHighWaterMark 0
#define INCLUDE_xTaskGetIdleTaskHandle 0
#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0
#define INCLUDE_pcTaskGetTaskName 0
#define INCLUDE_eTaskGetState 0
#define INCLUDE_xEventGroupSetBitFromISR 1
#define INCLUDE_xTimerPendFunctionCall 0
对于配置 1,但用户在工程中没有用到的函数,编译器一般都会把这些冗余函数删掉,不会添加到最终的
hex 文件中。
总结
本章节仅是对每个配置选项进行介绍,等有了几次工程的配置经验后基本就熟练了。

 

 

posted @ 2017-06-29 16:46  Crystal_Guang  阅读(16794)  评论(1编辑  收藏  举报