OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3365|回复: 4

关于启动代码

[复制链接]

11

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2016-4-30
在线时间
44 小时
发表于 2016-9-18 00:01:24 | 显示全部楼层 |阅读模式
50金钱
                                 AREA   USER_STACK, NOINIT, READWRITE;定义一个段,用来当栈,KEIL编译器里面设置栈的起始地址为0x20000000

                                    SPACE        0X00000400   ;分配一段空间作为栈              
MSP_TOP                                                       ;栈顶地址


                                AREA        RESET, DATA, READONLY
                                DCD     MSP_TOP                          ; Top of Stack

                                END


这里是STM32的启动代码的一小部分,有个问题,小弟不太明白。
用仿真来看内存,能发现0x8000000里面存的是0x2000460,按理来说0x20000000+0x00000400应该是0x200000400才对,这多出来的0x000000060是什么??
然后我就跑去map文件里面看(我也不知道这里的是什么东西,可是感觉很棒的样子)
发现了这两段东西
    Symbol Name                              Value           Ov Type        Size              Object(Section)
    .bss                                           0x20000000   Section        96               libspace.o(.bss)
    USER_STACK                              0x20000060   Section        1024            start1.o(USER_STACK)
    MSP_TOP                                   0x20000460   Data             0                start1.o(USER_STACK)

     Symbol Name                                  Value           Ov Type        Size        Object(Section)
    __libspace_start                              0x20000000   Data             96         libspace.o(.bss)
    __temporary_stack_top$libspace       0x20000060   Data              0            libspace.o(.bss)


然后我就将 AREA   USER_STACK, NOINIT, READWRITE 改为 AREA   USER_STACK,DATA, READWRITE
编译之后,发现这时候的0x8000000里面存的是0x2000400了,跑去map看发现变这样了


    USER_STACK                               0x20000000   Section     1024      start1.o(USER_STACK)
    .bss                                           0x20000400   Section       96       libspace.o(.bss)
    MSP_TOP                                    0x20000400   Data           0        start1.o(USER_STACK)


    Symbol Name                                  Value           Ov Type        Size        Object(Section)
    __libspace_start                            0x20000400     Data          96            ibspace.o(.bss)
    __temporary_stack_top$libspace     0x20000460     Data           0             libspace.o(.bss)

请教各位大大,这个NOINIT和DATA属性究竟发生了什么事??




最佳答案

查看完整内容[请看2#楼]

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.kui0099a/armlib_chdfajcf.htm 这里应该是解释了,可是看不懂~
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2016-4-30
在线时间
44 小时
 楼主| 发表于 2016-9-18 00:01:25 | 显示全部楼层
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3720
金钱
3720
注册时间
2011-5-23
在线时间
2012 小时
发表于 2016-9-18 09:56:58 | 显示全部楼层
没有人规定 “ SPACE        0X00000400”放哪,
只规定了 __Vectors 放在入口。
所以user_stack可以随意放,反正不管浮动到哪,MSP_TOP 都会放到 __Vectors 的最前面。
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

11

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2016-4-30
在线时间
44 小时
 楼主| 发表于 2016-9-18 17:21:22 | 显示全部楼层
本帖最后由 stayhungry 于 2016-9-18 17:30 编辑
aozima 发表于 2016-9-18 09:56
没有人规定 “ SPACE        0X00000400”放哪,
只规定了 __Vectors 放在入口。
所以user_stack可以随意 ...

我觉得这个“SPACE        0X00000400”应该不是浮动的吧?也许是编译器决定的。
我是这样判断的
用KEIL->target->IRAM1->0x20000000
发现0x8000000存放的是0x20000460

改为KEIL->target->IRAM1->0x30000000
发现0x8000000存放的是0x30000460

根据上电复位时,0x8000000存放栈的初始栈顶,我猜应该是从编译器这个选项开始分配内存的。

然后我又有一个问题,按理来说M3栈是向下生长的,R13寄存器存放的是栈的SP,可是为什么分配了栈之后,存的会是0x20000460?不是应该是0x20000000吗?小弟水平不足,理解错了请见谅
回复

使用道具 举报

11

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2016-4-30
在线时间
44 小时
 楼主| 发表于 2016-9-18 17:33:33 | 显示全部楼层
stayhungry 发表于 2016-9-18 17:21
我觉得这个“SPACE        0X00000400”应该不是浮动的吧?也许是编译器决定的。
我是这样判断的
用KEIL ...

回答自己的问题,之前没想清楚。

因为SPACE只是分配了这段空间作为栈的空间,可是栈内并没有东西。
所以栈顶还是0x20000460。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 08:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表