5412|8

58

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【讨论】(十分古怪的)关于msp430 IAR编译器对堆栈的分配的疑问 [复制链接]

我发现

在一个子函数中使用到 unsigned char DotBuf[32];这个时候,堆栈的使用量猛增!
而且在一个函数中多次调用fun1();堆栈的使用量是累加在一起的,为什么这么古怪,每次退出
fun1();程序不会释放 这个函数中的局部变量的嘛????

void fun1()
{
unsigned char DotBuf[32];
getDotBuf( unsigned char *)DotBuf);//取32个unsigned char 数据
...
...
}

另外我在一个void fun2();中多次调用 fun1();
void fun2()
{
... //未进入 fun1();时候堆栈使用8%
fun1(); //进入后,堆栈使用占全部堆栈空间的10%
.....
..... //未进入 fun1();时候堆栈使用10%
fun1(); //进入后,堆栈使用占全部堆栈空间的13%
....
.... //未进入 fun1();时候堆栈使用13%
fun1();//进入后,堆栈使用占全部堆栈空间的15%
.....
}

本人觉得十分古怪,望高手说明下~~~

最新回复

学习学习,堆栈问题啊  详情 回复 发表于 2010-3-2 08:28
 
点赞 关注

回复
举报

62

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
堆栈使用率怎么得出的?
在函数退出之后,局部变量所占用的那部分堆栈会回收。
你可以在调用fun1函数的前后设断点,分别察看sp寄存器 的值就可以发现。
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
答:堆栈使用率怎么得出的?
在防真的时候,打开观看(view)堆栈(stack),上面的使用率是我用来说明用的,实际的使用率,是65%~75%之间的.感觉程序运行到创建unsigned char DotBuf[32];那一行数组的时候堆栈的使用就猛增加了!,运行到
getDotBuf( unsigned char *)DotBuf);//取32个unsigned char 数据
这一行也增加了不少~~,
所以觉得不理解,这个数组,当退出 fun1();的时候,应该回收了,在次进入 fun1();,就再次开辟,应该不会累加才对的~~
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(初级)

4
 
在函数内部使用DotBuf[32]数组时,编译器是通过堆栈来分配空间的,所以堆栈的使用量会增加。在调用getDotBuf函数时,所谓嵌套调用getDotBuf函数,所以getDotBuf函数内部的有可能也使用了堆栈,故堆栈使用会继续增加,如果此时有中断发生,堆栈继续增加。。。
函数内部所占用的堆栈(局部变量以及保存R4-R8的那部分)肯定会在函数退出时回收,简单的想一想,如果没有回收,函数返回时(RET指令)由于堆栈不平衡,程序是不可能正常运行下去的。
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

5
 
谢谢 iltgcl 兄:

问题在9号已经解决~~这个问题是在我调用了一个功能巨大的库函数所做成的, 调用这个函数,堆栈多使用了100多byte!因为这个函数嵌套得比较深,所以开始没发现!!
谢谢!
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

6
 
呵呵,不客气,解决问题就好。
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

7
 
留给我脚印
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

8
 
受教了
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

9
 
学习学习,堆栈问题啊
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表