系列文章目录
`
一、FreeRTOS基础(一)FreeRTOS概念
二、FreeRTOS基础(二)cubeMX生成FreeRTOS
三、FreeRTOS基础(三)FreeRTOSConfig.h文件详解
一、FreeRTOSConfig.h文件概念
FreeRTOS 的配置基本是通过在 FreeRTOSConfig.h 中使用“#define”这样的语句来定义宏定义实现的。在 FreeRTOS 的官方 demo 中,每个工程都有一个 FreeRTOSConfig.h 文件,我们在使用的时候可以参考这个文件,甚至直接复制粘贴使用。在cubeMX生成的时候选择的配置其实也是更改FreeRTOSConfig.h文件。
FreeRTOSConfig.h 为正在构建的应用程序定制 RTOS 内核 。因此它是特定于应用程序的,而非 RTOS,并且应当 位于应用程序目录,而不是 RTOS 内核源代码目录 。
在这里只写下基础的定义,官网对参数有详细讲解,一般在自己用的时候去查即可:https://www.freertos.org/zh-cn-cmn-s/a00110.html
二、‘config’ 参数
基础配置项:
configUSE_PREEMPTION:1: 抢占式调度器, 0: 协程式调度器, 无默认需定义
configUSE_PORT_OPTIMISED_TASK_SELECTION:1: 使用硬件计算下一个要运行的任务, 0: 使用软件算法计算下一个要运行的任务, 默认: 0
configUSE_TICKLESS_IDLE:1: 使能tickless低功耗模式, 默认: 0
configCPU_CLOCK_HZ:定义CPU主频, 单位: Hz, 无默认需定义
configSYSTICK_CLOCK_HZ:定义SysTick时钟频率,当SysTick时钟频率与内核时钟频率不同时才可以定义, 单位: Hz, 默认: 不定义,此参数在stm32中在f1系列需要定义,在f4及更高系列无需定义
configTICK_RATE_HZ:定义系统时钟节拍频率, 单位: Hz, 无默认需定义
configMAX_PRIORITIES:定义最大优先级数, 最大优先级=configMAX_PRIORITIES-1, 无默认需定义
configMINIMAL_STACK_SIZE:定义空闲任务的栈空间大小, 单位: Word, 无默认需定义
configMAX_TASK_NAME_LEN:定义任务名最大字符数, 默认: 16
configUSE_16_BIT_TICKS:1: 定义系统时钟节拍计数器的数据类型为16位无符号数, 无默认需定义,一般使用32位单片机,所以这一位一般为0
configIDLE_SHOULD_YIELD:1: 使能在抢占式调度下,同优先级的任务能抢占空闲任务, 默认: 1
configUSE_TASK_NOTIFICATIONS: 1: 使能任务间直接的消息传递,包括信号量、事件标志组和消息邮箱, 默认: 1
configTASK_NOTIFICATION_ARRAY_ENTRIES:定义任务通知数组的大小, 默认: 1
configUSE_MUTEXES:1: 使能互斥信号量, 默认: 0
configUSE_RECURSIVE_MUTEXES:1: 使能递归互斥信号量, 默认: 0
configUSE_COUNTING_SEMAPHORES:1: 使能计数信号量, 默认: 0
configQUEUE_REGISTRY_SIZE:定义可以注册的信号量和消息队列的个数, 默认: 0
configUSE_QUEUE_SETS:1: 使能队列集, 默认: 0
configUSE_TIME_SLICING:1: 使能时间片调度, 默认: 1
configUSE_NEWLIB_REENTRANT:1: 任务创建时分配Newlib的重入结构体, 默认: 0
configENABLE_BACKWARD_COMPATIBILITY:1: 使能兼容老版本, 默认: 1
configNUM_THREAD_LOCAL_STORAGE_POINTERS: 定义线程本地存储指针的个数, 默认: 0
configSTACK_DEPTH_TYPE:定义任务堆栈深度的数据类型, 默认: uint16_t
configMESSAGE_BUFFER_LENGTH_TYPE:定义消息缓冲区中消息长度的数据类型, 默认: size_t
内存分配相关定义:
configSUPPORT_STATIC_ALLOCATION:1: 支持静态申请内存, 默认: 0
configSUPPORT_DYNAMIC_ALLOCATION:1: 支持动态申请内存, 默认: 1
configTOTAL_HEAP_SIZE:FreeRTOS堆中可用的RAM总量, 单位: Byte, 无默认需定义
configAPPLICATION_ALLOCATED_HEAP:1: 用户手动分配FreeRTOS内存堆(ucHeap), 默认: 0
configSTACK_ALLOCATION_FROM_SEPARATE_HEAP:1: 用户自行实现任务创建时使用的内存申请与释放函数, 默认: 0
钩子函数相关定义:
configUSE_IDLE_HOOK:1: 使能空闲任务钩子函数, 无默认需定义
configUSE_TICK_HOOK:1: 使能系统时钟节拍中断钩子函数, 无默认需定义
configCHECK_FOR_STACK_OVERFLOW:1: 使能栈溢出检测方法1, 2: 使能栈溢出检测方法2, 默认: 0
configUSE_MALLOC_FAILED_HOOK:1: 使能动态内存申请失败钩子函数, 默认: 0
configUSE_DAEMON_TASK_STARTUP_HOOK:1: 使能定时器服务任务首次执行前的钩子函数, 默认: 0
运行时间和任务状态统计相关定义:
configGENERATE_RUN_TIME_STATS:1: 使能任务运行时间统计功能, 默认: 0
configUSE_TRACE_FACILITY:1: 使能可视化跟踪调试, 默认: 0
configUSE_STATS_FORMATTING_FUNCTIONS: 1: configUSE_TRACE_FACILITY为1时,会编译vTaskList()和vTaskGetRunTimeStats()函数, 默认: 0
协程相关定义:协程这个基本上都不怎么用了,官方也表示不会更新相关功能了,知道有这么个东西就行
configUSE_CO_ROUTINES:1: 启用协程, 默认: 0
configMAX_CO_ROUTINE_PRIORITIES:定义协程的最大优先级, 最大优先级=configMAX_CO_ROUTINE_PRIORITIES-1, 无默认configUSE_CO_ROUTINES为1时需定义
软件定时器相关定义:
configUSE_TIMERS:1: 使能软件定时器, 默认: 0
configTIMER_TASK_PRIORITY:定义软件定时器任务的优先级, 无默认configUSE_TIMERS为1时需定义
configTIMER_QUEUE_LENGTH:定义软件定时器命令队列的长度, 无默认configUSE_TIMERS为1时需定义
configTIMER_TASK_STACK_DEPTH:定义软件定时器任务的栈空间大小, 无默认configUSE_TIMERS为1时需定义
中断嵌套行为配置:
configLIBRARY_LOWEST_INTERRUPT_PRIORITY:中断最低优先级
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY:FreeRTOS可管理的最高中断优先级
三、可选函数
可选函数中1表示使能,如果不是为了缩小内核的话,直接全部打开为1就行。
INCLUDE_vTaskPrioritySet:设置任务优先级
INCLUDE_uxTaskPriorityGet:获取任务优先级
INCLUDE_vTaskDelete:删除任务
INCLUDE_vTaskSuspend:挂起任务
INCLUDE_xResumeFromISR:恢复在中断中挂起的任务
INCLUDE_vTaskDelayUntil:任务绝对延时
INCLUDE_vTaskDelay:任务延时
INCLUDE_xTaskGetSchedulerState:获取任务调度器状态
INCLUDE_xTaskGetCurrentTaskHandle:获取当前任务的任务句柄
INCLUDE_uxTaskGetStackHighWaterMark:获取任务堆栈历史剩余最小值
INCLUDE_xTaskGetIdleTaskHandle:获取空闲任务的任务句柄
INCLUDE_eTaskGetState:获取任务状态
INCLUDE_xEventGroupSetBitFromISR:在中断中设置事件标志位
INCLUDE_xTimerPendFunctionCall:将函数的执行挂到定时器服务任务
INCLUDE_xTaskAbortDelay:中断任务延时
INCLUDE_xTaskGetHandle:通过任务名获取任务句柄
INCLUDE_xTaskResumeFromISR:恢复在中断中挂起的任务
四、默认参数
我们看到上面的配置中部分是有默认参数的,这些如果不定义就会有一个初始定义值的,初始默认值就在portmacro.h文件里。
以configUSE_PORT_OPTIMISED_TASK_SELECTION参数为例:
#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
#endif
官网
FreeRTOS的官网是:https://www.freertos.org/,自从2023年官网也支持中文了,而且文档做的也还可以。