freertos 是高度可配置的。所有的可配置项都在freertosconfig.h 文件中。每一个demo 程序中都包含了一个配置好的freertosconfig.h 文件,可以以demo程序中的freertosconfig.h 文件作为模板,在其基础上加以修改。
下面先给出一个典型的freertosconfig.h 文件,然后再逐项加以说明。
#ifndef freertos_config_h
#define freertos_config_h
/* here is a good place to include header files that are required across
your application. */
#include something.h
#define configuse_preemption 1
#define configuse_idle_hook 0
#define configuse_tick_hook 0
#define configcpu_clock_hz 58982400
#define configtick_rate_hz 250
#define configmax_priorities 5
#define configminimal_stack_size 128
#define configtotal_heap_size 10240
#define configmax_task_name_len 16
#define configuse_trace_facility 0
#define configuse_16_bit_ticks 0
#define configidle_should_yield 1
#define configuse_mutexes 0
#define configuse_recursive_mutexes 0
#define configuse_counting_semaphores 0
#define configuse_alternative_api 0
#define configcheck_for_stack_overflow 0
#define configqueue_registry_size 10
#define configgenerate_run_time_stats 0
#define configuse_co_routines 0
#define configmax_co_routine_priorities 1
#define configuse_timers 1
#define configtimer_task_priority 3
#define configtimer_queue_length 10
#define configtimer_task_stack_depth configminimal_stack_size
#define configkernel_interrupt_priority [dependent of processor]
#define configmax_syscall_interrupt_priority [dependent on processor and application]
#define configassert( ( x ) ) if( ( x ) == 0 ) vcallassert( __file__, __line__ )
#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
#endif /* freertos_config_h */
可配置的参数
configuse_preemption
设为 1则采用抢占式调度器, 设为 0则采用协作式调度器。
configuse_idle_hook
设为1则使能 idle hook,设为0则禁止idle hook。
configuse_tick_hook
设为1则使能 tick hook,设为0则禁止tick hook。
configcpu_clock_hz
设置为 mcu 内核的工作频率,以hz为单位。配置freertos的时钟tick时会用到。对不同的移植代码也可能不使用这个参数。如果确定移植代码中不用它就可以注释掉这行。
configtick_rate_hz
freertos的时钟tick的频率,也就是freertos用到的定时中断的产生频率。这个频率越高则定时的精度越高,但是由此带来的开销也越大。freertos 自带的demo 程序中将tickrate 设为了1000hz只是用来测试内核的性能的。实际的应用程序应该根据需要改为较小的数值。
当多个任务共用一个优先级时,内核调度器回来每次时钟中断到来后轮转切换任务(round robin),因此,更高的tick rate 会导致任务的时间片“time slice”变短。
configmax_priorities
程序中可以使用的最大优先级。freertos 会为每个优先级建立一个链表,因此没多一个优先级都会增加些ram 的开销。所以,要根据程序中需要多少种不同的优先级来设置这个参数。
configminimal_stack_size
任务堆栈的最小大小,freertos根据这个参数来给idle task 分配堆栈空间。这个值如果设置的比实际需要的空间小,会导致程序挂掉。因此,最好不要减小demo 程序中给出的大小。
configtotal_heap_size
设置堆空间(heap)的大小。只有当程序中采用freertos 提供的内存分配算法时才会用到。
configmax_task_name_len
任务名称最大的长度,这个长度是以字节为单位的,并且包括最后的 null 结束字节。
configuse_trace_facility
如果程序中需要用到trace功能,则需将这个宏设为1。否则设为0。开启trace功能后,ram占用量会增大许多,因此在设为1之前请三思。
configuse_16_bit_ticks
将 configuse_16_bit_ticks设为 1后portticktype 将被定义为无符号的16位整形类型,configuse_16_bit_ticks 设为0 后portticktype 则被定义为无符号的32位整型。
configidle_should_yield
这个参数控制那些优先级与idle 任务相同的任务的行为,并且只有当内核被配置为抢占式任务调度时才有实际作用。
内核对具有同样优先级的任务会采用时间片轮转调度算法。当任务的优先级高于idle任务时,各个任务分到的时间片是同样大小的。
但当任务的优先级与idle任务相同时情况就有些不同了。当configidle_should_yield 被配置为1时,当任何优先级与idle 任务相同的任务处于就绪态时,idle任务会立刻要求调度器进行任务切换。这会使idle任务占用最少的cpu时间,但同时会使得优先级与idle 任务相同的任务获得的时间片不是同样大小的。因为idle任务会占用某个任务的部分时间片。
configuse_mutexes
设为 1 则程序中会包含mutex 相关的代码,设为 0 则忽略相关的代码。
configuse_recursive_mutexes
设为 1 则程序中会包含recursive mutex 相关的代码,设为 0 则忽略相关的代码。
configuse_counting_semaphores
设为 1 则程序中会包含semaphore 相关的代码,设为 0 则忽略相关的代码。
configuse_alternative_api
设为 1 则程序中会包含一些关于队列操作的额外api函数,设为 0 则忽略相关的代码。这些额外提供的api运行速度更快,但是临界区(关中断)的长度也更长。有利也有弊,是否要采用需要用户自己考虑了。
configcheck_for_stack_overflow
控制是否检测堆栈溢出。
configqueue_registry_size
队列注册表有两个作用,但是这两个作用都依赖于调试器的支持:
1. 给队列一个名字,方便调试时辨认是哪个队列。
2. 包含调试器需要的特定信息用来定位队列和信号量。
如果你的调试器没有上述功能,哪个这个注册表就毫无用处,还占用的宝贵的ram空间。
configgenerate_run_time_stats
设置是否产生运行时的统计信息,这些信息只对调试有用,会保存在ram 中,占用ram空间。因此,最终程序建议配置成不产生运行时统计信息。
configuse_co_routines
设置为1则包含co-routines 功能,如果包含了co-routines功能,则编译时需包含croutine.c 文件
configmax_co_routine_priorities
co-routines 可以使用的优先级的数量。
configuse_timers
设置为1则包含软件定时器功能。
configtimer_task_priority
设置软件定时器任务的优先级。
configtimer_queue_length
设置软件定时器任务中用到的命令队列的长度。
configtimer_task_stack_depth
设置软件定时器任务需要的任务堆栈大小。
configkernel_interrupt_priority 和 configmax_syscall_interrupt_priority
cortex-m3, pic24, dspic, pic32, superh 和 rx600 的移植代码中会使用到 configkernel_interrupt_priority.
pic32, rx600 和 cortex-m系列 会使用到 configmax_syscall_interrupt_priority
configkernel_interrupt_priority应该被设为最低优先级。
对那些只定义了 configkernel_interrupt_priority 的系统:
configkernel_interrupt_priority决定了freertos内核使用的优先级。
所有调用api函数的中断的优先级都应设为这个值,不调用api函数的中断可以设为更高的优先级。
对那些定义了configkernel_interrupt_priority 和configmax_syscall_interrupt_priority的系统:
configkernel_interrupt_priority决定了freertos内核使用的优先级。
configmax_syscall_interrupt_priority决定了可以调用api函数的中断的最高优先级。高于这个值的中断处理函数不能调用任何api 函数。
configassert
宏configassert()的作用类似c语言标准库中的宏assert(),configassert() 可以帮助调试,但是定义了configassert()后会增加程序代码,也会使程序变慢。
以include 开头参数
以 'include' 开头的宏允许我们将部分不需要的api 函数排除在编译生成的代码之外。这可以使内核代码占用更少的rom 和ram。
比如,如果代码中需要用到 vtaskdelete 函数则这样写:
#defineinclude_vtaskdelete 1
如果不需要,则这样写:
#defineinclude_vtaskdelete 0
比特币智能搬砖系统搭建自动交易量化对冲软件
月度开发者Manoharan Ramachandran:道路安全应用Drowsy Driver的骁龙处理器开发经验
微软即将推出可运行exe程序的可折叠手机/平板
需要智能家居的原因是什么
关于开关电源的激励方式解读(正激/反激)
关于FreeRTOS配置项操作解读
怎样设置上位机与PLC之间的虚拟串口 上位机如何通过USB口和PLC通信
电池瓶颈始终无法突破:Volt停产预示电动汽车末路?
Vishay发布TSOP75xxxW系列超小型SMD红外接收
金相图样分析的知识,如何进行自动图像分析
中国的智慧城市建设已进入关键期 成为了数字经济发展的新引擎
提供开放统一环境的开发平台
如何选择合适的单片机开发板
OPPOR11 Plus评测:颜值高、拍照给力、游戏流畅
指纹解锁位置固定?这种传感器让你“随心所欲”
边缘计算或将是工业4.0的核心
实现光子角动量的精确控制新技术
如何对伺服电机实施理想控制
智慧城市的建设离不开智能安防的发展 智能家居发展走向专业化
人工智能芯片推进安防迈进AI时代 终端AI芯片市场还有待拓展