今天看一下和配置有关的部分,对应工程文件为FreeRTOSConfig.h
官方的解释见:https://www.freertos.org/a00110.html
在cubemx中配置的设置为:(可以看到已经做出了分类)
对应看cubemx中归类的
主要有几大类:(有些参考黄工 strongerHuang 的博客)
一. Kernel settings 系统内核参数配置:
1. USE_PREEMPTION
调度模式配置
配置为Disabled:合作式调度,即时间片轮流执行;
配置为Enabled:抢占式调度,即优先级高的任务抢先执行;
我们一般配置为 Enabled,才有使用系统的意义。
2. CPU_CLOCK_HZ
系统时钟频率
3.TICK_RATE_HZ
系统滴答,即系统每秒钟滴答的次数,可以说是系统的心跳,但需要和主频区分开来。
默认1000Hz。
4.MAX_PRIORITIES
系统最大优先级值
FreeRTOS中优先级数值越大,优先级越高。而UCOS则相反
5.MINIMAL_STACK_SIZE
最小堆栈值
6.MAX_TASK_NAME_LEN
任务名称最大长度
也就是创建任务定义任务名称的字符串长度
7.USE_16_BIT_TICKS
是否使用16位滴答计数值
配置为0:则使用32位的滴答计数值,一般在32位处理器中都是配置为0; 本设计设置为0 (Disabled)
配置为1:则使用16位的滴答计数值,一般8位或者16位处理器中配置为1。
8.IDLE_SHOULD_YIELD
是否让空闲任务“放弃”抢占
也就是说在执行与空闲任务相同优先级的任务过程中,空闲任务是否具有抢占的机会。
9.USE_MUTEXES
是否使用互斥锁
配置为0:不使用
配置为1:使用
10.USE_RECURSIVE_MUTEXES
是否使用递归互斥锁
互斥锁也叫互斥信号量,也就是说对资源“加锁”。它的作用是实现多任务间共享资源的独占式处理。简单的说,就是某个资源在某一时刻只允许一个任务处理,处理完之后才允许其他任务处理该资源。
11. USE_COUNTING_SEMAPHORES
是否使用计数型信号量功能
12. QUEUE_REGISTRY_SIZE
可添加(或登记)队列名的数量
13.USE_APPLICATION_TASK_TAG
开启之后会编译函数 vTaskSetApplicationTaskTag()和 xTaskCallApplicationTaskHook()
14.ENABLE_BACKWARD_COMPATIBILITY
FreeRTOS.h头文件包含一组#define宏,这些宏将在8.0.0之前的FreeRTOS版本中使用的数据类型的名称映射到在FreeRTOS的8.0.0版本中使用的名称。这些宏允许应用程序代码将其构建的FreeRTOS版本从8.0.0之前的版本更新为8.0.0以后的版本,而无需进行修改。在FreeRTOSConfig.h中将configENABLE_BACKWARD_COMPATIBILITY设置为0会从构建中排除这些宏,从而允许进行验证,以确保未使用8.0.0之前的版本。
FreeRTOS.h文件的某一块:
15.USE_PORT_OPTIMISED_TASK_SELECTION
默认强制为1
freertos有两种方法选择下一个要运行的任务,这里设置为1表示使用特殊方法,也就是硬件方法,有以下特点:
16.USE_TICKLESS_IDLE
低功耗模式选择
0- 关闭低功耗
1-开启低功耗,使用freertos写好的函数实现函数vPortSuppressTicksAndSleep()
2-开启低功耗,用户自己实现函数vPortSuppressTicksAndSleep()
17.USE_TASK_NOTIFICATIONS
是否开启任务通知功能,开启的话每个任务多消耗8个字节
18. RECORD_STACK_HIGH_ADDRESS
从v10开始有次配置参数
当设置为1(启用)时,堆栈开始地址将保存到每个任务的TCB中(假设堆栈向下增长)。
二. 内存管理配置
1.Memory Allocation
memory分配方式: Dynamic 动态; static 静态; Dynamic/static 动态静态都开启
2. TOTAL_HEAP_SIZE
系统总共堆(栈)大小
动态内存管理的时候使用,使用heap_x.c中的内存申请函数申请内存时,会从堆中申请
3.Memory Management scheme
内存分配实现,可参考官网解释:https://www.freertos.org/a00111.html
- heap_1 –最简单,不允许释放内存
- heap_2 –允许释放内存,但不合并相邻的空闲块。
- heap_3 –简单包装标准malloc()和free()以确保线程安全
- heap_4 –合并相邻的空闲块以避免碎片。包括绝对地址放置选项。 默认使用的heap_4
- heap_5 –按照heap_4,能够跨多个不相邻的内存区域扩展堆
三.Hook钩子函数配置
HOOK函数是提供给开发者的函数,实现自己想要实现的东西。
开启Hook之后,用户需要自己定义相应的函数
1. USE_IDLE_HOOK
是否定义IDLE空闲任务HOOK函数
在task.c中有代码
#if ( configUSE_IDLE_HOOK == 1 )
{
extern void vApplicationIdleHook( void );
/* Call the user defined function from within the idle task. This
allows the application designer to add background functionality
without the overhead of a separate task.
NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES,
CALL A FUNCTION THAT MIGHT BLOCK. */
vApplicationIdleHook();
}
#endif /* configUSE_IDLE_HOOK */
函数vApplicationIdleHook()需要用户书写。
2. USE_TICK_HOOK
是否定义TICK滴答HOOK函数
3. USE_MALLOC_FAILED_HOOK
是否定义内存分配失败HOOK函数
我们创建任务、信号量、队列等都需要耗费系统堆栈,如果我们对系统总共分配堆栈不够多,在创建多个任务或队列时容易分配失败,这个时候就起到一个提示作用。
4. USE_DAEMON_TASK_STARTUP_HOOK
是否定义守护进程HOOK函数
5. CHECK_FOR_STACK_OVERFLOW
是否定义栈溢出HOOK函数
四.运行时信息统计配置
1. GENERATE_RUN_TIME_STATS
是否生成统计信息
配置为0:否
配置为1:是
2. USE_TRACE_FACILITY
是否协助执行可视化和跟踪
配置为0:否
配置为1:是
3. USE_STATS_FORMATTING_FUNCTIONS
是否统计相关的功能
配置为0:否
配置为1:是
五. 协程配置
1. USE_CO_ROUTINES
是否使用CO_ROUTINES(协程),协程可以节省开销,但是功能有限,现在MCU的性能以及非常强大了,建议关闭协程。
2. MAX_CO_ROUTINE_PRIORITIES
CO_ROUTINE优先级
六.软件定时器配置
1. USE_TIMERS
是否开启软件定时器
若开启,需要配置额外的3个参数:
TIMER_TASK_PRIORITY
软件定时器任务优先级
TIMER_QUEUE_LENGTH
软件定时器命令队列长度
TIMER_TASK_STACK_DEPTH
软件定时器服务任务的任务堆栈大小
七.中断有关配置
1. LIBRARY_LOWEST_INTERRUPT_PRIORITY
最低优先级,STM32使用4位表示,也就是0~15个
2. LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
设置FreeRTOS可管理的最大优先级,高于此优先级的任务不归FreeRTOS管理