打印
[STM32]

STM32堆栈溢出

[复制链接]
2517|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tao180539|  楼主 | 2018-12-14 17:18 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tao180539 于 2018-12-14 17:20 编辑

故意定义了个比较大的数组,仿真运行,看着堆栈指针已经超过栈底了,但是竟然没有触发fault错误中断。第一个图片是上电时候堆栈指针,第二个是大数组压栈时候的指针。第三个是堆栈的大小。

GDL@BYW69N)UQF4W]1RE}PE.png (14.77 KB )

GDL@BYW69N)UQF4W]1RE}PE.png

VCUBM[3N@77@VT9[6[$P0ZD.png (16.58 KB )

VCUBM[3N@77@VT9[6[$P0ZD.png

1544777745(1).jpg (12.6 KB )

1544777745(1).jpg

相关帖子

沙发
Ketose| | 2018-12-14 17:52 | 只看该作者
stackoverflow 在函数返回的时候就要出错了。

使用特权

评论回复
评论
tao180539 2018-12-15 21:45 回复TA
谢谢,我试试 
板凳
john_lee| | 2018-12-14 19:26 | 只看该作者
程序定义的“栈空间”只是一个软件意义上的内存区而已,CPU其实只有“栈顶”的概念(就是SP)而没有“栈底”的概念。只要软件定义的“栈底”下面还有内存,这个“所谓的栈底”就限制不了CPU压栈和栈空间访问。

使用特权

评论回复
评论
tao180539 2018-12-15 21:46 回复TA
谢谢 
地板
Prry| | 2018-12-14 23:12 | 只看该作者
加大栈空间

使用特权

评论回复
5
linqing171| | 2018-12-15 21:30 | 只看该作者
堆栈虽然溢出了,但是没有超过内存范围,不会直接触发fault。
你把数组内容全部设置为0xAA;
然后用不了多久,这些0xAA覆盖掉的地方的指针被使用的时候,就指向了0xAAAAAAAA这个不存在的地方,就会fault了。不是不报,时候未到。

使用特权

评论回复
评论
tao180539 2018-12-17 10:12 回复TA
@linqing171 :对,是这个样子的。谢谢。 
linqing171 2018-12-16 22:51 回复TA
@tao180539 :碰到的时候也只是把全局变量改了。并不会崩溃。但是将来用这个全局变量当指针、返回地址、数组下标等的时候,就崩溃了。 
tao180539 2018-12-15 21:47 回复TA
意思是,一直压栈,知道碰到全局变量的时候就会触发错误了,是吧 
6
ayb_ice| | 2018-12-17 08:42 | 只看该作者
只要不超过RAM的低地址就不会异常,堆栈指针没有那么聪明的,不会检查这些的 ,再说中间空闲的空间其实都是栈,只是没有定义而已

使用特权

评论回复
7
tao180539|  楼主 | 2018-12-17 10:11 | 只看该作者
linqing171 发表于 2018-12-15 21:30
堆栈虽然溢出了,但是没有超过内存范围,不会直接触发fault。
你把数组内容全部设置为0xAA;
然后用不了多久 ...

你说的对

使用特权

评论回复
8
tao180539|  楼主 | 2018-12-17 10:12 | 只看该作者
Ketose 发表于 2018-12-14 17:52
stackoverflow 在函数返回的时候就要出错了。

试验过了,这个说法不对。

使用特权

评论回复
9
tao180539|  楼主 | 2018-12-17 10:13 | 只看该作者
john_lee 发表于 2018-12-14 19:26
程序定义的“栈空间”只是一个软件意义上的内存区而已,CPU其实只有“栈顶”的概念(就是SP)而没有“栈底 ...

说的对,谢谢。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

321

主题

514

帖子

3

粉丝