[AVR单片机] IAR中堆栈位置的一个问题

[复制链接]
7722|8
 楼主| pantodd 发表于 2008-1-3 16:15 | 显示全部楼层 |阅读模式
我们大家知道AVR中,硬件堆栈开始于SRAM的最高字节,在它下面是软件堆栈,这两个堆栈向下生成型。以下为动态分配内存区,再以下为全局变量和字符串,最低为CPU和IO寄存器。
在IAR生成的MAP文件中,我发现如下:
CSTACK               DATA          00000100 - 0000018F          90   dse    0
RSTACK               DATA          00000190 - 0000028F         100   dse    0
NEAR_I               DATA          00000290 - 00000297           8   rel    0
NEAR_Z               DATA          00000298 - 000004FD         266   rel    0

                ****************************************
                *                                      *
                *        END OF CROSS REFERENCE        *
                *                                      *
                ****************************************

 5 328 bytes of CODE memory (+ 119 absolute, 2 range fill )
 1 022 bytes of DATA memory (+  96 absolute  )

Errors: none
Warnings: none

这样看来,堆栈不是置于SRAM的最高地址呀?
 楼主| pantodd 发表于 2008-1-3 16:22 | 显示全部楼层

原来的MAP是这样。

NEAR_I               DATA          00000100 - 00000107           8   rel    0
NEAR_Z               DATA          00000108 - 000003A6         29F   rel    0
RSTACK               DATA          000003A7 - 000003E6          40   dse    0
CSTACK               DATA          000003E7 - 000004E6         100   dse    0

                ****************************************
                *                                      *
                *        END OF CROSS REFERENCE        *
                *                                      *
                ****************************************

 5 670 bytes of CODE memory (+ 119 absolute, 2 range fill )
   999 bytes of DATA memory (+  96 absolute  )

Errors: none
Warnings: none

这是以前的MAP文件,我使用IAR默认的堆栈设置。但是我在OPTION将CSTACK和RSTACK大小修改以后,就出现位置上的变化了。不解,请高手帮分析一下。
ATmega16 发表于 2008-1-3 22:33 | 显示全部楼层

IAR先分配堆栈空间

IAR先分配堆栈空间,相当于定议一个全局数组为堆栈空间,堆栈初始为堆栈空间最高地址
GCC不用先分配堆栈,自动把RAM剩余空间作为堆栈空间,堆栈初始为RAM最高地址
 楼主| pantodd 发表于 2008-1-4 09:35 | 显示全部楼层

谢谢,ATmega16兄。

我发现我在OPTION中设置的RSTACK AND CSTACK的大小和MPA表不一样。
我设置RSTACK 为 128 CSTACK为0X90,结果,MAP表中显示为:
CSTACK               DATA          00000100 - 0000018F          90   dse    0
RSTACK               DATA          00000190 - 0000028F         100   dse    0
这是为什么?

ATmega16 发表于 2008-1-4 10:23 | 显示全部楼层

MAP里面的是16进制

RSTACK 为 128 ,是128字,256字节,十六进制0X100,
CSTACK为0X90 

RSTACK用来保存返回地址,没有必要设置256字节这么大。

CSTACK用来保存函数局部变量,可以大一些。

评分

参与人数 1威望 +6 收起 理由
qin552011373 + 6 很给力!

查看全部评分

 楼主| pantodd 发表于 2008-1-4 11:15 | 显示全部楼层

再次感谢ATmega16兄。

WolfMvP 发表于 2012-6-14 10:53 | 显示全部楼层
受益匪浅!:handshake
bill_shi68 发表于 2013-4-13 17:49 | 显示全部楼层
受益匪浅!
qin552011373 发表于 2013-4-14 11:16 | 显示全部楼层
ATmega16 发表于 2008-1-4 10:23
RSTACK 为 128 ,是128字,256字节,十六进制0X100,CSTACK为0X90 RSTACK用来保存返回 ...

解答很精彩
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

80

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部