前言:
目前兄弟们对“什么是启动文件启动文件的作用是什么”大体比较注意,我们都需要知道一些“什么是启动文件启动文件的作用是什么”的相关内容。那么小编在网上收集了一些关于“什么是启动文件启动文件的作用是什么””的相关资讯,希望看官们能喜欢,朋友们一起来学习一下吧!前言
今天是大年初九,上班的第一天。闲逛发现了一篇讲解微控制器启动文件的文章,但是说的很粗糙,只说了一下启动文件的功能,没有一些详细讲述,于是就去搜了一下相关资料,加上自己的理解分享给大家。我以手边的STM32F103单片机的启动文件为例。
什么是微控制器的启动文件
启动文件是用汇编语言编写的一段代码(通常是 .s 文件),在嵌入式应用程序的 main()函数之前执行。它通过设置微控制器的硬件来执行各种初始化步骤,以便用户应用程序可以运行。
启动文件的功能
启动文件总是在嵌入式应用程序的 main()代码之前运行。它通常配置堆栈,处理变量,禁用中断。它还包含一个函数指针数组(中断向量表),这些指针指向各种中断向量例程,例如中断和异常。具体作用如下:
初始化堆栈指针:将堆栈指针(SP)初始化为_initial_sp。初始化程序计数器PC指针:将PC指针初始化为Reset_Handler,这是复位中断处理程序的入口地址。设置堆、栈的大小、初始化中断向量表:中断向量表是一个包含中断处理函数地址的表格,用于在发生中断时跳转到相应的处理函数。STM32启动文件会定义和实现相应的中断函数,并将它们的地址放入中断向量表中。定义和实现相应的中断函数,函数全部为[WEAK],这意味着它们可以被外部文件中的同名函数覆盖。配置系统时钟:调用SystemInit函数完成系统时钟的初始化。调用C库函数_main:初始化用户堆栈,从而最终调用main函数,进入C语言的世界。
需要注意的是,启动文件中的中断服务程序都是空的,真正的中断服务程序需要我们在外部的C文件中重新实现。如果我们使用某个外设时开启了某个中断,但忘记编写配套的中断服务程序或函数名写错,当中断来临时,程序会跳转到启动文件预先写好的空的中断服务程序中,并在其中无限循环,导致程序死机。
配置栈
EQU:即伪指令Equate,赋值指令,定义Stack_Size为0x00000400.
AREA:指示汇编新的代码段或数据段,STACK为段名,NOINIT为不初始化,READWRITE为可读写,ALING=3表示2的三次方对其,及8字节对齐。
SPACE:数据定义指令,分配一定大小的内容空间,单位为字节
——initial_sp:紧跟SPACE语句后,表示栈的结束地址,即栈顶地址。
配置堆
用于动态内存的分配。
—heap_base:在SPACE语句前,标志堆的起始地址。
—heap_linit:在SPACE语句后,标志堆得结束。
PRESERVE8:指定当前文件的栈按照8字节对齐。
THUMB:表示后面的指令兼容THUMB指令,THUBM 是 ARM 以前的指令集,16bit,现在 Cortex-M 系列的都使用 THUMB-2 指令集,THUMB-2 是 32 位的,兼容 16 位和 32 位 的指令。
初始化中断向量表
AREA RESET, DATA, READONLY; 汇编一个 名叫 RESET,类型位DATA型,只可读的数据段。
EXPORT __Vectors;表示本模块中定义的符号可以为外部模块使用,使符号具有全局属性。
DCD:分配一个或者多个以字为单位的内存,以四字节对齐,并要求初始化这些内存。在向量表中, DCD分配了堆内存,并且以ESR的入口地址初始化它们。
第一个__initial_sp,堆栈指针地址。第二个Reset_Handler,复位程序地址。
__Vectors_Size EQU __Vectors_End - __Vectors;向量表大小等于起始地址-结束地址。
复位程序
这里定义了外部的函数——main,主要作用是初始化用户堆栈,并在函数的最后调用main函数进入我们自己编写的程序,这就是为啥我们的主程序是main函数了。
SystemInit进行时钟初始化函数。
中断服务函数
这些就是一些对应的中断服务函数,WEAK表示若定义,表示我们可以再c语言中进行实现。
堆栈初始化
main来实现的。
到这里启动文件所有的内容就看完了,大家如果手边有启动文件可以自己对应这看一下。
我是点点,会经常分享一些嵌入式开发的问题,如果大家喜欢就点个关注吧,点个赞吧。
标签: #什么是启动文件启动文件的作用是什么