这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » SRAM SRAM的最大变量使用地址要比堆栈地址小多少呢?

共3条 1/1 1 跳转至

SRAM SRAM的最大变量使用地址要比堆栈地址小多少呢?

院士
2006-09-17 18:14:16     打赏
SRAM SRAM的最大变量使用地址要比堆栈地址小多少呢?



关键词: 最大     变量     使用     地址     要比     堆栈     多少    

院士
2006-12-22 22:43:00     打赏
2楼
问 请问一下:SRAM的最大变量使用地址要比堆栈地址小多少呢?

我用mega16做的一个程序。SRAM为1KB,堆栈地址为0x045f,我程序中使用到的地址最大到0x0420就可以正常工作,再向上比如到0x0424就不能正常工作了。

SRAM的最上面应该是存储堆栈,而我的堆栈设置了是16字节就够了。那中间还有一段地址用来干什么呢?我一般能用到多少就安全呢?(动态存储区?)

mp文件:
NOTE: AVR Code addresses are word addresses
All other addresses (including ones in FLASH) are byte addresses

Area                               Addr   Size   Decimal Bytes (Attributes)
--------------------------------   ----   ----   ------- ----- ------------
                            text   0054   3AC0 =  15040. bytes (rel,con,rom)

       Addr  Global Symbol
      -----  --------------------------------
       002A  __text_start
       002A  __start
       004A  _exit
       004B  _Delay_1ms
       0051  _Delay_ms
       0060  _HexBitToAscII
       0072  _AscIIToHexBit
       0083  _FcsCal
       00A3  _DecToAscII
       00C3  _AscIIToHex
       0109  _Timer2Ovf
       013E  _timer0_ovf_isr
       0146  _UartRx
       02EC  _UartTx
       0314  _PizInt2
       0326  _UartRRInit
       035D  _UartRDInit
       03B0  _SysInit
       03E6  _SysNew
       053A  _SysControl
       1CE8  _main
       1CFA  mod16u
       1CFC  div16u
       1CFD  xdiv16u
       1D16  empy16s
       1D26  pop_gset2
       1D29  pop_gset3
       1D2C  pop_gset5
       1D2F  push_gset5
       1D31  push_gset4
       1D33  push_gset3
       1D35  push_gset2
       1D37  push_gset1
       1D3A  pop_gset1
       1D3B  pop
       1D4E  push_lset
       1D65  pop_lset
       1D7C  lsl16
       1D83  lsr16
       1D8A  __text_end

Area                               Addr   Size   Decimal Bytes (Attributes)
--------------------------------   ----   ----   ------- ----- ------------
                             bss   0060   03C0 =    960. bytes (rel,con,ram)

       Addr  Global Symbol
      -----  --------------------------------
       0060  _EncAbsAngle
       0060  __bss_start
       0062  _AscII
       0066  _RDNum
       0067  _RxState
       0068  _ComCmd
       0069  _TxNum
       006A  _RxNum
       006B  _RxBuf
       009E  _TxBuf
       00AF  _PLCRR
       00B3  _PLCRD
       0417  _Sta
       0418  _TimSecBase
       0419  _Time
       041A  _OutDate3
       041B  _OutDate2
       041C  _OutDate1
       041D  _OutDate0
       041E  _InData0
       041F  _InDate0
       0420  __bss_end

Area                               Start  End    Decimal Bytes (Attributes)
--------------------------------   ----   ----   ------- ----- ------------
                          vector   0000   004C =     76. bytes (abs,ovr,rom)

Files Linked      [ module(s) ]

D:\icc\lib\crtatmega.o   [ crtatmega.s ]
main.o   [ main.c ]
<library>   [ div16u.s, emul16s.s, gpop2.s, gpop3.s, gpop5.s, gpush.s, lpush.s, lsl16.s, lsr16.s ]

User Global Definitions

ram_end = 0x45f
hwstk_size = 0x10

User Base Address Definitions

func_lit = 0x54
data = 0x60
eeprom = 0x1  1: 中间的这一段是软件堆栈中间的这一段是软件堆栈,向上生长,堆栈向下生长。它的起始位置在你的变量后面。 2: EN我也这样听说过,不过软件堆栈到底需要多大呢?

是不是象硬件堆栈可以自己区设置? 3: 软件堆栈不可以设置软件堆栈的大小不能设置,在软件调用等场合用来传递参数,变量等。你的程序可能是变量太多引起的。你看一下是否能合并一些变量,压缩一些空间。 4: 恩我的程序确实是变量太多引起的,但是没有去运行程序前,我怎么知道变量到多少地址就多了呢?怎么确定?
堆栈检查? 5: 哈哈哈找到方法了,仿真的时候看一看堆栈区就知道了。

ICCAVR的启动代码在硬件堆栈和软件堆栈的最低字节分别写进了一个代码0xAA。这样仿真的时候看一看0xAA在哪个地址就可以了。

我的程序0xAA在0x0420(软件堆栈)和0x044f(硬件堆栈)。所以只有我的bss_end<=0x0420才能运行正常。

对应的实际运行检查可以用堆栈检查函数判断是否堆栈溢出。

专家
2022-08-20 17:37:25     打赏
3楼

学习学习


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]