wangshaosh123 发表于 2013-4-25 20:36:17

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

现在做一个用microblaze做网络通信
代码量大概1.5Mbyte,全局变量比较多,函数嵌套较多,中断也有三个
程序是运行在DDR里面的,虽然DDR足够,但是存在SPI flash中就比较占空间, 而且堆栈大启动也慢,所有要尽量优化堆栈的大小
现在不知道该怎么确定堆栈的大小?

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




tennokoe 发表于 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% dowhello_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


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

zchong 发表于 2013-4-26 12:49:39

楼主没搞清楚一些概念,再仔细了解一下吧

wangshaosh123 发表于 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,这个显然不适合我的工程。

wangshaosh123 发表于 2013-4-26 20:13:56

3楼你是高手那就别光灌水,让我们也向你学习一下,ok?

hhxb 发表于 2013-4-26 20:20:12

wangshaosh123 发表于 2013-4-26 20:13 static/image/common/back.gif
3楼你是高手那就别光灌水,让我们也向你学习一下,ok?

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

wangshaosh123 发表于 2013-4-26 21:58:29

这个不用算,你没理解我的意思。我的软件是存放在spiFLash里面,假如堆栈是10兆字节,代码是1.5兆,那存到spiFlash中就占用了11.5兆,上电的时候boot loader 要把这么多数据拷贝到ddr里面,这个时间就花费的比较长了

tennokoe 发表于 2013-4-26 22:20:16

本帖最后由 tennokoe 于 2013-4-26 22:28 编辑

wangshaosh123 发表于 2013-4-26 20:11 static/image/common/back.gif
你这个堆栈大小是软件默认的吧,下载的时候是能看到堆栈的实际分配地址,这个我也知道,问题是堆栈大小在 ...

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


zchong 发表于 2013-4-26 22:35:09

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

zchong 发表于 2013-4-26 22:39:41

另外你可以看一下你生成的map文件(应该有),可以把剩下的空间全作为栈用,如果用到动态分配也需要保留一部分给堆。

hhxb 发表于 2013-4-26 22:52:12

本帖最后由 hhxb 于 2013-4-26 22:56 编辑

wangshaosh123 发表于 2013-4-26 21:58 static/image/common/back.gif
这个不用算,你没理解我的意思。我的软件是存放在spiFLash里面,假如堆栈是10兆字节,代码是1.5兆,那存到s ...

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

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

wangshaosh123 发表于 2013-4-27 08:10:06

本帖最后由 wangshaosh123 于 2013-4-27 09:04 编辑

10楼说的有道理,我就是想动态分配,按理说堆栈大小应该不影响elf文件的大小,但是实际上编译生成出来的变大了,这个估计是软件也不知道实际接的多大的ram,没法帮你自动分配
-------------------------------
上面弄错了   不管堆栈设置多大,生成出来的elf文件和SREC文件大小都不变,说明CPU自己会去分配堆栈,而不存到SPIFlash中
----------------------------
这个是在RAM资源足够的情况下是尽量的多分配堆栈,如果我网络通信的从机使用SRAM,这个资源就有限了,还是要考虑堆栈分配多少正好够用~~~
页: [1]
查看完整版本: 求助:怎么确定堆栈的大小?