这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 综合技术» 基础知识» 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: AVRCode 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 ]
[ 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: 哈哈哈找到方法了,仿真的时候看一看堆栈区就知道了。

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

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

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

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

学习学习


共3条 1/1 1 跳转至

回复

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