ARM启动文件详解
好酷屋教程网小编为您收集和整理了ARM启动文件详解的相关教程:在keil软件中创建ARM工程的时候,总是在工程看到有startup_xxxx_hd.s(xxxx为芯片型号)这样一个文件,该文件为ARM的启动文件。在工程的main函数执行之前的工作就是执行启动文件
在keil软件中创建ARM工程的时候,总是在工程看到有startup_xxxx_hd.s(xxxx为芯片型号)这样一个文件,该文件为ARM的启动文件。在工程的main函数执行之前的工作就是执行启动文件。接下来就具体剖析一下启动文件的内容与工作。一、堆栈空间的定义
首先,一开始启动文件的任务是对于栈空间进行定义: 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指令模式二、中断向量表的定义
在堆栈定义好后,接下来的工作就是对于中断向量表进行定义。 1、中断向量定义的入口,声明一些变量。 AREA RESET, DATA, READONLY:表示复位后,中断向量表映射到地址0 EXPORT __Vectors:声明全局符号,表示中断向量表入口地址 EXPORT __Vectors_End:声明全局符号,中断向量表结束地址 EXPORT __Vectors_Size:声明全局符号,中断向量表大小 __Vectors DCD __initial_sp ;Top of Stack:表示栈顶地址 2、定义中断的函数指针了。 Reset_Handler定义的是复位中断的函数指针,NMI_Handler到SysTick_Handler就是内核中断的函数指针。 然后从WWDG_IRQHandler到WAKEUP_PIN_IRQHandler就是外设中断的函数指针。 最后,__Vectors_End表示中断向量表结束。 3、配置中断向量表。__Vectors_Size EQU __Vectors_End – __Vectors:计算中断向量表的长度
AREA |.text|, CODE, READONLY:定义为只读代码段
Reset_Handler PROC:表示复位中断服务的入口
EXPORT Reset_Handler :这里声明复位中断向量为全局的,可供外部调用,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:结束三、虚拟异常处理程序
这里要进行说明的是,weak标记说明:如果使用这个备用的函数(外部文件中没有XXX_Handler),这里的B指令用nop替换,让编译器忽略,外部找不到任何NMI_Handler函数时的警告或错误。四、用户栈和堆初始化的一个过程
以上就是ARM启动文件的主要内容。以上就是好酷屋教程网小编为您收集和整理的ARM启动文件详解相关内容,如果对您有帮助,请帮忙分享这篇文章^_^
本文来源: https://www.haoku5.com/IT/639fc803ef7721b00d012a72.html
相关推荐
热门专题
PS快捷键_PS快捷键大全
经典的Photoshop快捷键大全,如果你是入门阶段的水平,熟读此文并掌握,马上进阶为中级水平。matlab怎么换行?matlab换行教程
今天小编为大家带来的是matlab换行的教程,想知道怎么换行的小伙伴来看看接下来的这篇文章吧,相信一定会帮到你们的。matlab怎么换行?matlab换行教程1、首先在matlab主页面板中点击【Matlab求矩阵的乘积的操作方法
很多用户在使用Matlab的时候,不是很熟悉其中怎么求矩阵的乘积的?本期为你们带来的教程就描述了Matlab求矩阵的乘积的操作方法。Matlab求矩阵的乘积的操作方法打Matlab,在命令行窗口分区工具diskgenius强制删除文件的具体使用流程
很多人不知道分区工具diskgenius如何强制删除文件?今日为你们带来的文章是关于分区工具diskgenius强制删除文件的具体含义讲解,还有不清楚小伙伴和小编一起去学习一下吧。分区工具diskggoldwave怎么启用延迟录制计时器?goldwave启用延迟录制计时器教程
很多小伙伴在使用goldwave的时候,想知道怎么启用延迟录制计时器,下面小编就为大家分享教程,感兴趣的小伙伴不要错过哦!goldwave怎么启用延迟录制计时器?goldwave启用延迟录制计时器教pycharm使用技巧
今天小编给大家讲解pycharm使用技巧,有需要或者有兴趣的朋友们可以看一看下文,相信对大家会有所帮助的。pycharm使用技巧使用PyCharm软件需要python运行环境,这里我已经下载好。CAD看图软件哪个好用?如何使用CAD看图软件
在CAD中,大家都知道CAD图纸是使用CAD制图软件来绘制完成的,那保存的格式就是为dwg格式和dxf格式的。那需要对图纸内容进行查看的时候,就要适用到CAD看图软件。但看图软件有很多,那么CAD看图diskgenius怎么将分区中的文件复制到指定目录?diskgenius将分区中的文件复制到指定目录方法
使用diskgenius的时候,很多小伙伴不知道怎么将分区中的文件复制到指定目录,下面小编就给大家带来方法,有需要的小伙伴不要错过哦。diskgenius怎么将分区中的文件复制到指定目录?diskg分区工具diskgenius将硬盘合并分区的详细流程
说起分区工具diskgenius伙伴们都不陌生,那么使用怎么使用分区工具将硬盘合并分区呢?下面一起看看关于分区工具diskgenius将硬盘合并分区的详细流程吧。分区工具diskgenius将硬盘合MathType中公式与文字错位的处理方法
最近有很多朋友向我咨询关于MathType中公式与文字错位的问题,今天就为大家介绍MathType中公式与文字错位的处理方法,希望能够帮助到大家。MathType中公式与文字错位的处理方法方法一