搜索
bottom↓
回复: 11

求助:怎么确定堆栈的大小?

[复制链接]

出0入0汤圆

发表于 2013-4-25 20:36:17 | 显示全部楼层 |阅读模式
现在做一个用microblaze做网络通信
代码量大概1.5Mbyte,全局变量比较多,函数嵌套较多,中断也有三个
程序是运行在DDR里面的,虽然DDR足够,但是存在SPI flash中就比较占空间, 而且堆栈大启动也慢,所有要尽量优化堆栈的大小
现在不知道该怎么确定堆栈的大小?

以前用单片机之类的貌似堆栈都比较小,也没注意过。现在网上找了半天也没找到有用的,貌似IAR可以查看当前堆栈的使用情况
但是SDK没找到这个功能。
如果不好实际计算的话,我把堆栈设置成1.5Mbte是不是能完全避免程序运行的时节堆栈溢出的情况?




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-4-26 12:20:46 | 显示全部楼层
打开Xilinx Tools -》 XMD Console

XMD% cd (elf所在目录, 假设hello_world_0.elf为目标文件)

XMD% connect mdm
Connected to MDM UART Target
XMD% dow  hello_world_0.elf
Downloading Program -- hello_world_0.elf
        section, .vectors.reset: 0x00000000-0x00000003
        section, .vectors.sw_exception: 0x00000008-0x0000000b
        section, .vectors.interrupt: 0x00000010-0x00000013
        section, .vectors.hw_exception: 0x00000020-0x00000023
        section, .text: 0x00000050-0x000010ab
        section, .init: 0x000010ac-0x000010df
        section, .fini: 0x000010e0-0x000010fb
        section, .ctors: 0x000010fc-0x00001103
        section, .dtors: 0x00001104-0x0000110b
        section, .rodata: 0x0000110c-0x00001515
        section, .sdata2: 0x00001516-0x00001517
        section, .data: 0x00001518-0x0000162b
        section, .eh_frame: 0x0000162c-0x0000162f
        section, .jcr: 0x00001630-0x00001633
        section, .bss: 0x00001638-0x0000165b
        section, .heap: 0x0000165c-0x00001a5f
        section, .stack: 0x00001a60-0x00001e5f

Setting PC with Program Start Address 0x00000000
System Reset .... DONE


红色部分就是编译后的堆栈起始地址。

出0入31汤圆

发表于 2013-4-26 12:49:39 | 显示全部楼层
楼主没搞清楚一些概念,再仔细了解一下吧

出0入0汤圆

 楼主| 发表于 2013-4-26 20:11:26 来自手机 | 显示全部楼层
tennokoe 发表于 2013-4-26 12:20
打开Xilinx Tools -》 XMD Console

XMD% cd (elf所在目录, 假设hello_world_0.elf为目标文件)

你这个堆栈大小是软件默认的吧,下载的时候是能看到堆栈的实际分配地址,这个我也知道,问题是堆栈大小在sdk一般都是默认大小0x400,这个显然不适合我的工程。

出0入0汤圆

 楼主| 发表于 2013-4-26 20:13:56 来自手机 | 显示全部楼层
3楼你是高手那就别光灌水,让我们也向你学习一下,ok?

出0入17汤圆

发表于 2013-4-26 20:20:12 | 显示全部楼层
wangshaosh123 发表于 2013-4-26 20:13
3楼你是高手那就别光灌水,让我们也向你学习一下,ok?

而且堆栈大启动也慢;
这个你做过实验对比吗?

出0入0汤圆

 楼主| 发表于 2013-4-26 21:58:29 来自手机 | 显示全部楼层
这个不用算,你没理解我的意思。我的软件是存放在spiFLash里面,假如堆栈是10兆字节,代码是1.5兆,那存到spiFlash中就占用了11.5兆,上电的时候boot loader 要把这么多数据拷贝到ddr里面,这个时间就花费的比较长了

出0入0汤圆

发表于 2013-4-26 22:20:16 | 显示全部楼层
本帖最后由 tennokoe 于 2013-4-26 22:28 编辑
wangshaosh123 发表于 2013-4-26 20:11
你这个堆栈大小是软件默认的吧,下载的时候是能看到堆栈的实际分配地址,这个我也知道,问题是堆栈大小在 ...


栈空间由编译器分配和释放,栈的消耗和局部变量的大小,函数调用层次有很大关系。
程序一旦复杂起来栈的消耗是很难估算的,主要还是靠优化程序结构和局部变量,避免函数深度嵌套。
存储空间充裕的话,增大栈空间可以很大程度防止栈溢出。
1.5Mbit的栈空间已经算是非常大了……我记得lwip网页服务器的参考设计的栈空间好像也就分了1K。


出0入31汤圆

发表于 2013-4-26 22:35:09 来自手机 | 显示全部楼层
microblaze没用过,按照楼主描述,应该是映像文件存储在spi接口的flash中,器件上电后加载到ram中运行,你说的1.5m是映像文件的大小,包含了代码段和数据段,实际运行时,有初值的全局变量会被初始化,无初值的全局变量一般初始化为0,栈和堆的实际使用多少可以参考楼上,与你说的1.5m无关

出0入31汤圆

发表于 2013-4-26 22:39:41 来自手机 | 显示全部楼层
另外你可以看一下你生成的map文件(应该有),可以把剩下的空间全作为栈用,如果用到动态分配也需要保留一部分给堆。

出0入17汤圆

发表于 2013-4-26 22:52:12 | 显示全部楼层
本帖最后由 hhxb 于 2013-4-26 22:56 编辑
wangshaosh123 发表于 2013-4-26 21:58
这个不用算,你没理解我的意思。我的软件是存放在spiFLash里面,假如堆栈是10兆字节,代码是1.5兆,那存到s ...


代码是1.5兆,那存到spiFlash中就占用了11.5兆
这个你验证过吗?

我记得堆栈是不占FLASH空间的
也就是不影响启动速度

出0入0汤圆

 楼主| 发表于 2013-4-27 08:10:06 来自手机 | 显示全部楼层
本帖最后由 wangshaosh123 于 2013-4-27 09:04 编辑

10楼说的有道理,我就是想动态分配,按理说堆栈大小应该不影响elf文件的大小,但是实际上编译生成出来的变大了,这个估计是软件也不知道实际接的多大的ram,没法帮你自动分配
-------------------------------
上面弄错了   不管堆栈设置多大,生成出来的elf文件和SREC文件大小都不变,说明CPU自己会去分配堆栈,而不存到SPIFlash中
----------------------------
这个是在RAM资源足够的情况下是尽量的多分配堆栈,如果我网络通信的从机使用SRAM,这个资源就有限了,还是要考虑堆栈分配多少正好够用~~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 07:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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