打印

STM32启动代码不解

[复制链接]
2216|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
菜鸟同学|  楼主 | 2012-8-16 18:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Stack_Size      EQU     0x00000500
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp

为什么__initial_sp 在后面被称为是标号,而且是0x20000000(RAM 在STM32 中的映射地址)+Stack_Size
为什么一下就变成这样的数据了,不解。为什么不是这样
__initial_sp
Stack_Size      EQU     0x00000500
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size  

就是想问一句__initial_sp 为啥就变成0x20000000+Stack_Size
沙发
菜鸟同学|  楼主 | 2012-8-17 09:06 | 只看该作者
求香主解疑!:lol

使用特权

评论回复
板凳
IJK| | 2012-8-17 11:35 | 只看该作者
LZ应该查看具体的汇编器 的文档。

另外,汇编语言一般情况下,__initial_sp 这种写法都被称为是标号。

使用特权

评论回复
地板
菜鸟同学|  楼主 | 2012-8-17 18:12 | 只看该作者
3# IJK

我就是一直在学习ARM汇编,ARM汇编的基础不够。

使用特权

评论回复
5
aozima| | 2012-8-17 18:36 | 只看该作者
__initial_sp写在SPACE的后面,所以__initial_sp所在的地址就是SPACE+size

使用特权

评论回复
6
blowlow| | 2012-8-17 18:42 | 只看该作者
__initial_sp这个值就是SPACE+size,没问题的。

它要赋给sp register的,ARM Cortex的堆栈是倒着长的,从高位地址向低位地址增长,因此sp register的初始值必须是堆栈的末端地址。

使用特权

评论回复
7
airwill| | 2012-8-17 22:33 | 只看该作者
楼上分析得完全正确.
因为 __initial_sp 要 Stack_Mem  + Stack_Size
而编译器总是从小地址往下排的, 所以就要

Stack_Size      EQU     0x00000500
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp   (放到后面来)

使用特权

评论回复
8
菜鸟同学|  楼主 | 2012-8-20 17:53 | 只看该作者
6# blowlow
谢谢的你的回答,我想明白了,一时头脑发热短路,想不清楚。

使用特权

评论回复
9
john_lee| | 2012-8-20 20:08 | 只看该作者
仔细想想,其实把栈指针(sp)直接定位到 RAM 末尾就行了,哪还需要在启动代码中定义stack?MDK 有够衰的。

使用特权

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

本版积分规则

35

主题

707

帖子

8

粉丝