今天,你的栈溢出了吗?
--callgraph:生成一个静态调用图(html或文本格式),显示堆栈使用情况 --info=stack:列出所有全局符号的堆栈使用情况
Enable linker map file generation in Linker settings (List tap) Enable stack usage analysis (Advanced tap).
-fstack-protector:在堆栈帧上为每个易受攻击的函数插入一个保护变量。 -fstack-protector-all:在堆栈帧上为所有函数插入一个保护变量。
01 栈布局
02 函数调用
假设应用程序仅对外设中断使用两个中断优先级,由于可能发生HardFault异常和NMI异常(如果应用程序使用),可能存在4级嵌套异常,如图所示。
03 栈大小难以计算原因
软件开发人员可能会发现,在许多情况下,报告无法提供有关应用程序某些部分的堆栈要求的信息。堆栈使用情况报告生成对某些代码不起作用的原因有很多:
在应用程序中使用函数指针可能意味着该工具无法生成调用树。
在许多工具中,C运行时库中函数的堆栈使用是未知的。
该应用程序包含递归函数调用或自修改代码。
在这些情况下,您可能必须手动计算这些函数的最大堆栈使用量,或者通过试验来估计这些函数。例如,您可以在运行程序之前使用调试器以某种数据模式填充堆栈内存空间,然后执行代码,并检查堆栈内存空间以查看程序执行已修改了多少堆栈空间。
也可以通过在项目中添加检测代码来处理堆栈估算。例如,附录I显示了gcc Arm Embedded(使用NewLib)的堆栈检查实用程序代码。
最后再说一点,鱼鹰知道 PID 系列文章很多道友都不是很感兴趣(从阅读量可以看出),但是鱼鹰还是会继续更新下去的,因为鱼鹰写这部分笔记的初衷本来就是给自己看的,所以不会因为你们不感兴趣而停止更新。
另外鱼鹰还想说的就是,一旦 PID 系列文章更新完毕,鱼鹰可能将停止更新。
为什么呢,从去年 11 月份开始到,因为做公众号而花费了很大精力,但收获很小,而且最近的状态是总想着怎么写出一篇好的文章,而不是说怎么研究技术问题。而本公众号的文章里面,只有 KEIL 调试系列和少数几篇文章还算满意,其他文章的价值很少。在鱼鹰看来,先有好的技术积累,才会有好的文章出现。最近一段时间一直在输出,而输入很少,所以鱼鹰准备暂停更新,直到认为有足够的技术积累再继续更新。
那什么时候恢复更新呢?鱼鹰无法确定,所以说如果你觉得本公众号没有价值了,那么可以取消关注。但是鱼鹰想说的是,当公众号恢复更新时,将呈现三大系列文章:
1、USB (包括如何自制一个调试器,将以它作为这个系列的最终目标)
2、FAT32FS 文件系统(源码理解,图解文件系统)
3、uCOS II (鱼鹰已全部看完并理解源码,只是需要点时间写出相应的笔记)
最近鱼鹰也算处于一种转型状态了,从单片机开发转向 linux 开发,不懂的知识点太多了,祝我好运咯!
-THE END-
如果觉得文章对你有帮助,欢迎转发、分享给朋友,感谢你的支持!
如果对本文有问题,欢迎留言!即使没有问题也可以留下走心评论。
如需转载请联系我。
微信公众号「鱼鹰谈单片机」
每周一更单片机知识
长按后识别图中二维码关注