一、配置参数
1.1 API信息
1.2 版本信息
版本信息 FreeRTOS版本为10.3.1 CMSIS-RTOS 版本为2.00
如果我们不用CubeMX配置的话 还是推荐移植正点原子的,因为它的裁剪头文件比较清晰
就是那个conf的头文件,一键配置的话很方便。可能会跟原版移植的Freertos有些出入
1.3 MPU/FPU
不使用内存保护单元和浮点运算单元 M4内核是支持浮点运算的
1.4 内核设置
1 使用抢占式调度
2 CPU时钟频率使用SystemCoreClock
不分频的情况下,系统时钟来源于HCLK时钟 ,可以8分频或不分频
SystemCoreClock = HCLK or HLCK/8
需要1us中断一次的话 就设置tickRate=1e6
SystemCoreClock的计算可以看如下文章
STM32F407VET6 学习笔记3:内核定时器SystemTick(SysTick)初始化中断_stm32f407vet6定时器-CSDN博客
STM32定时器时钟配置问题说明SystemCoreClock-电子工程世界
STM32——SysTick timer(STK)----系统定时器_stm32 systemcoreclock-CSDN博客
3 时钟节拍频率为 1000Hz
也就是1ms中断1次
4 最大优先级数量为 56
我仿写的RTOS只设置了32级优先级 对应uint32_t 这个数据类型
5 最小栈大小为 128 Words
说是栈大小 就是任务自己带的栈,用于任务切换
6 最大任务名称长度为 16
7 使用 16 位时钟节拍被设置为禁用
如果 “使用 16 位时钟节拍” 被启用,意味着 FreeRTOS 使用一个 16 位的变量来表示时钟节拍计数器。如果被禁用,那么通常会使用一个不同位数的计数器(可能是 32 位等)来表示时钟节拍。
8 空闲任务应该让步(IDLE_SHOULD_YIELD)被设置为启用
空闲任务在执行过程中,如果有更高优先级的任务就绪,空闲任务会主动让出 CPU 使用权,让更高优先级的任务立即执行
9 使用互斥量被设置为启用
当 “使用互斥量被设置为启用” 时,FreeRTOS 允许任务使用互斥量来保护共享资源。任务在访问共享资源之前,需要先获取互斥量。如果互斥量已经被其他任务占用,当前任务将进入阻塞状态,直到互斥量被释放。
10 使用递归互斥量被设置为启用
当 “使用递归互斥量被设置为启用” 时,FreeRTOS 允许任务使用递归互斥量来保护共享资源。任务可以根据需要多次获取递归互斥量,而不会陷入死锁状态。
就是拥有互斥锁的任务可以重复获取互斥锁。原本互斥锁基于二值信号量开发,只能获取一次,本人释放后,其他人才能 获取
11 使用计数信号量被设置为启用
计数信号量可以用于管理有限数量的资源。例如,如果有多个任务需要访问一组共享的硬件资源,而这些资源的数量是有限的,可以使用计数信号量来确保只有一定数量的任务能够同时访问这些资源。
12 队列注册表大小为 8
当队列注册表大小为 8 时,这意味着系统最多可以同时创建 8 个不同的队列。如果尝试创建超过 8 个队列,可能会导致创建失败或者其他错误
13 使用应用任务标签被设置为禁用
当 “使用应用任务标签被设置为禁用” 时,FreeRTOS 不会为任务分配或使用任务标签。这意味着在任务创建、调度和管理过程中,不会考虑任务标签的存在。
14 启用向后兼容性(ENABLE_BACKWARD_COMPATIBILTY)被设置为启用
当 “启用向后兼容性” 被设置为启用时,FreeRTOS 会采取一些措施来确保新版本的 FreeRTOS 能够与旧版本的代码和配置兼容。
15 使用端口优化的任务选择(USE_PORT_OPTIMISED_TASK_SELECTION)被设置为禁用
当该选项被设置为禁用时,FreeRTOS 将不使用端口优化的任务选择机制。这意味着任务切换将按照默认的方式进行,可能没有利用特定的硬件特性或编译器优化
16 使用无滴答空闲模式(USE_TICKLESS_IDLE)被设置为禁用
当该选项被设置为禁用时,FreeRTOS 将不会进入无滴答空闲模式。这意味着即使系统处于空闲状态,定时器仍会按照正常的频率产生时钟节拍
17 使用任务通知(USE_TASK_NOTIFICATIONS)被设置为启用
当该选项被设置为启用时,FreeRTOS 允许任务使用任务通知进行通信和同步。开发者可以在代码中调用相关的函数来发送和接收任务通知
18 记录栈高地址(RECORD_STACK_HIGHADDRESS)被设置为禁用
当该选项被设置为禁用时,FreeRTOS 不会在任务控制块中记录任务栈的高地址。这意味着在调试和分析任务栈使用情况时,无法直接获取任务栈的高地址信息
1.5 内存管理设置
1 内存分配方式为动态 / 静态(Memory Allocation Dynamic /Static)
2 总堆大小为 15360 字节(TOTAL_HEAP_SIZE 15360 Bytes)
总堆大小为 15360 字节表示系统中可用于动态分配的内存总量为 15360 字节。这限制了任务和其他组件可以请求的最大内存量
3 内存管理方案为 heap_4(Memory Management scheme heap_4)
heap_4 是 FreeRTOS 提供的一种内存管理方案。它用于管理系统的动态内存分配,确保任务和其他组件能够在需要时获取内存,并在不再需要时释放内存。
1.6 钩子函数相关定义
1 使用空闲钩子函数(USE_IDLE_HOOK)被设置为禁用
空闲钩子函数(Idle Hook Function)是 FreeRTOS 提供的一种机制,允许在系统处于空闲状态时执行特定的代码。当没有其他任务可执行时,FreeRTOS 会调用空闲钩子函数,开发者可以在这个函数中执行一些低优先级的任务,如进入低功耗模式、进行系统监控等
2 使用滴答钩子函数(USE_TICK_HOOK)被设置为禁用
滴答钩子函数(Tick Hook Function)是一种在 FreeRTOS 系统时钟节拍(tick)发生时可以被调用的函数。它提供了一种在系统定时基础上执行特定操作的机制。例如,可以在滴答钩子函数中进行任务调度的微调、统计时间、执行周期性的任务等
3 使用内存分配失败钩子函数(USE_MALLOC_FAILED_HOOK)被设置为禁用
内存分配失败钩子函数(Malloc Failed Hook Function)是在 FreeRTOS 中当动态内存分配请求失败时可以被调用的函数。这个钩子函数提供了一种机制,让开发者在内存分配失败时执行特定的处理逻辑,例如记录错误信息、尝试释放其他资源以重新进行分配或者采取一些应急措施
4 使用守护任务启动钩子函数(USE_DAEMON_TASK_STARTUP_HOOK)被设置为禁用
守护任务启动钩子函数是 FreeRTOS 提供的一个可定制化机制,它会在守护任务启动时被调用。守护任务通常用于执行一些系统后台的、持续运行的、相对低优先级的操作,比如系统资源监控、维护系统状态的一致性等。而这个启动钩子函数就给开发者提供了一个机会,能在守护任务刚开始运行的这个特定节点,插入自定义的代码逻辑,来进行一些初始化操作、设置特定的参数或者执行与守护任务紧密相关的准备工作等
5 检查栈溢出(CHECK_FOR_STACK_OVERFLOW)被设置为禁用
在多任务系统里,每个任务都有自己独立的任务栈,用于存储局部变量、函数调用时的返回地址、寄存器值等信息。栈溢出就是指在任务执行过程中,往栈里写入的数据超出了预先分配给该任务栈的内存空间大小,这可能会导致数据覆盖其他内存区域,进而引发系统不稳定、程序崩溃甚至出现安全隐患等严重问题。而开启栈溢出检查功能,FreeRTOS 会采用一定的机制来监测任务栈是否出现了这种溢出的情况,以便及时发现并处理问题
1.7 运行时和任务统计收集相关定义
1 生成运行时统计信息(GENERATE_RUN_TIME_STATS)被设置为禁用
当 “生成运行时统计信息(GENERATE_RUN_TIME_STATS)” 被设置为禁用时,意味着 FreeRTOS 不会主动去收集和整理上述这些关于任务及系统运行状态的相关统计数据。系统在运行过程中,不会生成对应的统计报告供开发者查看和分析
2 使用跟踪设施(USE_TRACE_FACILTY)被设置为启用
当该选项被设置为启用时,FreeRTOS 会启用跟踪设施,开始记录系统中的各种事件。开发者可以通过特定的接口或工具来访问这些跟踪信息,以了解系统的运行情况
3 使用统计信息格式化函数(USESTATS_FORMATTING_FUNCTIONS)被设置为禁用
当该选项被设置为禁用时,FreeRTOS 不会调用统计信息格式化函数来处理和呈现统计信息。这意味着系统运行时产生的统计数据将以原始的、未经格式化的形式存在,可能不便于开发者直接查看和分析
1.8 协程相关定义(最初的freeRTOS支持这个携程 现在不更新了)
1 使用协程 禁用
协程是一种轻量级的用户态线程,它允许在单个线程内实现多个任务的并发执行。协程可以暂停和恢复执行,从而实现协作式多任务处理。与传统的线程相比,协程的创建和切换开销通常较小,并且可以更好地利用系统资源
2 最大协程优先级 2
优先级范围:这表明协程的优先级取值范围是有限的,最高为 2。这意味着在系统中,协程的优先级可以是 0、1 或 2
1.9 软件定时器定义
1 使用定时器 启用
定时任务调度:启用软件定时器后,FreeRTOS 会在后台管理软件定时器的运行。当一个软件定时器到期时,系统会触发相应的定时器回调函数,从而执行预定的任务。这为实现周期性任务或在特定时间后执行特定操作提供了方便的机制
2 定时器任务优先级 2
相对优先级:定时器任务被赋予了优先级 2。这意味着在系统中,相对于其他任务,定时器任务具有一定的优先级水平。如果有其他任务的优先级高于 2,那么在资源竞争时,那些高优先级任务会先得到执行;如果没有更高优先级的任务处于就绪状态,定时器任务将有机会执行
3 定时器队列长度 10
容量限制:这意味着该定时器队列最多可以容纳 10 个定时器。如果创建的定时器数量超过 10 个,可能会导致一些定时器无法被正确添加到队列中,或者需要采取其他的处理方式
4 定时器任务栈深度 256 字
内存分配:这意味着为定时器任务分配的栈空间大小为 256 个字。这里的 “字” 通常是指处理器的字长,例如在 32 位处理器上,一个字可能是 4 个字节
1.10 中断嵌套行为配置
1 库最低中断优先级 15
这表明在 FreeRTOS 使用的这个特定库中,中断优先级被设定在一个特定的数值范围内,而 15 是这个范围内的最低优先级值。优先级数值通常是相对的,数值越小表示优先级越高
2 库最大系统调用中断优先级5
优先级级别界定:表明在该库中,系统调用中断的优先级被限制在一个特定的范围内,其中最大值为 5。这意味着系统调用中断在优先级层级中处于相对较高的位置,但并非最高优先级
1.11 自 10.2.1 版本添加的支持
1 消息缓冲区长度类型 size_t
size_t
是一种无符号整数类型,通常用于表示对象的大小或长度
2 使用 POSIX 错误号 禁用
禁用使用 POSIX 错误号意味着在软件运行过程中,不会使用 POSIX 标准定义的错误号来表示函数调用的错误状态
1.12 CMSIS-RTOS V2 标志
1 使用 OS2 线程挂起恢复 启用
启用 OS2 线程挂起恢复意味着在软件中可以使用这个特定的线程管理功能。开发者可以在需要的时候挂起特定的线程,以控制其执行时机,或者在适当的时候恢复被挂起的线程,使其继续执行任务
2 使用 OS2 线程枚举 启用
启用 OS2 线程枚举意味着可以在软件中使用这个特定的功能来获取线程信息。开发者可以通过调用相应的 API 或使用特定的工具来枚举系统中的线程。
3 使用 OS2 中断服务程序中的事件标志 启用
启用 OS2 中断服务程序中的事件标志意味着在 OS/2 系统的中断服务程序中可以使用事件标志来进行同步和通信。开发者可以在中断服务程序中设置事件标志,以通知其他任务或线程某个特定的事件已经发生,从而触发相应的处理
4 使用 OS2 线程标志 启用
启用 OS2 线程标志意味着在软件中可以使用这个特定的功能来标识和操作线程的状态。开发者可以通过设置和读取线程标志来实现线程间的通信和同步。
5 使用 OS2 定时器 启用
启用 OS2 定时器意味着在软件中可以使用这个特定的功能。开发者可以创建和配置定时器,指定触发时间间隔和要执行的操作
6 使用 OS2 互斥量 启用
启用 OS2 互斥量意味着可以在程序中利用互斥量来保护共享资源。开发者能够创建互斥量对象,并在访问共享资源的代码段前后对互斥量进行加锁和解锁操作
二、包含参数(一些API接口函数)
以下是对表格中各项内容的解释:
**一、表格中各项的通用含义** 这些都是与 FreeRTOS(一种实时操作系统内核)相关的函数或功能配置项。其中,“Enabled”表示该功能被启用,“Disabled”表示该功能被禁用。
**二、具体各项的解释**
1. `vTaskPrioritySet`:启用时可以设置任务的优先级。
2. `uxTaskPriorityGet`:启用时可以获取任务的优先级。
3. `vTaskDelete`:启用时可以删除任务。
4. `vTaskCleanUpResources`:若启用,可能用于清理任务占用的资源;禁用时则不执行相应的资源清理操作。
5. `vTaskSuspend`:启用时可以挂起任务。
6. `vTaskDelayUntil`:启用时可以使任务延迟到特定的时间点。
7. `vTaskDelay`:启用时可以使任务延迟指定的时间。
8. `xTaskGetSchedulerState`:启用时可以获取调度器的状态。
9. `xTaskResumeFromISR`:启用时可以从中断服务程序中恢复任务。
10. `xQueueGetMutexHolder`:启用时可能用于获取互斥信号量的持有者信息(与队列相关的互斥操作)。
11. `xSemaphoreGetMutexHolder`:若启用,可能用于获取信号量的互斥持有者信息;禁用时则不能执行此操作。
12. `pcTaskGetTaskName`:若启用,可能用于获取任务的名称;禁用时则不能获取任务名称。 13. `uxTaskGetStackHighWaterMark`:启用时可以获取任务栈的高水位标记(用于检查任务栈的使用情况)。
14. `xTaskGetCurrentTaskHandle`:启用时可以获取当前任务的句柄。
15. `eTaskGetState`:启用时可以获取任务的状态。
16. `xEventGroupSetBitFromISR`:若启用,可能用于从中断服务程序中设置事件组的位;禁用时则不能在中断服务程序中执行此操作。
17. `xTimerPendFunctionCall`:启用时可以挂起函数调用(可能与定时器相关的功能)。
18. `xTaskAbortDelay`:若启用,可能用于中止任务的延迟;禁用时则不能执行此操作。
19. `xTaskGetHandle`:若启用,可能用于获取任务的句柄;禁用时则不能获取任务句柄。
20. `uxTaskGetStackHighWaterMark2`:若启用,可能是另一种获取任务栈高水位标记的方式;禁用时则不能使用这种方式获取。
三、高级设置
需要配置以下参数:
- 新库设置:“USE NEWLIB REENTRANT”(使用新库可重入特性)被禁用。
- 项目设置:“Use FW pack heap file”(使用固件包堆文件)被启用。
四、用户的常量
“User Constants”(用户常量)通常是指由用户自定义的一些常量值。
在特定的软件环境中,用户常量可以用于配置各种参数、控制程序的行为或作为特定功能的标识。用户可以根据自己的需求定义这些常量,并在程序中使用它们
例如,可能用于定义特定的阈值、配置特定的行为模式、标识特定的状态等。
具体的用途和含义会根据软件的具体上下文和功能而有所不同。
五、任务和队列
默认任务:
- 优先级为“osPriorityLow”。
- 栈大小为 128 个字。
- 入口函数为“StartDefaultTask”。
- 参数为“NULL”。
- 采用动态分配方式。
- 缓冲区名称和控制块名称均为“NULL”。
LED Task
- 优先级为“osPriorityLow1”。
- 栈大小为 128 个字。
- 入口函数是“LedTaskFunc”。
- 参数为“NULL”。
- 采用动态分配方式。
- 缓冲区名称和控制块名称均为“NULL”。
Log_Task
- 任务名称为“Log_Task”。
- 优先级是“osPriorityLow1”。
- 栈大小为 128 个字。
- 入口函数为“LogTaskFunc”。
- 参数为“NULL”。
- 采用动态分配方式。
- 缓冲区名称和控制块名称均为“NULL”。
优先级是从高到低排序的
原来有人写了这种总结的文章,卧槽
FreeRTOS基于Cube MX配置的解析_xqueuegetmutexholder-CSDN博客