从调用图到栈水位,彻底搞懂堆栈空间是怎么算出来的
做嵌入式软件,很多人都听过:
静态分析。
但一提到静态分析,第一反应往往是:
“是不是就是检查代码有没有Bug?”
其实远不止如此。
静态分析不运行程序,而是直接利用:
- 源代码;
- 编译器生成的信息;
- 符号表;
- 汇编代码;
- 函数调用关系;
- 链接器 MAP 文件;
- 类型和控制流信息;
去推断程序在运行过程中可能发生什么。
其中有一项非常重要、同时又经常被低估的能力:
堆栈使用量分析。
尤其是在 MCU、RTOS、医疗设备、工业控制等资源受限系统中,一个任务到底需要多少栈?
一个函数最多会占多少栈?
整个调用链最深能达到多少?
中断进来以后还会增加多少?
这些问题如果没有提前分析清楚,最终非常容易演变成:
运行正常
↓
某个特殊工况
↓
函数调用变深
↓
中断抢占
↓
栈空间耗尽
↓
内存破坏
↓
程序跑飞
更麻烦的是:
栈溢出通常不是立即死机。
它可能先悄悄覆盖
订阅专栏 解锁全文

364

被折叠的 条评论
为什么被折叠?



