
一、堆栈空间的定义
-
Stack_Size EQU 0x400:定义栈的空间大小1024字节。 -
AREA STACK, NOINIT, READWRITE, ALIGN=3:STACK为段名,可以随意命名;NOINIT表示不初始化;READWRITE表示可读可写;ALIGN=3表示按照栈空间按照2^3字节对齐 -
Stack_Mem SPACE Stack _Size:开辟栈大小1024B并用0填充 -
__initial_sp:标记栈顶的地址
-
Heap_Size EQU 0x200:定义堆大小为512字节 -
AREA HEAP, NOINIT, READWRITE, ALIGN=3:HEAP为段名,可以随意命名;NOINIT表示不初始化;READWRITE表示可读可写;ALIGN=3表示按照堆空间按照2^3字节对齐 -
__heap_base:堆空间基址(即起始地址) -
Heap_Mem SPACE Heap_Size:开辟堆空间512字节,并清0 -
__heap_limit:堆空间结束地址 -
PRESERVE8:设置这个文件告诉编译器链接时堆栈是8字节对齐 -
THUMB:开始使用thumb指令模式
二、中断向量表的定义
-
AREA RESET, DATA, READONLY:表示复位后,中断向量表映射到地址0 -
EXPORT __Vectors:声明全局符号,表示中断向量表入口地址 -
EXPORT __Vectors_End:声明全局符号,中断向量表结束地址 -
EXPORT __Vectors_Size:声明全局符号,中断向量表大小 -
__Vectors DCD __initial_sp ;Top of Stack:表示栈顶地址
-
__Vectors_Size EQU __Vectors_End – __Vectors:计算中断向量表的长度
-
AREA |.text|, CODE, READONLY:定义为只读代码段
-
Reset_Handler PROC:表示复位中断服务的入口
-
EXPORT Reset_Handler [WEAK]:这里声明复位中断向量为全局的,可供外部调用,WEAK标记本代码为备用编译
-
IMPORT SystemInit:表示导入systeminit
-
IMPORT __main:表示导入C库中的main标号,这个是C库中的内容,非我们自己的main函数 -
LDR R0, =SystemInit:让R0等于SystemInit的地址 -
BLX R0:表示跳到systeminit -
LDR R0, =__main:让R0等于main的地址 -
BX R0:执行lib_init等C库的初始化工作,结束后再进入用户的main函数 -
ENDP:结束
三、虚拟异常处理程序

四、用户栈和堆初始化的一个过程
