1、启动文件简介
启动文件由汇编语言编写,是系统上电复位后第一个执行的程序,主要做了以下工作:
1)初始化堆栈指针:SP=_initial_sp。
2)初始化程序指针:PC=Reset_Handler。
3)初始化中断向量表。
4)配置系统时钟。
5)调用C库函数_main初始化用户堆栈,最终调用main函数进入C语言世界。
2 、查找ARM汇编指令
在讲解启动代码的时候,会涉及ARM的汇编指令和Cortex内核的指令,有关Cortex内核的指令可以参考《CM3权威指南Cn R2》第4章。剩下的ARM的汇编指令可以在MDK->Help->Uvision Help中检索到,以EQU为例,检索过程如图1-1所示。

图1-1 ARM汇编指令检索示例
检索出来的结果会有很多,我们只需要看Assembler User Guide这部分即可。表1-1列出了启动文件中使用到的ARM汇编指令,该表中的指令全部是从ARM Development Tools这个帮助文档里面检索而来。其中编译器相关的指令WEAK和ALIGN为了方便讲解也放在这个表格中了。
表1-1 启动文件使用的ARM汇编指令汇总

3 、启动文件代码讲解
1.Stack——栈
1 Stack_Size EQU 0x00000400
2
3 AREA STACK, NOINIT, READWRITE, ALIGN=3
4 Stack_Mem SPACE Stack_Size
5 __initial_sp
开辟栈的大小为0x00000400(1k B),名字为STACK,NOINIT即不初始化,可读可写,8(23)字节对齐。
栈是用于局部变量、函数调用、函数形参等的开销,栈的大小不能超过内部SRAM的大小。如果编写的程序比较大,定义的局部变量很多,那么就需要修改栈的大小。如果某一天,你写的程序出现了莫名奇怪的错误,并进入了硬fault,这时就要考虑下是不是栈不够大,溢出了。
EQU:宏定义的伪指令,相当于等于,类似于C中的define。
AREA:告诉汇编器汇编一个新的代码段或者数据段。STACK表示段名,这个可以任意命名;NOINIT表示不初始化;READWRITE表示可读可写,ALIGN=3,表示按照23对齐,即8字节对齐。
SPACE:用于分配一定大小的内存空间,单位为字节。这里指定大小等于Stack_Size。
标号__initial_sp紧

本文深入剖析嵌入式系统的启动文件,详细介绍了启动过程、堆栈初始化、中断向量表配置及复位程序等内容。重点讲解了ARM汇编指令在启动文件中的应用,以及如何配置系统时钟和初始化用户堆栈。
最低0.47元/天 解锁文章
534

被折叠的 条评论
为什么被折叠?



