超级详细讲解stm32f10x系列的启动文件(一)

        声明:这次讲解真的超级详细,根据标准库的启动文件,一步步介绍的。看的时候可以与启动文件一起查看学习。

1、栈

Stack_Size      EQU     0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3

Stack_Mem       SPACE   Stack_Size

__initial_sp

【解释EQU】给数字常量取一个名字,相当于C 语言中的define

【解释AREA STACK】 标明汇编一个新的代码段或者数据段  段名字为STACK

【解释NOINIT】 不初始化

【解释READWRITE】 表示这个段内容是可读可写的

【解释ALIGN】编译器对指令或者数据的存放地址进行对齐,这里是8字节对齐(2^3)

【解释SPACE】 这个指令标明分配内容空间

【解释 SPACE   Stack_Size】 分配大小为Stack_Size的空间

【解释__initial_sp】在initial_sp之前分配了1KB字节大小的空间,initial_sp表示栈的结束地址。比如我的此时__initial_sp值为0x20000608,因为大小位0x400,所以栈开始地址是0x2000_0208。有的朋友可能会问没什么不是从0x2000_0000开始,我这里使用了堆。堆的空间范围是0x20000008——0x20000208。

 

拓展:有的同学可能好奇,0x2000_0000与0x2000_0004呢?

0x20000000       存的是    __microlib_freelist

0x20000004       存的是    __microlib_freelist_initialised

我这里是使用了微库(MicroLIB)(KEIL软件的魔术棒->target)

        总结:开辟一个大小位0x0000_0400(1KB)大小的栈空间,段名字为STACK,内部是8字节对齐,段内空间数据是可读可写的。

        有朋友可能会问,什么东西会存放到栈呢?

        所有的局部变量等等。比如我这里写了 int add (int a, int b)函数,那么当程序执行到这个函数的时候,会把这个函数内部定义的局部变量,存放到栈中。

2、堆

        首先说明:堆空间的真正开辟是在项目中有使用malloc函数申请内存。如果没有使用malloc,那么虽然在.s文件中定义了分配堆空间,实际情况下,堆空间是没有开辟的。

Heap_Size       EQU     0x00000200

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3

__heap_base

Heap_Mem        SPACE   Heap_Size

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值