FreeRTOS 栈溢出·实战
📘 30 章 · 从入门到精通
v2.0
01
栈溢出初探
实验
什么是任务栈?为什么栈会溢出?一个简单的栈溢出演示实验。
02
栈空间计算
基础
如何估算任务栈大小?任务栈、中断栈与系统栈的区别。
03
硬件栈检测
机制
FreeRTOS内置的栈溢出检测机制(configCHECK_FOR_STACK_OVERFLOW)。
04
钩子函数实战
核心
实现vApplicationStackOverflowHook(),捕获溢出第一现场。
05
栈高水位标记
API
使用uxTaskGetStackHighWaterMark() API 监控栈使用情况。
06
栈填充魔法
原理
FreeRTOS栈初始化时的填充模式(0xa5a5a5a5)及其原理。
07
调试器大法
工具
利用JTAG/SWD调试器实时查看栈指针和栈内容。
08
静态分析工具
IDE
使用IDE(如STM32CubeIDE)的静态栈分析功能。
09
动态运行时分析
日志
在代码中插入栈使用日志,打印任务栈使用率。
10
典型场景1:递归过深
危险
递归函数调用过深导致栈溢出。
11
典型场景2:局部变量过大
危险
局部变量过大(如大数组)导致栈溢出。
12
典型场景3:中断嵌套
危险
中断嵌套过多导致栈溢出。
13
典型场景4:printf隐患
危险
printf等标准库函数隐式占用大量栈空间。
14
典型场景5:优先级反转
危险
任务优先级反转导致栈使用异常。
15
修复策略1:增大栈
修复
增大任务栈大小(调整configMINIMAL_STACK_SIZE)。
16
修复策略2:优化代码
修复
优化代码,减少局部变量和递归深度。
17
修复策略3:动态内存
修复
使用动态内存分配替代大局部数组。
18
修复策略4:拆分任务
修复
合理划分任务,将大栈任务拆分为多个小栈任务。
19
修复策略5:消息队列
修复
使用消息队列或事件组减少任务栈压力。
20
修复策略6:中断优先级
修复
调整中断优先级,减少中断嵌套深度。
21
修复策略7:协程
修复
使用协程(coroutine)替代部分任务。
22
修复策略8:MPU保护
修复
启用MPU(内存保护单元)进行硬件级栈保护。
23
实战案例1:UART通信
实战
一个UART通信任务的栈溢出排查与修复。
24
实战案例2:传感器采集
实战
一个传感器数据采集任务的栈优化。
25
实战案例3:多任务GUI
实战
一个多任务GUI系统的栈资源分配。
26
工具链整合
CI/CD
将栈检测集成到CI/CD流水线中。
27
进阶:MPU栈保护
进阶
FreeRTOS在MPU模式下的栈保护机制。
28
进阶:栈溢出与堆栈损坏
进阶
栈溢出与堆栈损坏的关联分析。
29
进阶:RISC-V架构
进阶
在RISC-V架构下进行栈溢出检测的特殊性。
30
课程总结·最佳实践
完结
构建健壮的FreeRTOS系统,栈管理最佳实践。