打印
[技术问题解答]

CodeWarrior中自动生成的.ld文件有关栈顶地址分配问题

[复制链接]
2609|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luofeng2g|  楼主 | 2015-1-21 16:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/* Highest address of the user mode stack */
_estack = 0x20001800;    /* end of SRAM */
__SP_INIT = _estack;

/* Generate a link error if heap and stack don't fit into RAM */
__heap_size = 0x800;                                /* required amount of heap  */
__stack_size = 0x200;                                 /* required amount of stack */

/* Specify the memory areas */
MEMORY
{
  m_interrupts        (rx) : ORIGIN = 0x00000000, LENGTH = 0xC0
  m_cfmprotrom         (rx) : ORIGIN = 0x00000400, LENGTH = 0x10
  m_text                 (rx) : ORIGIN = 0x00000800, LENGTH = 64K - 0x800
  m_data            (rwx) : ORIGIN = 0x1FFFF800, LENGTH = 8K                /* SRAM */
}

               
在codewarrior下,
所用的mcu是8k SRAM的,这里的sp指针初始化地址为什么指向0x20001800,因为stack_size 也只有0x200,那后面2k 空间留着干嘛?也即是SRAM_L的2k空间留作何用?


相关帖子

沙发
luofeng2g|  楼主 | 2015-1-21 16:56 | 只看该作者
@FSL_TICS_ZJJ 又来了:lol

使用特权

评论回复
板凳
FSL_TICS_ZJJ| | 2015-1-22 09:49 | 只看该作者
SRAM不仅仅是用来放堆栈,还需要放其他的静态变量以及全局变量等。
所以剩余的空间是给其他变量留的。

使用特权

评论回复
地板
luofeng2g|  楼主 | 2015-1-22 11:46 | 只看该作者
本帖最后由 luofeng2g 于 2015-1-22 13:26 编辑
FSL_TICS_ZJJ 发表于 2015-1-22 09:49
SRAM不仅仅是用来放堆栈,还需要放其他的静态变量以及全局变量等。
所以剩余的空间是给其他变量留的。 ...

那为什么栈不放在SRAM_L上,栈大小也没有超SRAM_L的size?这样不是更好么?

而且现在这边遇到一个问题:
#define BASE_ADDR_BSL_FLAG     0x20001FE0

定义一个指针变量存储在这个地址,可是读这个地址上的值得时候会跳到Default_Handler()!!!不知道怎么回事。
这里的0X20001FE0 应该是在SRAM_L上!

使用特权

评论回复
5
FSL_TICS_ZJJ| | 2015-1-22 13:44 | 只看该作者
luofeng2g 发表于 2015-1-22 11:46
那为什么栈不放在SRAM_L上,栈大小也没有超SRAM_L的size?这样不是更好么?

而且现在这边遇到一个问题:

其实你发现栈结尾定义的就是RAM的结尾地址,这么定义的目的是把你用剩下的RAM都作为栈空间,这样RAM的利用效率最高。

使用特权

评论回复
6
luofeng2g|  楼主 | 2015-1-22 13:52 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-1-22 13:44
其实你发现栈结尾定义的就是RAM的结尾地址,这么定义的目的是把你用剩下的RAM都作为栈空间,这样RAM的利 ...

0x20001800明显不是RAM结尾地址

使用特权

评论回复
7
FSL_TICS_ZJJ| | 2015-1-22 14:12 | 只看该作者
luofeng2g 发表于 2015-1-22 13:52
0x20001800明显不是RAM结尾地址

你是什么芯片?
代码是自动生成的吗?
应该是栈结尾对应的是RAM结尾地址。
我这边的CW生成的是的,而且我们IAR的icf定义也通常把栈地址定义到RAM的最后。

使用特权

评论回复
8
luofeng2g|  楼主 | 2015-1-23 08:55 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-1-22 14:12
你是什么芯片?
代码是自动生成的吗?
应该是栈结尾对应的是RAM结尾地址。

如果是定义到最后我也没有这些疑问了,我用的是MKL16Z64VFT4 应该是64k flash 和8k SRAM
SRAM起始地址应该是0x20000000   这样结尾的话应该是0x20002000吧!代码是建工程时自动生成

使用特权

评论回复
9
FSL_TICS_ZJJ| | 2015-1-23 09:59 | 只看该作者
luofeng2g 发表于 2015-1-23 08:55
如果是定义到最后我也没有这些疑问了,我用的是MKL16Z64VFT4 应该是64k flash 和8k SRAM
SRAM起始地址应 ...

8K SRAM 的地址范围是:
• SRAM_L = [0x2000_0000–(SRAM_size/4)] to 0x1FFF_FFFF
• SRAM_U = 0x2000_0000 to [0x2000_0000+(SRAM_size*(3/4))-1]

算下来“:
• SRAM_L =0X1FFF F800 ~0X1FFF FFFF
• SRAM_U =0X2000 0000~ 0X20001800-1

综上,结尾地址正确。
楼主SRAM范围理解错误。

使用特权

评论回复
10
luofeng2g|  楼主 | 2015-1-23 12:45 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-1-23 09:59
8K SRAM 的地址范围是:
• SRAM_L = [0x2000_0000–(SRAM_size/4)] to 0x1FFF_FFFF
• SRAM_U = 0x2000_ ...

额,我没仔细看手册。在m0+权威手册上看到SRAM地址是从0x20000000开始!就没注意,谢谢耐心解答!

使用特权

评论回复
11
FSL_TICS_ZJJ| | 2015-1-23 13:42 | 只看该作者
luofeng2g 发表于 2015-1-23 12:45
额,我没仔细看手册。在m0+权威手册上看到SRAM地址是从0x20000000开始!就没注意,谢谢耐心解答! ...

不客气,内存地址情况要看kinetis的手册的。

使用特权

评论回复
12
Thefantasy| | 2015-1-26 20:48 | 只看该作者
定义一个指针变量存储在这个地址,可是读这个地址上的值得时候会跳到Default_Handler()!!!不知道怎么回事。
这里的0X20001FE0 应该是在SRAM_L上!

使用特权

评论回复
13
luofeng2g|  楼主 | 2015-1-28 08:51 | 只看该作者
Thefantasy 发表于 2015-1-26 20:48
定义一个指针变量存储在这个地址,可是读这个地址上的值得时候会跳到Default_Handler()!!!不知道怎么回事。 ...

这里的这个地址已经越界了,8k的SRAM尾地址是0x20001800

使用特权

评论回复
14
FSL_TICS_ZJJ| | 2015-1-28 10:41 | 只看该作者
Thefantasy 发表于 2015-1-26 20:48
定义一个指针变量存储在这个地址,可是读这个地址上的值得时候会跳到Default_Handler()!!!不知道怎么回事。 ...

如果有问题,欢迎重新发个问题贴出来。

使用特权

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

本版积分规则

24

主题

824

帖子

5

粉丝