ARM启动文件详解

0 评论
keil软件中创建ARM工程的时候,总是在工程看到有startup_xxxx_hd.sxxxx为芯片型号)这样一个文件,该文件为ARM的启动文件。在工程的main函数执行之前的工作就是执行启动文件。接下来就具体剖析一下启动文件的内容与工作。
 

一、堆栈空间的定义

首先,一开始启动文件的任务是对于栈空间进行定义:

ARM启动文件详解

  • Stack_Size EQU  0x400定义栈的空间大小1024字节。
  • AREA STACK, NOINIT, READWRITE, ALIGN=3STACK为段名,可以随意命名;NOINIT表示不初始化;READWRITE表示可读可写;ALIGN=3表示按照栈空间按照2^3字节对齐           
  • Stack_Mem SPACE  Stack _Size:开辟栈大小1024B并用0填充
  • __initial_sp:标记栈顶的地址
然后是对于堆空间的定义

ARM启动文件详解

  • Heap_Size EQU  0x200:定义堆大小为512字节
  • AREA HEAP, NOINIT, READWRITE, ALIGN=3HEAP为段名,可以随意命名;NOINIT表示不初始化;READWRITE表示可读可写;ALIGN=3表示按照堆空间按照2^3字节对齐  
  • __heap_base:堆空间基址(即起始地址)
  • Heap_Mem SPACE  Heap_Size:开辟堆空间512字节,并清0
  • __heap_limit:堆空间结束地址
  • PRESERVE8设置这个文件告诉编译器链接时堆栈是8字节对齐
  • THUMB开始使用thumb指令模式

二、中断向量表的定义

在堆栈定义好后,接下来的工作就是对于中断向量表进行定义。
1、中断向量定义的入口,声明一些变量。

ARM启动文件详解

  • AREA RESET, DATA, READONLY:表示复位后,中断向量表映射到地址0
  • EXPORT __Vectors:声明全局符号,表示中断向量表入口地址
  • EXPORT __Vectors_End:声明全局符号,中断向量表结束地址
  • EXPORT __Vectors_Size:声明全局符号,中断向量表大小
  • __Vectors  DCD  __initial_sp ;Top of Stack:表示栈顶地址
2、定义中断的函数指针了。

ARM启动文件详解

Reset_Handler定义的是复位中断的函数指针,NMI_HandlerSysTick_Handler就是内核中断的函数指针。

ARM启动文件详解

ARM启动文件详解

然后从WWDG_IRQHandlerWAKEUP_PIN_IRQHandler就是外设中断的函数指针。
最后,__Vectors_End表示中断向量表结束。
3、配置中断向量表。

ARM启动文件详解

  • __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_initC库的初始化工作,结束后再进入用户的main函数
  • ENDP:结束

三、虚拟异常处理程序

这里要进行说明的是[WEAK],weak标记说明:如果使用这个备用的函数(外部文件中没有XXX_Handler),这里的B指令用nop替换,让编译器忽略,外部找不到任何NMI_Handler函数时的警告或错误。
ARM启动文件详解

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

ARM启动文件详解
以上就是ARM启动文件的主要内容。
相关软件
Keil®MDK是基于ARM®的微控制器的最全面的软件开发解决方案。包括您需要创建,构建所有的组件以及调试嵌入式应用。
支持8051微控制器体系结构的Keil开发工具,适合每个阶段的开发人员,不管是专业的应用工程师,还是刚学习嵌入式软件开发的学生。 产业标准的Keil C编译器、宏汇编器、调试器、实时内核、单板计算机和仿真器,支持所有的8051系列微控制器,
相关阅读