打印
[AVR单片机]

IAR中堆栈位置的一个问题

[复制链接]
6685|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
这是为什么?

使用特权

评论回复
5
ATmega16| | 2008-1-4 10:23 | 只看该作者

MAP里面的是16进制

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

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

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

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6 很给力!
6
pantodd|  楼主 | 2008-1-4 11:15 | 只看该作者

再次感谢ATmega16兄。

使用特权

评论回复
7
WolfMvP| | 2012-6-14 10:53 | 只看该作者
受益匪浅!:handshake

使用特权

评论回复
8
bill_shi68| | 2013-4-13 17:49 | 只看该作者
受益匪浅!

使用特权

评论回复
9
qin552011373| | 2013-4-14 11:16 | 只看该作者
ATmega16 发表于 2008-1-4 10:23
RSTACK 为 128 ,是128字,256字节,十六进制0X100,CSTACK为0X90 RSTACK用来保存返回 ...

解答很精彩

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

80

帖子

0

粉丝