求助:怎么确定堆栈的大小?
现在做一个用microblaze做网络通信代码量大概1.5Mbyte,全局变量比较多,函数嵌套较多,中断也有三个
程序是运行在DDR里面的,虽然DDR足够,但是存在SPI flash中就比较占空间, 而且堆栈大启动也慢,所有要尽量优化堆栈的大小
现在不知道该怎么确定堆栈的大小?
以前用单片机之类的貌似堆栈都比较小,也没注意过。现在网上找了半天也没找到有用的,貌似IAR可以查看当前堆栈的使用情况
但是SDK没找到这个功能。
如果不好实际计算的话,我把堆栈设置成1.5Mbte是不是能完全避免程序运行的时节堆栈溢出的情况?
打开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
红色部分就是编译后的堆栈起始地址。 楼主没搞清楚一些概念,再仔细了解一下吧 tennokoe 发表于 2013-4-26 12:20
打开Xilinx Tools -》 XMD Console
XMD% cd (elf所在目录, 假设hello_world_0.elf为目标文件)
你这个堆栈大小是软件默认的吧,下载的时候是能看到堆栈的实际分配地址,这个我也知道,问题是堆栈大小在sdk一般都是默认大小0x400,这个显然不适合我的工程。 3楼你是高手那就别光灌水,让我们也向你学习一下,ok? wangshaosh123 发表于 2013-4-26 20:13 static/image/common/back.gif
3楼你是高手那就别光灌水,让我们也向你学习一下,ok?
而且堆栈大启动也慢;
这个你做过实验对比吗? 这个不用算,你没理解我的意思。我的软件是存放在spiFLash里面,假如堆栈是10兆字节,代码是1.5兆,那存到spiFlash中就占用了11.5兆,上电的时候boot loader 要把这么多数据拷贝到ddr里面,这个时间就花费的比较长了 本帖最后由 tennokoe 于 2013-4-26 22:28 编辑
wangshaosh123 发表于 2013-4-26 20:11 static/image/common/back.gif
你这个堆栈大小是软件默认的吧,下载的时候是能看到堆栈的实际分配地址,这个我也知道,问题是堆栈大小在 ...
栈空间由编译器分配和释放,栈的消耗和局部变量的大小,函数调用层次有很大关系。
程序一旦复杂起来栈的消耗是很难估算的,主要还是靠优化程序结构和局部变量,避免函数深度嵌套。
存储空间充裕的话,增大栈空间可以很大程度防止栈溢出。
1.5Mbit的栈空间已经算是非常大了……我记得lwip网页服务器的参考设计的栈空间好像也就分了1K。
microblaze没用过,按照楼主描述,应该是映像文件存储在spi接口的flash中,器件上电后加载到ram中运行,你说的1.5m是映像文件的大小,包含了代码段和数据段,实际运行时,有初值的全局变量会被初始化,无初值的全局变量一般初始化为0,栈和堆的实际使用多少可以参考楼上,与你说的1.5m无关 另外你可以看一下你生成的map文件(应该有),可以把剩下的空间全作为栈用,如果用到动态分配也需要保留一部分给堆。 本帖最后由 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 09:04 编辑
10楼说的有道理,我就是想动态分配,按理说堆栈大小应该不影响elf文件的大小,但是实际上编译生成出来的变大了,这个估计是软件也不知道实际接的多大的ram,没法帮你自动分配
-------------------------------
上面弄错了 不管堆栈设置多大,生成出来的elf文件和SREC文件大小都不变,说明CPU自己会去分配堆栈,而不存到SPIFlash中
----------------------------
这个是在RAM资源足够的情况下是尽量的多分配堆栈,如果我网络通信的从机使用SRAM,这个资源就有限了,还是要考虑堆栈分配多少正好够用~~~
页:
[1]