以下用Freertosconfig给的顺序给出解释
硬件描述相关定义Hardware description related definitions
#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 )
系统cpu频率,比如f103用72M,720000000
#define configSYSTICK_CLOCK_HZ [Platform specific]
特殊情况定义,systick和cpu频率不同的时候定义。
cpp
/******************************************************************************/
/* Hardware description related definitions. **********************************/
/******************************************************************************/
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
#include <stdint.h>
extern uint32_t SystemCoreClock;
#endif
#define configCPU_CLOCK_HZ ( SystemCoreClock )
// #define configSYSTICK_CLOCK_HZ [Platform specific]不使用
与调度行为相关的定义Scheduling behaviour related definitions.
#define configTICK_RATE_HZ ((TickType_t)1000) //1ms
定义**系统节拍频率,**中断周期 = 1 / configTICK_RATE_HZ
时间片 大小 = (1 / configTICK_RATE_HZ) × 时间片倍数
#define configUSE_PREEMPTION 1//pre-emptive co-operative scheduling
抢占式调度1或者协作式调度0
#define configUSE_TIME_SLICING 0//Unable time slicing
禁用时间片轮转,这样就会有一个任务运行一个时间片可以接着运行下一个时间片,而不是切换任务。
// TaskA (1ms) → TaskB (1ms) → TaskA (1ms) → TaskB (1ms) ...(这个是轮转)
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1//ARM Cortex-M都有
使用针对目标硬件指令集优化的算法来选择下一个要运行的任务,使用端口优化任务选择器(依靠硬件是否有)
#define configUSE_TICKLESS_IDLE 0//无滴答空闲
当系统空闲时自动关闭 Systick 定时器,显著降低功耗,并非所有 FreeRTOS 端口都支持无节拍模式。长时间待机的设备使用
#define configMAX_PRIORITIES ( 5 )//一般5就够
最大优先级,0~5-1
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 30 )
堆栈单位是字(words),最小空闲任务栈大小1 字 = 4 字节byte,120个字节,默认一般是128,就是512个字节。任务栈主要用于任务切换时保存/恢复上下文。任务被抢占时的 CPU 寄存器值,任务函数的局部变量。
#define configMAX_TASK_NAME_LEN 10//a task's human readable name
最大任务名称长度,设置值小的时候会裁剪,比如Debug和release版本就可以设置不同的值。"GUI" (3字符 + 1个\0),这个就设置为4。
#define configTICK_TYPE_WIDTH_IN_BITS TICK_TYPE_WIDTH_64_BITS
64可以改为32和16,设置节拍计数器单位,在 1kHz 节拍频率下的最长运行时间:32位为49.7天,16位65.5秒,64位约 5.84 亿年,接着就会溢出。
#define configIDLE_SHOULD_YIELD 1//空闲应该让出
Yielding 模式空闲, 当没有更高优先级任务运行时,FreeRTOS 会运行空闲任务 (优先级 0),有任务就让出没结束的时间片给应用任务。一般1最好。这个 yielding 行为只在优先级 0 发生。
空闲任务是 FreeRTOS 内核自动创建的任务
空闲任务(完整时间片) → 应用任务(优先级0)(完整时间片) → 空闲任务...(非yielding模式)
#define configTASK_NOTIFICATION_ARRAY_ENTRIES 1//任务通知数组的大小
默认值为1,高级用法再管****
#define configQUEUE_REGISTRY_SIZE 0//默认值,禁用注册表
队列注册表是一个调试功能,没什么人会用****
#define configENABLE_BACKWARD_COMPATIBILITY 0//兼容
向过时版本兼容,一般不。
#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0//禁用 TLS指针
线程本地存储,每个任务有自己的"私有数据指针数组" ,类似于全局变量,但每个任务有独立的副本。我也不懂******
#define configUSE_MINI_LIST_ITEM 1//默认1
启用迷你列表项,就是优化内存。
#define configSTACK_DEPTH_TYPE size_t//默认值,就是uint32大小
xTaskCreate( taskFunction,
"TaskName",
stackDepth, // ← 这个参数的类型
NULL,
1,
NULL );
#define configMESSAGE_BUFFER_LENGTH_TYPE size_t//4字节大小可改
消息缓冲长度数据类型uint8_t uint16_t,节省字节。****
#define configHEAP_CLEAR_MEMORY_ON_FREE 1//默认值是0
堆内存释放自动清零。就是malloc后free,会把数据清0。不开启节约性能,开启安全性好。
#define configSTATS_BUFFER_MAX_LENGTH 0xFFFF//Defaults to 0xFFFF
0xFFFF = 65,535 字节,所需大小 = (任务数量 × 每个任务约 40-60 字符) + 头信息。
#define configUSE_NEWLIB_REENTRANT 0//默认0
Newlib 可重入支持,开启安全,但是每个任务的内存开销增加。关闭后避免多个任务同时用printf函数。
推荐配置
cpp
/******************************************************************************/
/* Scheduling behaviour related definitions. **********************************/
/******************************************************************************/
#define configTICK_RATE_HZ ((TickType_t)1000) //1ms
#define configUSE_PREEMPTION 1//pre-emptive co-operative scheduling
#define configUSE_TIME_SLICING 0//Unable time slicing
#if defined(STM32)
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
#else
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
#endif
#define configUSE_TICKLESS_IDLE 0//无响应滴答空闲
#define configMAX_PRIORITIES 5
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 30 )//120byte
#if !defined(DEBUG)
#define configMAX_TASK_NAME_LEN 5
#else
#define configMAX_TASK_NAME_LEN 10
#endif
#define configTICK_TYPE_WIDTH_IN_BITS TICK_TYPE_WIDTH_64_BITS
#define configIDLE_SHOULD_YIELD 1
#define configTASK_NOTIFICATION_ARRAY_ENTRIES 1
#define configQUEUE_REGISTRY_SIZE 8
#if !defined(DEBUG)
#define configQUEUE_REGISTRY_SIZE 0
#else
#define configQUEUE_REGISTRY_SIZE 8
#endif
#define configENABLE_BACKWARD_COMPATIBILITY 0
#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0
#define configUSE_MINI_LIST_ITEM 1
#define configSTACK_DEPTH_TYPE size_t
#define configMESSAGE_BUFFER_LENGTH_TYPE size_t
#define configHEAP_CLEAR_MEMORY_ON_FREE 0
#define configSTATS_BUFFER_MAX_LENGTH 0xFFFF
#define configUSE_NEWLIB_REENTRANT 0
软件定时器相关定义Software timer related definitions
#define configUSE_TIMERS 1//默认0
软件定时器开关。周期性任务或超时控制时启用。开启加CPU开销。
(以下定义如果上述没开启,则都无效,且都没有默认值)
#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 )//自己设置
定时器任务优先级。( configMAX_PRIORITIES - 1 ) 最高优先级。( configMAX_PRIORITIES/2)中等优先级,1,最低。 加括号一般会自己再次使用。
#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE
定时器任务栈大小。configMINIMAL_STACK_SIZE使用最小栈。 ( 1024 )
#define configTIMER_QUEUE_LENGTH 20
定时器命令队列长度。推荐10。
cpp
/******************************************************************************/
/* Software timer related definitions. ****************************************/
/******************************************************************************/
#define configUSE_TIMERS 1
#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES / 2 )//Medium
#define configTIMER_TASK_STACK_DEPTH (1024)//configMINIMAL_STACK_SIZE
#define configTIMER_QUEUE_LENGTH 10
Event Group related definitions
#define configUSE_EVENT_GROUPS 1//默认1
事件组功能开关*****
Stream Buffer related definitions
#define configUSE_STREAM_BUFFERS 1//默认1
流缓冲区。*****
cpp
/******************************************************************************/
/* Event Group related definitions. *******************************************/
/******************************************************************************/
#define configUSE_EVENT_GROUPS 1
/******************************************************************************/
/* Stream Buffer related definitions. *****************************************/
/******************************************************************************/
#define configUSE_STREAM_BUFFERS 1
内存分配相关定义Memory allocation related definitions
#define configSUPPORT_STATIC_ALLOCATION 1//默认0
静态分配。***产品级推荐。
#define configSUPPORT_DYNAMIC_ALLOCATION 1//默认
动态分配。***动态分配用于实验性验证开发挺重要,静态分配不用动态时下面heap分配可以用默认值。
一般上面两个选一个就行,API不同。
#define configTOTAL_HEAP_SIZE 4096//默认
动态分配堆大小 .bss 段。不用动态分配不需要分配堆大小。默认不大
当包含 heap_1.c、heap_2.c 或 heap_4.c 时,设置 FreeRTOS 堆的总大小(字节)。
#define configAPPLICATION_ALLOCATED_HEAP 0//默认
设置0,默认configTOTAL_HEAP_SIZE分配在.bss段中,设置1,要自己手动设置。
#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0//默认
独立堆栈分配。如果设置为 1,应用程序编写者必须提供 pvPortMallocStack()
* 和 vPortFreeStack() 的实现。
#define configENABLE_HEAP_PROTECTOR 0//默认
堆保护器configENABLE_HEAP_PROTECTOR 设置为 1 以在 heap_4.c 和 heap_5.c 中启用,前提是heapsize不是0。
帮助捕获内存损坏问题,增加运行开销。
推荐,产品级完全静态分配。如果需要开发阶段可以打开dynamic allocation并且自定义heap大小。
cpp
/******************************************************************************/
/* Memory allocation related definitions. *************************************/
/******************************************************************************/
// static memory is used instead
#define configSUPPORT_STATIC_ALLOCATION 1
#define configSUPPORT_DYNAMIC_ALLOCATION 0
// #define configTOTAL_HEAP_SIZE ( 4 * 1024 )
#define configAPPLICATION_ALLOCATED_HEAP 0
#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0
#define configENABLE_HEAP_PROTECTOR 0
中断嵌套行为Interrupt nesting behaviour configuration
这几个没有默认值,要设置好以免出错。不过stm32的例子这里给出。
#define configKERNEL_INTERRUPT_PRIORITY 0
设置Freertos的系统中断优先级
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 0
定义系统可调用Freertos的API的最高中断优先级。
// 含义:
// - 优先级高于此值的中断:不允许调用 FreeRTOS API
// - 优先级等于或低于此值的中断:可以安全调用 FreeRTOS API
#define configMAX_API_CALL_INTERRUPT_PRIORITY 0
上一个的另一种名字,stm32可以无视。
8位优先级寄存器
逻辑优先级 0 → 寄存器值 0x00 (0000 0000)
逻辑优先级 1 → 寄存器值 0x10 (0001 0000) = 16
逻辑优先级 5 → 寄存器值 0x50 (0101 0000) = 80
逻辑优先级 15 → 寄存器值 0xF0 (1111 0000) = 240
cpp
/******************************************************************************/
/* Interrupt nesting behaviour configuration. *********************************/
/******************************************************************************/
/* Cortex-M specific definitions. */
#ifdef __NVIC_PRIO_BITS
/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
#define configPRIO_BITS __NVIC_PRIO_BITS
#else
#define configPRIO_BITS 4 /* 15 priority levels */
#endif
/* The lowest interrupt priority that can be used in a call to a "set priority"
function. */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0xf
/* The highest interrupt priority that can be used by any interrupt service
routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
PRIORITY THAN THIS! (higher priorities are lower numeric values. */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
/* Interrupt priorities used by the kernel port layer itself. These are generic
to all Cortex-M ports, and do not rely on any particular library functions. */
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
/* Another name for configMAX_SYSCALL_INTERRUPT_PRIORITY - the name used depends
* on the FreeRTOS port. */
// #define configMAX_API_CALL_INTERRUPT_PRIORITY 0
可知:
// 将 16个优先级分成三个区域:
/* 区域1: 最高优先级中断 (0-4) */
// 逻辑优先级: 0-4 → 寄存器值: 0-64
// 用途:硬件错误、看门狗等不可阻塞的中断
// 特点:❌ 不允许调用 FreeRTOS API
/* 区域2: 可管理中断 (5-10) */
// 逻辑优先级: 5-10 → 寄存器值: 80-160
// 用途:UART、SPI、定时器等外设中断
// 特点:✅ 可以安全调用 FreeRTOS API
/* 区域3: 系统中断 (11-15) */
// 逻辑优先级: 11-15 → 寄存器值: 176-240
// 用途:SysTick、PendSV(FreeRTOS 系统中断)
// 特点:✅ 可以调用 FreeRTOS API,但优先级最低
钩子和回调函数相关定义Hook and callback function related definitions
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configUSE_MALLOC_FAILED_HOOK 0
#define configUSE_DAEMON_TASK_STARTUP_HOOK 0
上面是四种钩子函数,使用就用1***
#define configUSE_SB_COMPLETED_CALLBACK 0
Stream Buffer,启用流缓冲区完成回调
#define configCHECK_FOR_STACK_OVERFLOW 2//默认0
检查栈是否溢出,1和2是两种不同方法使用要提供钩子函数,0就是不检查。
cpp
/******************************************************************************/
/* Hook and callback function related definitions. ****************************/
/******************************************************************************/
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configUSE_MALLOC_FAILED_HOOK 0
#define configUSE_DAEMON_TASK_STARTUP_HOOK 0
#define configUSE_SB_COMPLETED_CALLBACK 0
#define configCHECK_FOR_STACK_OVERFLOW 0
空闲的钩子优先级最低,tick的和configKERNEL_INTERRUPT_PRIORITY有关。可以用这个设置作为屏幕刷新。
运行时和任务统计信息收集相关定义Run time and task stats gathering related definitions
0都是默认值
#define configGENERATE_RUN_TIME_STATS 0
收集每个任务的处理时间。帮助识别哪些任务消耗最多 CPU 资源,跟踪每个任务占用 CPU 的时间
#define configUSE_TRACE_FACILITY 0
启用任务结构中的额外调试信息。供调试工具使用,可视化工具很有用*******
#define configUSE_STATS_FORMATTING_FUNCTIONS 0
控制统计格式化函数的包含。常见的格式化函数包括 printf 、sprintf 、fprintf 、scanf 、sscanf 和 fscanf 等。
cpp
/******************************************************************************/
/* Run time and task stats gathering related definitions. *********************/
/******************************************************************************/
#define configGENERATE_RUN_TIME_STATS 0
#if !defined(DEBUG)
#define configUSE_TRACE_FACILITY 0
#else
#define configUSE_TRACE_FACILITY 1
#endif
#define configUSE_STATS_FORMATTING_FUNCTIONS 0