矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 1390|回复: 7

STM32编程玄学之爆栈

[复制链接]
     
发表于 2025-2-21 15:52:00 | 显示全部楼层 |阅读模式
今天调程序,串口刚开始能用,加了点代码就不能用了。一开始以为是串口的问题,改了各种设置,甚至换了一个板子,都不行,debug显示串口卡住,十分的奇怪。后来删除一个子函数,代码正常运行,一下子反应过来是栈溢出了,于是将栈大小从0X400改为0X1000,程序正常运行。
看来轻微的栈溢出,并不会引起STM32的硬件hardfault,非常难以察觉。因此代码行数时,如果出现难以解决的问题,首先考虑栈溢出。
     
发表于 2025-2-27 09:29:09 | 显示全部楼层
keil 是你已经占用的堆内存(全局变量之类的)+ 你申明的栈大小(keil 配置页面设定)来做栈顶地址,不同工程全局变量数量不同,栈顶地址自然不同。
对于 keil,栈顶往上的内存是浪费的,除非你每次根据编译出来的 map 文件,计算浪费的内存大小是多少,然后修改栈申明的大小,相应加大。
很傻的要手动操作。

而 stm32cubemx 生成的 makefile + gcc 工程,栈固定设定在内存顶部,可以最大程度避免栈溢出。

其次,我一般会加一个简易的栈溢出检查,见下图。
不加检查溢出直接死机倒还好,如果出一些内存错乱的奇怪问题,查起来就费事了。

Screenshot_2025-02-27_09-25-54.png

Screenshot_2025-02-27_09-26-23.png

评分

1

查看全部评分

回复 支持 1 反对 0

使用道具 举报

     
发表于 2025-2-21 16:06:55 | 显示全部楼层
没有具体的代码不好分析问题。也可能你的串口开了中断,但是没有中断函数。栈的使用情况你也没有说明你使用了多少RAM!
回复 支持 反对

使用道具 举报

     
发表于 2025-2-21 16:14:49 | 显示全部楼层
栈不够编译器会知道
毕竟编译型语言不是动态的
回复 支持 反对

使用道具 举报

     
发表于 2025-2-21 16:25:12 | 显示全部楼层
JuncoJet 发表于 2025-2-21 16:14
栈不够编译器会知道
毕竟编译型语言不是动态的

编译器不是万能的,否则就不会有著名的 StackOverflow 网站了
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2025-2-21 17:11:11 | 显示全部楼层
JuncoJet 发表于 2025-2-21 16:14
栈不够编译器会知道
毕竟编译型语言不是动态的

你太高估KEIL上古编译器的水平了
回复 支持 反对

使用道具 举报

     
发表于 2025-2-21 17:22:28 | 显示全部楼层
Aline744 发表于 2025-2-21 17:11
你太高估KEIL上古编译器的水平了

这跟编译器是否古老没有关系,哪怕是最新的编译器也无法阻止有问题的程序运行时堆栈溢出。
回复 支持 反对

使用道具 举报

     
发表于 2025-2-21 21:03:00 | 显示全部楼层
本帖最后由 locky_z 于 2025-2-21 21:04 编辑

编译型也没法预判递归程序的堆栈需求。
除非编译时加上选项,让他增加"运行时"判断堆栈溢出的代码。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-29 11:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表