RAM和Thumb指令
ARM指令中的程序0x0800,0bf0相应的在中断向量表中的地址是0x0800,0bf1这是因为,Cortex-M4只能跑在Thumd指令下,两个的区别就是最低位不同。
- Set the initial SP//设置初始化SP指针
* - Set the initial PC == Reset_Handler,//程序计数值
* - Set the vector table entries with the exceptions ISR address
* //设置中断向量表作为ISR地址的入口
* - Branches to main in the C library (which eventually calls main()).
* //进入main的分支,最终通过main()函数
Stack_Size EQU 0x1000
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
1 Static- 栈空间
EQU:宏定义的伪指令,与C语言的#define
相当,Stack_Size=0x1000(4K)的空间。
AREA:告诉汇编器,这是一段新的代码段或数据段,STACK表示段名,可以任意命名,NOINIT 表示不初始化;READWRITE 表示可读可写,ALIGN=3,表示按照2^3对齐,即8 字节对齐。
SPACE::用于分配一定大小的内存空间,单位为字节。这里指定大小等于Stack_Size。标号__initial_sp 紧挨着SPACE 语句放置,表示栈的结束地址,即栈顶地址,栈是由高向低生长的。
Heap_Size EQU 0x200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
2 Heap- 堆空间
EQU:宏定义的伪指令,与C语言的#define
相当,Heap_Size=0x200(1K)的空间。
AREA:告诉汇编器,这是一段新的代码段或数据段,HEAP表示段名,可以任意命名,NOINIT 表示不初始化;READWRITE 表示可读可写,ALIGN=3,表示按照2^3对齐,即8 字节对齐。
__heap_base:在申请堆空间前的地址,表示堆的起始地址。
SPACE::用于分配一定大小的内存空间,单位为字节。这里指定大小等于Heap_Size。标号__heap_limit 紧挨着SPACE 语句放置,表示堆的结束地址,堆是由低向高生长的。
当全局变量用了static 声明了,那么这个变量,只能够在当前文件使用。
变量和堆栈
Stack主要用于局部变量、函数调用时现场保护和返回地址、函数的形参、数组。当栈空间不足的时候,很容易引发硬件错误。
Cortex-M4向下生长满栈模式
PUSH:SP指针指向存入的最后的值的位置,当有新的数据过来,SP的值先自减4字节在存入新的值。
POP:SP指针指向存入的最后的值的位置,先从SP指针处读取上一次压入的值,SP的值在自增4字节。
栈操作,先入后出:
MAP文件
MAP文件是编译后生成的内存映像报告文件
代码编译出来的结果:
RO-Code:代码占用的空间;
RO-data:Read Only 只读常量的大小,如const型;
RW-data:(Read Write) 初始化了的可读写变量的大小;
ZI-data:(Zero Initialize) 没有初始化的可读写变量的大小。ZI-data不会被算做代码里因为不会被初始化,由编译器初始化为0。