提示:关于FreeRTOS知识点总结,后续会继续补充
关于FreeRTOS知识点总结
1.FreeRTOS框架常识
FreeRTOS与裸机任务管理概述
-
裸机系统中的栈和堆
- 裸机系统通常只有一个主栈(用于非任务代码)。栈从高地址向低地址增长,堆从栈底向高地址增长。
-
FreeRTOS中的栈
- 在FreeRTOS中,每个任务都有独立的栈,用于存储任务的执行状态和局部变量。
-
C语言函数切换
- C语言函数的切换本质上是CPU内核中一系列寄存器值的改变,也叫做现场的恢复与保存。
-
RTOS中的上下文切换
- 在RTOS中,上下文切换(即任务切换)指的是现场的保存与恢复。
-
任务切换
- FreeRTOS中的任务切换由调度器来完成,而在裸机系统中任务切换通常由硬件完成。
-
多任务并行执行
- 在FreeRTOS中,多任务同时运行的模式称为并行执行。
-
vTaskDelay
函数逻辑vTaskDelay
函数的运行逻辑包括:- 计时并暂停当前任务的运行。
- 计算延迟的时间。
- 延时时间到达后,恢复任务的运行。
-
调度器与Tick中断
- 调度器的动力来源是Tick定时中断,一个定时周期称为一个Tick。
-
临界区的概念
- 临界区用于保护共享资源,确保在临界区内的代码不会被中断,从而避免数据竞争问题。
-
PENDSV中断
- PENDSV是一个优先级最低的系统调用中断,负责缓期执行。它会等待所有其他中断处理完成后才执行。
-
高优先级任务的调度
- 在FreeRTOS中,应该避免高优先级任务独占CPU。应尽量让高优先级任务发生阻塞或者调用
vTaskDelay
函数来让出CPU。
- 在FreeRTOS中,应该避免高优先级任务独占CPU。应尽量让高优先级任务发生阻塞或者调用
-
CPU时间共享
- CPU运行时间是多个任务共享的,因此任务不应长时间连续占用CPU。
-
FreeRTOS中的任务状态
- FreeRTOS中任务有四种状态:
- 阻塞状态:任务在等待某种资源时处于此状态。
- 运行状态:任务正在执行。
- 就绪状态:任务准备运行,等待调度。
- 挂起状态:任务被挂起,不参与调度。
- 除运行状态外,其他状态的任务都是暂停运行的。
- 一个处于阻塞状态的任务在等待条件满足时,会从阻塞状态转化为就绪状态。
- FreeRTOS中任务有四种状态:
-
任务运行的条件
- 任务要运行的条件是:
- 任务必须处于就绪状态。
- 任务的优先级必须是所有就绪任务中最高的。
- 任务要运行的条件是:
-
优先级反转问题
- 优先级反转问题发生在低优先级任务阻塞了高优先级任务的执行,导致系统性能下降。
-
FreeRTOS中的堆和栈
- 堆:
- 用于动态管理内存,分配对象和资源(如任务控制块TCB)。堆空间不足可能导致无法创建新任务或对象。
- 栈:
- 每个任务都有独立的栈,用于存储任务的执行状态、局部变量和函数调用信息。栈的大小在任务创建时指定。
- 堆:
-
静态任务与动态任务的区别
- 静态任务:
- 创建时需要指定TCB(任务控制块)。
- 删除时需要手动释放TCB。
- 动态任务:
- 创建时无需指定TCB,FreeRTOS会自动分配。
- 删除时也无需手动释放TCB。
- 静态任务:
-
任务函数设计
- FreeRTOS中的任务函数在返回时可能跳转到野指针地址,因此任务函数通常包含一个
while
循环,以防止意外跳转。
- FreeRTOS中的任务函数在返回时可能跳转到野指针地址,因此任务函数通常包含一个
-
节约任务创建空间
- 可以在
main
函数中创建一个一次性任务,该任务负责创建其他长期任务,然后删除自己。一次性任务应设置为最高优先级,以防止被其他任务打断。
- 可以在
-
新任务的调度
- 启动任务后,如果创建了新任务,调度器会根据优先级立即调度新任务。
-
空闲任务的作用
- 空闲任务负责处理已删除任务的资源释放,确保有运行机会以回收资源。
-
钩子函数(Hook Functions)
- 钩子函数实际上是回调函数,通过函数指针实现。在FreeRTOS中,这些指针被称为句柄(Handle)。
-
_weak
修饰符- **
_weak
**修饰符表示弱函数。加上_weak
的函数允许用户在其他文件中重新定义同名函数,编译器将选择用户定义的强函数。
- **
-
裸机与RTOS的任务执行
- 在裸机中,任务大多是顺序执行的,偶尔被中断打断。而在RTOS中,任务之间的执行切换频繁,因此需要确保时间敏感的代码尽量不被中断。
-
任务间通信(IPC)
- 任务间的通信和同步称为IPC(Inter-Process Communication)。
-
中断程序的调度
- 中断程序无法由调度器调度,而是由硬件的NVIC控制和调度。
-
中断程序设计原则
- 中断程序应尽量简短,以确保实时响应性能。避免在中断程序中执行长时间操作。
#2.
#3.