原文链接:http://blog.sina.com.cn/s/blog_98ee3a930102wf8c.html

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

本章节内容主要整理自官网:http://www.freertos.org/a00110.html

7.1 配置选项说明

7.2 基本配置

7.3 钩子函数配置

7.4 任务运行信息获取配置

7.5 合作式任务配置

7.6 软件定时器配置

7.7 内核配置

7.8 断言配置

7.9 函数Include配置

7.10       总结

7.1  配置选项说明

对于初学者来说,要在以后的时间里达到熟练操作FreeRTOS的配置选项。大部分的选项在FreeRTOS.h文件里面都有默认的配置。用户在使用时,把用到配置选项放在FreeRTOSConfig.h文件配置即可。

7.2   基本配置

基本配置是FreeRTOS中经常用到的配置,下面分别进行介绍,这里有个感性认识即可,随着后面的使用中会熟练起来。

7.2.1      configUSE_PREEMPTION

u  配置为1

使能抢占式调度器。

u  配置为0

使能合作式调度器。

7.2.2     configUSE_PORT_OPTIMISED_TASK_SELECTION

此配置用于优化优先级列表中要执行的最高优先级任务的算法。对CM内核的移植文件,默认已经在文件portmacro.h文件中使能。

u  通用方式---配置为0:

l  所有平台的移植文件都可以配置为0,因为这是通用方式。

l  纯C编写,比专用方式效率低。

l  可用的优先级数量不限制。

u  专用方式---配置为1:

l  部分平台支持。

l  这些平台架构有专用的汇编指令,比如CLZ(Count Leading Zeros)指令,通过这些指令可以加快算法执行速度。

l  比通用方式高效。

l  有最大优先级数限制,通常限制为32个。

7.2.3     configUSE_TICKLESS_IDLE

此配置用于使能tickless低功耗模式

u  配置为1

使能tickless低功耗模式

u  配置为0

禁能tickless低功耗模式

7.2.4     configCPU_CLOCK_HZ

此参数用于定义CPU的主频,单位Hz。

7.2.5     configTICK_RATE_HZ

此参数用于定义系统时钟节拍数,单位Hz,一般取1000Hz即可。本教程配套的例子也全部采用这个时钟节拍数。过高的的系统时钟节拍将使得FreeRTOS内核运行占用过多的时间,增加系统负荷。

7.2.6     configMAX_PRIORITIES

此参数用于定义可供用户使用的最大优先级数,如果这个定义的是5,那么用户可以使用的优先级号是0,1,2,3,4,不包含5,对于这一点,初学者要特别的注意。

7.2.7     configMINIMAL_STACK_SIZE

此参数用于定义空闲任务的栈空间大小,单位字,即4字节。

7.2.8     configTOTAL_HEAP_SIZE

定义堆大小,FreeRTOS内核,用户动态内存申请,任务栈,任务创建,信号量创建,消息队列创建等都需要用这个空间。

7.2.9     configMAX_TASK_NAME_LEN

定义任务名最大的字符数,末尾的结束符 '\0'也要计算在内。

7.2.10configUSE_16_BIT_TICKS

系统时钟节拍计数使用TickType_t数据类型定义的。

如果用户使能了宏定义 configUSE_16_BIT_TICKS,那么TickType_t定义的就是16位无符号数,如果没有使能,那么TickType_t定义的就是32位无符号数。对于32位架构的处理器,一定要禁止此宏定义,即设置此宏定义数值为0即可。而16位无符号数类型主要用于8位和16位架构的处理器。

7.2.11configIDLE_SHOULD_YIELD

此参数用于使能与空闲任务同优先级的任务,只有满足以下两个条件时,此参数才有效果:

1.     使能抢占式调度器。

2.     有创建与空闲任务同优先级的任务。

配置为1,就可以使能此特性了,实际应用中不建议用户使用此功能,将其配置为0即可。

7.2.12configUSE_TASK_NOTIFICATIONS

u  配置为1

使能任务间直接的消息传递,包含信号量,事件标志组和消息邮箱。

u  配置为0

禁能此特性。

7.2.13configUSE_MUTEXES

u  配置为1

使能互斥信号量

u  配置为0

禁能互斥信号量

7.2.14configUSE_RECURSIVE_MUTEXES

u  配置为1

使能递归互斥信号量

u  配置为0

禁能递归互斥信号量

7.2.15configUSE_COUNTING_SEMAPHORES

u  配置为1

使能计数信号量

u  配置为0

禁能计数信号量

7.2.16configUSE_ALTERNATIVE_API

此配置将在以后的版本中被删除,建议用户不要再使用。

7.2.17configQUEUE_REGISTRY_SIZE

通过此定义来设置可以注册的信号量和消息队列个数。

队列注册有两个目的,这两个目的都与内核调试有关:

u  注册队列的时候,可以给队列起一个名字,当使用调试组件的时候,通过名字可以很容易的区分不同队列。

u  通过队列的相关信息,调试器可以很容易定位队列和信号量,能够定位信号量是因为FreeRTOS信号量也是基于队列实现的。

当然,如果用户没有使用内核方面的调试器,这个宏定义是没有意义的。

7.2.18configUSE_QUEUE_SETS

u  配置为1

使能消息队列。

u  配置为0

禁能消息队列。

7.2.19configUSE_TIME_SLICING

u  配置为1

使能时间片调度。

u  配置为0

禁能时间片调度。

u  用户没有配置此选项

如果用户没有配置此选项,默认在FreeRTOS.h文件中已经配置为1,即使能时间片调度。

7.2.20configUSE_NEWLIB_REENTRANT

u  配置为1

每个任务创建的时候将分配Newlib的重入结构体。

u  配置为0

禁止此特性。

7.2.21configENABLE_BACKWARD_COMPATIBILITY

u  配置为1

使能新版本对老版本的兼容特性,即向后兼容或者说向下兼容。

u  配置为0

禁止此特性。

7.2.22configNUM_THREAD_LOCAL_STORAGE_POINTERS

此配置用于定义线程局部指针变量的个数。

7.3  钩子函数配置

钩子函数的主要功能是用于函数的扩展,用户可以根据自己的需要往里面添加相关的测试函数。

7.3.1     configUSE_IDLE_HOOK

u  配置为1

使能空闲任务的钩子函数

u  配置为0

禁能空闲任务钩子函数

7.3.2     configUSE_MALLOC_FAILED_HOOK

当创建任务,信号量或者消息队列时,FreeRTOS通过函数pvPortMalloc()申请动态内存。

u  配置为1

使能动态内存申请失败时的钩子函数

u  配置为0

禁能动态内存申请失败时的钩子函数

7.3.3     configUSE_TICK_HOOK

u  配置为1

使能滴答定时器中断里面执行的钩子函数

u  配置为0

禁能滴答定时器中断里面执行的钩子函数

7.3.4     configCHECK_FOR_STACK_OVERFLOW

FreeRTOS的栈溢出检测支持两种方法,为了方便描述,我们这里将其称之为方法一和方法二。

u  配置为2

栈溢出检测使用方法二。

u  配置为1

栈溢出检测使用方法一。

u  配置为0

禁止栈溢出检测。

7.4  任务运行信息获取配置

7.4.1     configGENERATE_RUN_TIME_STATS

u  配置为1

使能任务运行状态参数统计。

u  配置为0

禁止此特性。

7.4.2     configUSE_TRACE_FACILITY

u  配置为1

使能此配置将添加额外的结构体成员和函数,以此来协助可视化和跟踪,在使用IAR中的FreeRTOS插件时要使能这个配置,否则无法显示任务栈的使用情况。

u  配置为0

禁能此特性。

7.4.3     configUSE_STATS_FORMATTING_FUNCTIONS

用户配置宏定义configUSE_TRACE_FACILITY和configUSE_STATS_FORMATTING_FUNCTIONS都为1的时候,将使能函数vTaskList() 和 vTaskGetRunTimeStats(),如果两者中任何一个为0,那么这两个函数都将被禁能。

7.5  合作式任务配置

7.5.1     configUSE_CO_ROUTINES

u  配置为1

使能合作式调度相关函数。

u  配置为0

禁能合作式调度相关函数。

7.5.2     configMAX_CO_ROUTINE_PRIORITIES

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

7.6  软件定时器配置

7.6.1     configUSE_TIMERS

u  配置为1

使能软件定时器。

u  配置为0

禁能软件定时器。

7.6.2     configTIMER_TASK_PRIORITY

配置软件定时器任务的优先级。

7.6.3     configTIMER_QUEUE_LENGTH

配置软件定时器命令队列的长度。

7.6.4     configTIMER_TASK_STACK_DEPTH

配置软件定时器任务的栈空间大小。

7.7  内核配置

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

7.8  断言配置

FreeRTOS中的断言函数configASSERT()和标准C中的断言函数assert()是一样的,如果断言函数的参数为0时将触发断言函数的执行。

FreeRTOS的断言功能在调试阶段是非常有用的,可以有效地检查参数错误和运行中的错误,但在正式发布软件时,请将此功能关闭,因为断言功能会增加工程代码大小并降低工程执行效率。关闭断言也比较简单,如果FreeRTOSConfig.h文件中有断言的宏定义,将其注释掉即可,如果没有宏定义,默认在FreeRTOS.h文件中就是关闭的。

教程配套的例子统一采用如下的断言方法:

#define configASSERT( ( x ) )     if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }

在使用调试器的情况下,一旦出现断言失败,会关闭中断,程序会死在这个for循环中,此时用户可以很容易就锁定函数出错位置。

当然,采用下面这种方法也是可以的:

#define configASSERT( ( x ) )     if( ( x ) == 0 ) vAssertCalled( __FILE__, __LINE__ )

其中关键字 __LINE__ 表示源代码行号,关键字__FILE__表示源代码文件名。用户可以自行测试下这个函数vAssertCalled,在这个函数里面调用一下串口打印之类的功能,将出现错误的源文件和代码行号打印出来。这种方法也可以很方便的锁定出错的位置。

调试阶段出现断言失败的情况下,不限制以上两种处理方法,用户采用适合自己的方法即可。

7.9  函数Include配置

函数Include配置主要是指用户可以根据需要使能或者禁止在工程中使用相应的函数,配置为1,表示使能,即可以在工程中使用相应函数。配置为0,表示禁止,即禁止在工程中使用相应函数。可以这样设置的函数主要有如下几种:

#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文件中。

7.10总结

本章节仅是对每个配置选项进行介绍,等有了几次工程的配置经验后基本就熟练了。

转载:FreeRTOS 配置文件详细功能解释的更多相关文章

  1. 【比赛打分展示双屏管理系统-加强版】的两个ini配置文件功能解释及排行榜滚动界面的简答配置等

    加强版目录下有两个ini文件,功能解释如下: 1. ScoreTip.ini: bScoreTip:如果为1,可以启用 回避 功能 或 高低分差值超出 iScoreRange 的 提示功能. iSco ...

  2. log4j配置文件详细解释

    web.xml中配置启动log4j的配置 <!-- webAppRootKey进行配置,这里主要是让log能将日志写到对应项目根目录下 --> <!-- 定义以后,在Web Cont ...

  3. 【转】Nginx配置文件详细说明

    Nginx配置文件详细说明 在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络. #运行用户user www-data;    #启动进程,通常设置成和cpu的数量相等 ...

  4. Nginx配置文件详细说明 (转)

    Nginx配置文件详细说明 原文链接:http://www.cnblogs.com/Joans/p/4386556.html 在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收 ...

  5. Tomcat负载均衡、调优核心应用进阶学习笔记(二):Tomcat前世今生、安装、配置文件详细说明、tomcat应用程序部署、webapp 体系结构、tomcat运行方式

    文章目录 Tomcat前世今生 安装 配置文件详细说明 tomcat应用程序部署 webapp 体系结构 tomcat运行方式 Tomcat前世今生 java体系: 1 java程序设计语言 2 ja ...

  6. Nginx学习笔记(九) 配置文件详细说明

    配置文件详细说明 工作了几个月要开始做一些后台开发,免不了接触nginx,以前一般只是简单的使用,更多的分析内部模块的具体实现,为了部署需要进一步掌握配置方法. 全局配置信息 #nginx worke ...

  7. Nginx配置文件具体配置解释

    Nginx配置文件具体配置解释   #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; #全局错 ...

  8. 传奇身上装备升级系列脚本,以及UPGRADEITEMEX 脚本的详细参数解释

    UPGRADEITEMEX 脚本的详细参数解释如下: UPGRADEITEMEX 物品位置(0-12) 属性位置(0-14) 成功机率(0-100) 点数机率(0-255) 是否破碎(0,1) 物品位 ...

  9. Nginx配置文件详细解释

    转自:https://www.cnblogs.com/knowledgesea/p/5175711.html 序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开 ...

随机推荐

  1. TCP三次握手Linux源码解析

    TCP是面向连接的协议.面向连接的传输层协议在原点和重点之间建立了一条虚拟路径,同属于一个报文的所有报文段都沿着这条虚拟路径发送,为整个报文使用一条虚拟路径能够更容易地实施确认过程以及对损伤或者丢失报 ...

  2. 解决maven中某些依赖无法下载,手动安装Maven依赖

    <!--先下载jar包,然后在仓库中手动安装,下面是遇到的两个例子--> <!--第一个--> mvn install:install-file -Dfile=D:\kaptc ...

  3. Django QuerySet API---数据库接口

    基本的创建与查询 # -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import T ...

  4. Tensorflow-交叉熵&过拟合

    交叉熵 二次代价函数 原理 缺陷 假如我们目标是收敛到0.A点为0.82离目标比较近,梯度比较大,权值调整比较大.B点为0.98离目标比较远,梯度比较小,权值调整比较小.调整方案不合理. 交叉熵代价函 ...

  5. 基于final shell的linux命令

    final shell操作教程: 1.查看API实时日志:cd ../../data/log/api tail -100f anyAPI-server.log2.关闭日志:control+c3.恢复实 ...

  6. Share Memory By Communicating 一等公民

    Share Memory By Communicating - The Go Programming Language https://golang.google.cn/doc/codewalk/sh ...

  7. P1837 单人纸牌

    写在前面 感谢巨佬 yu__xuan 的帮助! 原本题解区的大佬们大都写的九层循环,其实此题如果写成状压,可以将这九层循环写成一层,非但简洁.代码可读性强,常数也比直接九维 dp 小. 算法思路 由于 ...

  8. Tomcat优化,JNDI,连接池,数据源

    什么是JNDI? JNDI的简单应用 什么是连接池技术? 连接池 性能 连接池技术与传统数据库连接的比较 连接池技术工作原理 为什么使用连接池? 传统数据库连接方式的不足 企业级开发需要稳健和高效的数 ...

  9. 子网划分、变长子网掩码和TCP/IP排错__散知识点

    1.IP零子网(ip subnet-zero):这个命令可以允许你在自己的网络设计中使用第一个和最后一个子网.例如,C类掩码192通常只可以提供子网64和128,但在使用了ip subnet-zero ...

  10. Eureka详解系列(四)--Eureka Client部分的源码和配置

    简介 按照原定的计划,我将分三个部分来分析 Eureka 的源码: Eureka 的配置体系(已经写完,见Eureka详解系列(三)--探索Eureka强大的配置体系): Eureka Client ...