目录
2.1.11、USE_COUNTING_SEMAPHORES
2.1.13、USE_APPLICATION_TASK_TAG
2.1.14、ENABLE_BACKWARD_COMPATIBILITY
2.1.15、USE_PORT_OPTIMISED_TASK_SELECTION
2.1.18、RECORD_STACK_HIGH_ADDRESS
2.2、Memory management settings
2.2.3、Memory Management scheme
2.3.4、USE_DAEMON_TASK_STARTUP_HOOK
2.3.5、CHECK_FOR_STACK_OVERFLOW
2.4.3、USE_STATS_FORMATTING_FUNCTIONS
2.6、Software timer definitions
2.7、Interrupt nesting behaviour configuration
2.7.1、LIBRARY_LOWEST_INTERRUPT_PRIORITY
2.7.2、LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
一、简介
1.1、开发环境
STM32CubeIDE V1.9。
1.2、FreeRTOS interface
CMSIS_V1。
二、Config Parameters
2.1、Kernel settings
2.1.1、USE_PREEMPTION
Enable:使用抢占式调度器,内核在每个时钟节拍中断中进行任务切换;
Disable:使用协程,内核在特定的API函数或进入阻塞态等情况下进行任务切换。
2.1.2、CPU_CLOCK_HZ
CPU 系统时钟频率源,不可更改。
2.1.3、TICK_RATE_HZ
RTOS的心跳时钟频率,设置值为每秒钟跳动次数。
2.1.4、MAX_PRIORITIES
RTOS 任务的最高优先级设置,设置值域4~32。
2.1.5、MINIMAL_STACK_SIZE
空闲任务的堆栈大小。
2.1.6、MAX_TASK_NAME_LEN
任务名称的最大字符数。
2.1.7、USE_16_BIT_TICKS
存放 Tick 周期的计数器的数字位宽,默认Disable,即 16 位。
2.1.8、IDLE_SHOULD_YIELD
Enable:当有另一个空闲优先级任务处于Ready状态时,空闲任务将不会执行它定义的功能的不止一次迭代,而不会让位于另一个任务,这确保当应用程序任务处于空闲状态时,在空闲任务中花费的时间最少, 即同 在空闲优先级下,空闲任务优先级更高,不会被抢占,不会以时间片运行;
Disable:空闲任务永远不会让位于另一个任务,只在被抢占时才会离开运行状态。
2.1.9、USE_MUTEXES
Enable:开启系统构建过程中的互斥量;
Disable:关闭系统构建过程中的互斥量。
2.1.10、USE_RECURSIVE_MUTEXES
Enable:开启系统构建过程中的递归互斥量;
Disable:关闭系统构建过程中的递归互斥量。
2.1.11、USE_COUNTING_SEMAPHORES
Enable:开启系统构建过程中的信号量;
Disable:关闭系统构建过程中的信号量。
2.1.12、QUEUE_REGISTRY_SIZE
队列注册表的大小,默认为8,用于管理队列名称和队列实体,便于运行中进行查看与管理。
2.1.13、USE_APPLICATION_TASK_TAG
Enable:给任务一个 TAG 标签;
Disable:无。
2.1.14、ENABLE_BACKWARD_COMPATIBILITY
Enable:FreeRTOS 8.0.0 之后的版本可以通过宏定义使用 8.0.0 版本之前的函数接口。
2.1.15、USE_PORT_OPTIMISED_TASK_SELECTION
查找下一个任务方式的选择,查找下一个就绪任务就是查找优先级表,对优先级表进行导0算法,分为通用切换或者针对性切换。
Enable:针对性切换,使用处理器自带的导0指令,使用汇编编写,切换效率高,但兼容性差;
Disable:通用切换,使用C编写,执行效率低,兼容性高。
2.1.16、USE_TICKLESS_IDLE
Enable:生成两个空函数PreSleepProcessing和PostSleepProcessing,用户可以编写代码进入低功耗模式。
2.1.17、USE_TASK_NOTIFICATIONS
任务通知使能,每个RTOS任务都有一个32位的通知值,直接发送给任务事件,可以解除接收任务的阻塞,并可选地更新接收任务的通知值。
Enable:开启;
Disable:关闭。
2.1.18、RECORD_STACK_HIGH_ADDRESS
Enable:记录任务的堆栈入口地址到TCB。
2.2、Memory management settings
2.2.1、Memory Allocation
内存分配方式:动态和静态。
Dynamic:动态;
Static:静态。
2.2.2、OTAL_HEAP_SIZE
内存堆的分配大小。设置时,要满足所有任务的最小使用要求,但不要超过系统分配上限。
2.2.3、Memory Management scheme
内存分配方式,分为:heap_1.c、heap_2.c、heap_3.c、heap_4.c、heap_5.c。
方式 | 优点 | 缺点 |
---|---|---|
heap_1.c | 分配简单,时间确定 | 只分配、不回收 |
heap_2.c | 动态分配、最佳匹配 | 碎片、时间不定 |
heap_3.c | 调用标准库函数 | 速度慢、时间不定 |
heap_4.c | 相邻空闲内存可合并,解决碎片问题 | 时间不定 |
heap_5.c | 在heap_4基础上支持分隔的内存块,可解决碎片问题 | 时间不定 |
2.3、Hook function related definitions
2.3.1、USE_IDLE_HOOK
Enable:系统生成一个空回调函数"void vApplicationIdleHook()",由用户编写函数主体。每执行1次空闲任务,执行一次该钩子函数。
2.3.2、USE_TICK_HOOK
Enable:系统生成一个空回调函数"void vApplicationTickHook()",由用户编写函数主体。每个TICK周期,执行一次该钩子函数。
该钩子函数从Tick中断执行,因此执行时间要短,并且不调用非中断使用的API函数(FROM_ISR结尾)。
2.3.3、USE_MALLOC_FAILED_HOOK
Enable:系统生成一个空回调函数"void vApplicationMallocFailedHook()",由用户编写函数主体。每当申请动态内存失败时,执行一次该钩子函数。
2.3.4、USE_DAEMON_TASK_STARTUP_HOOK
Enable:系统生成一个空回调函数"void vApplicationDaemonTaskStartupHook()",由用户编写函数主体。任务刚启动时,执行一次该钩子函数。
2.3.5、CHECK_FOR_STACK_OVERFLOW
Enable:系统生成一个空回调函数"void vApplicationStackOverflowHook( xTaskHandle xTask, signed char *pcTaskName )",由用户编写函数主体。任务栈溢出时,执行一次该钩子函数,传入任务 TCB 和任务名称。
2.4、Run time and task stats gathering related definitions
2.4.1、GENERATE_RUN_TIME_STATS
Enable:开启时间统计功能。在调用"vTaskGetRunTimeStats() "函数时,将任务运行时间信息保存到可读列表中。
2.4.2、USE_TRACE_FACILITY
Enable:包含额外的结构成员和函数以帮助执行可视化和跟踪,方便 MDK 软件工具调试使用。
2.4.3、USE_STATS_FORMATTING_FUNCTIONS
Enable:生成 "vTaskList() "和 "vTaskGetRunTimeStats() "函数用于获取任务运行状态。
2.5、Co-routine related definitions
协程的配置项。两个选项用来配置协程是否开启,以及协程的优先级。
开启后,需要用户手动创建协程。
2.6、Software timer definitions
USE_TIMERS:Enable:开启软件定时器任务。Enable后,会出现以下3个新的选项:
TIMER_TASK_PRIORITY:设置软件计时器服务/守护进程任务的优先级,值域0~4;
TIMER_QUEUE_LENGTH:设置软件计时器命令队列的长度,值域1~255;
TIMER_TASK_STACK_DEPTH:设置分配给计时器服务任务的堆栈的大小(单位是字,不是字节),值域128~16.384K。
2.7、Interrupt nesting behaviour configuration
2.7.1、LIBRARY_LOWEST_INTERRUPT_PRIORITY
用来设置最低优先级。
FreeRTOS 使用4位优先级,对应16个优先级数,最低优先级为15。
2.7.2、LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
设置FreeRTOS 可管理的最大优先级,也就是设置阈值优先级。
默认设置5,也就是高于5 的优先级(优先级数小于5)不归 FreeRTOS 管理。