OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3270|回复: 7

STM32启动文件.s中的堆栈大小Stack_Size到底有什么用?

[复制链接]

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2018-10-10
在线时间
16 小时
发表于 2020-3-26 13:12:45 | 显示全部楼层 |阅读模式
5金钱
试验环境:stm32F205+裸机。启动文件.s中Stack_Size = 0x400(Stack_Size      EQU     0x00000400).试验描述:main()函数中定义了好几个局部变量,一步一步断点执行。具体看图吧
问题:1)一步步执行发现栈指针SP不变,按说局部变量保存在栈中应该压栈吧,怎么SP不变呢?
2)定义的一个数字acb[2018],已经远超过Stack_Size 大小了,预计应该产生段错误吧,但是也没有产生而且运行的好好的。why?







IMG_0750.JPG
IMG_0749.JPG
IMG_0748.JPG

最佳答案

查看完整内容[请看2#楼]

1,自己打开反汇编窗口,查看,PUSH,POP在函数往返时会修改SP值,或者参数超过4个时多出来的会在调用函数之前压栈,也会修改SP值。没有这些情况就不会变了。 2,大数组你可以查看反汇编指令看看首地址在哪,没报错有可能放到别处去了,也可能强行放进去了,结果执行的时候可能出错。一般来说局部变量除了寄存器就是放进栈里,如果你定义的不是局部变量就不会放进栈里。 当然还有一种可能就是你只定义了数组没有使用到,所以编译 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2018-12-21
在线时间
126 小时
发表于 2020-3-26 13:12:46 | 显示全部楼层
1,自己打开反汇编窗口,查看,PUSH,POP在函数往返时会修改SP值,或者参数超过4个时多出来的会在调用函数之前压栈,也会修改SP值。没有这些情况就不会变了。
2,大数组你可以查看反汇编指令看看首地址在哪,没报错有可能放到别处去了,也可能强行放进去了,结果执行的时候可能出错。一般来说局部变量除了寄存器就是放进栈里,如果你定义的不是局部变量就不会放进栈里。
当然还有一种可能就是你只定义了数组没有使用到,所以编译器优化掉了所以实际并没有分配空间,或者你没有完全使用只固定访问一小段所以编译器截断了实际大小比声明大小小。
回复

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2018-10-10
在线时间
16 小时
 楼主| 发表于 2020-3-26 13:16:37 | 显示全部楼层
图上传顺序反了,要从最后开始看,
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-3-27 01:07:04 | 显示全部楼层
Stack是栈, 在中断发生的时候,需要压栈,用的就是这个里面的内存。
回复

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2018-10-10
在线时间
16 小时
 楼主| 发表于 2020-3-27 09:36:29 | 显示全部楼层
正点原子 发表于 2020-3-27 01:07
Stack是栈, 在中断发生的时候,需要压栈,用的就是这个里面的内存。

是的,但是main()函数局部变量也是存在栈中的吧?
回复

使用道具 举报

0

主题

28

帖子

0

精华

高级会员

Rank: 4

积分
762
金钱
762
注册时间
2018-7-25
在线时间
276 小时
发表于 2020-3-27 09:43:42 | 显示全部楼层
Tbag 发表于 2020-3-27 09:36
是的,但是main()函数局部变量也是存在栈中的吧?

默认都是使用的这个栈,局部变量的话要看情况,因为有可能编译器为了提高效率,局部变量采用寄存器而不是堆栈
回复

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2018-10-10
在线时间
16 小时
 楼主| 发表于 2020-4-22 15:43:04 | 显示全部楼层
局部数组变量确实用的是栈stack,如下图ad[1000]数组,执行完SP(栈指针)减1000 fe9281a2a703fe411ba9d0e4c01a171.jpg
f12c72b73d511fe33d82eb68d18f605.jpg
回复

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2018-10-10
在线时间
16 小时
 楼主| 发表于 2020-4-22 15:52:02 | 显示全部楼层
本帖最后由 Tbag 于 2020-4-22 15:55 编辑
Tbag 发表于 2020-4-22 15:43
局部数组变量确实用的是栈stack,如下图ad[1000]数组,执行完SP(栈指针)减1000

以上说明局部数组变量用的是栈空间,但是局部int char等变量ARM直接存储在寄存器里。如下图变量nn 直接存储R4中
e0de1b7be7a23e585415aba3ce0cab9.jpg 4a4b11fc083d9ed41c69324185a13a9.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 21:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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