登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

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

作者:wxjia2004 栏目:单片机
SRAM的最大变量使用地址要比堆栈地址小多少呢?
请问一下: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 

2楼: >>参与讨论
zhiwei
中间的这一段是软件堆栈
中间的这一段是软件堆栈,向上生长,堆栈向下生长。它的起始位置在你的变量后面。

3楼: >>参与讨论
wxjia2004
EN
我也这样听说过,不过软件堆栈到底需要多大呢?

是不是象硬件堆栈可以自己区设置?

4楼: >>参与讨论
zhiwei
软件堆栈不可以设置
软件堆栈的大小不能设置,在软件调用等场合用来传递参数,变量等。你的程序可能是变量太多引起的。你看一下是否能合并一些变量,压缩一些空间。

5楼: >>参与讨论
wxjia2004

我的程序确实是变量太多引起的,但是没有去运行程序前,我怎么知道变量到多少地址就多了呢?怎么确定?
堆栈检查?

6楼: >>参与讨论
wxjia2004
哈哈哈
找到方法了,仿真的时候看一看堆栈区就知道了。

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

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

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

参与讨论
昵称:
讨论内容:
 
 
相关帖子
avr内部EEPROM写数据时,若操作失败的问题。
Atmel推出针对AVR微控制器的低成本开发工具
SOS!!--AVR JTAGICE MKII AVR Studio的仿真问题
求助电池供电3.6~6.5V输入,5V输出高效电源芯片
参考书上看到精确定时的概念不理解,就拿来让大虾给我讲解下了
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号