📘 FreeRTOS 状态切换 · 30章
⚡ 全流程剖析
🎯 入门→精通
1
任务状态机概览
宏观
FreeRTOS任务四大状态(运行、就绪、阻塞、挂起)的定义与宏观理解。
2
任务控制块(TCB)
核心
TCB结构体深度解析,每个成员变量在状态切换中的作用。
3
就绪列表与调度器
数据结构
就绪列表的数据结构(优先级位图+链表),调度器如何从中选任务。
4
任务创建与初始状态
创建
xTaskCreate()内部流程,任务从创建到进入就绪态的完整路径。
5
任务切换触发机制
触发
SysTick中断、任务主动让权(taskYIELD)、中断退出时的PendSV触发。
6
PendSV异常处理
核心切换
PendSV中断服务函数剖析,如何保存/恢复上下文实现任务切换。
7
运行态→就绪态
抢占
时间片耗尽或被更高优先级任务抢占时的切换流程。
8
运行态→阻塞态
阻塞
调用vTaskDelay()、等待队列/信号量/消息队列时的阻塞过程。
9
阻塞态→就绪态
唤醒
阻塞条件满足(延时到期、资源可用)时如何被移回就绪列表。
10
运行态→挂起态
挂起
vTaskSuspend()函数内部实现,任务从调度中移除的细节。
11
挂起态→就绪态
恢复
vTaskResume()与vTaskResumeFromISR()的恢复流程差异。
12
阻塞态→挂起态
特殊
在阻塞状态下被挂起,TCB状态标志的变化与列表操作。
13
挂起态→阻塞态
场景
从挂起态恢复后立即进入阻塞的特殊场景分析。
14
任务删除与状态终结
删除
vTaskDelete()如何清理TCB并从所有列表中移除。
15
临界区与任务切换
保护
taskENTER_CRITICAL()/taskEXIT_CRITICAL()对调度器的影响。
16
调度器挂起与恢复
批量
vTaskSuspendAll()/xTaskResumeAll()批量操作时的状态管理。
17
空闲任务与状态切换
特殊任务
空闲任务的创建时机,它在状态切换中的特殊角色。
18
钩子函数与状态监控
监控
vApplicationIdleHook()/vApplicationTickHook()在状态切换中的应用。
19
多核场景下的状态切换
SMP
SMP模式下任务状态管理的差异与挑战。
20
中断上下文中的状态切换
ISR
ISR中调用xQueueSendFromISR()等函数对任务状态的影响。
21
事件组与任务状态
事件
事件组等待机制如何触发阻塞→就绪的状态跃迁。
22
任务通知与状态切换
轻量
轻量级任务通知替代信号量时的状态变化流程。
23
互斥量与优先级继承
互斥
互斥量导致优先级临时提升时,任务状态如何动态调整。
24
递归互斥量的状态影响
递归
递归锁多次获取/释放对任务阻塞状态的特殊处理。
25
软件定时器与任务状态
定时器
定时器回调函数在哪个任务上下文中执行,对状态的影响。
26
流缓冲区与消息缓冲区
缓冲区
数据到达时如何唤醒阻塞在缓冲区上的任务。
27
任务状态调试手段
调试
uxTaskGetSystemState()、vTaskList()等API获取状态信息。
28
常见状态切换bug分析
排错
优先级反转、死锁、状态不一致等典型问题的排查思路。
29
状态切换性能优化
优化
减少不必要的上下文切换,合理设置时间片与优先级。
30
综合实战:状态变迁轨迹
项目
设计一个多任务系统,完整分析各任务在运行过程中的状态变迁轨迹。