STM32编程玄学之爆栈
今天调程序,串口刚开始能用,加了点代码就不能用了。一开始以为是串口的问题,改了各种设置,甚至换了一个板子,都不行,debug显示串口卡住,十分的奇怪。后来删除一个子函数,代码正常运行,一下子反应过来是栈溢出了,于是将栈大小从0X400改为0X1000,程序正常运行。看来轻微的栈溢出,并不会引起STM32的硬件hardfault,非常难以察觉。因此代码行数时,如果出现难以解决的问题,首先考虑栈溢出。 keil 是你已经占用的堆内存(全局变量之类的)+ 你申明的栈大小(keil 配置页面设定)来做栈顶地址,不同工程全局变量数量不同,栈顶地址自然不同。
对于 keil,栈顶往上的内存是浪费的,除非你每次根据编译出来的 map 文件,计算浪费的内存大小是多少,然后修改栈申明的大小,相应加大。
很傻的要手动操作。
而 stm32cubemx 生成的 makefile + gcc 工程,栈固定设定在内存顶部,可以最大程度避免栈溢出。
其次,我一般会加一个简易的栈溢出检查,见下图。
不加检查溢出直接死机倒还好,如果出一些内存错乱的奇怪问题,查起来就费事了。
没有具体的代码不好分析问题。也可能你的串口开了中断,但是没有中断函数。栈的使用情况你也没有说明你使用了多少RAM! 栈不够编译器会知道
毕竟编译型语言不是动态的 JuncoJet 发表于 2025-2-21 16:14
栈不够编译器会知道
毕竟编译型语言不是动态的
编译器不是万能的,否则就不会有著名的 StackOverflow 网站了 :lol JuncoJet 发表于 2025-2-21 16:14
栈不够编译器会知道
毕竟编译型语言不是动态的
你太高估KEIL上古编译器的水平了 Aline744 发表于 2025-2-21 17:11
你太高估KEIL上古编译器的水平了
这跟编译器是否古老没有关系,哪怕是最新的编译器也无法阻止有问题的程序运行时堆栈溢出。 本帖最后由 locky_z 于 2025-2-21 21:04 编辑
编译型也没法预判递归程序的堆栈需求。
除非编译时加上选项,让他增加"运行时"判断堆栈溢出的代码。
页:
[1]