STM32-启动文件详解
创始人
2024-05-10 15:50:55
0

✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!!
📃个人主页:@rivencode的个人主页
🔥系列专栏:玩转FreeRTOS
💬推荐一款模拟面试、刷题神器,从基础到大厂面试题👉点击跳转刷题网站进行注册学习

一.前言

还是那句老话基础不牢地动山摇,今天主要来分析由汇编语言编写的启动文件,在进行main函数之前到底做了哪些准备工作,本篇文章所涉及到的部分汇编指令,以及CPU寄存器SP,PC,LR作用,以及最重要的什么是堆和栈请看->《FreeRTOS-ARM架构与程序的本质》,里面已经详细的阐述了以上问题,本文主要是了解启动文件的作用。

常用汇编指令
在这里插入图片描述

二.汇编文件的作用

一共就下列几个作用
在这里插入图片描述
接下来就是结合汇编代码来理解

1.分配堆和栈

在这里插入图片描述
EQU:宏定义的伪指令,相当于等于,类似与 C 中的 define。
AREA:告诉汇编器汇编一个新的代码段或者数据段。STACK\HEAP 表示段名,这个可以任意命名;NOINIT 表示不初始化;READWRITE 表示可读可写,ALIGN=3,表示按照 2^3对齐,即 8 字节对齐。
SPACE:用于分配一定大小的内存空间,单位为字节。这里指定大小等于 Stack_Size。

标号__initial_sp 紧挨着 SPACE 语句放置,表示栈顶地址,栈是由高向低生长的。

__heap_base 表示对的起始地址,__heap_limit 表示堆的结束
地址。堆是由低向高生长的,跟栈的生长方向相反。

在这里插入图片描述

2.定义向量表

关于中断的知识—>《中断-NVIC与EXTI外设详解》
在这里插入图片描述
向量表:
在这里插入图片描述
其实向量表的本质就是一个元素大小为4字节的数组,而这个数组里面的元素就是这些中断服务函数的名字(也就是中断服务函数的地址),而这张向量表默认就放在flash起始地址处,注意向量表的第一个存储的是栈顶指针(栈顶的地址),开发板上电复位时由CPU将这个栈顶地址赋给CPU的栈寄存器SP

重点:向量表有什么用呢?
当中断来临时内核就会去向量表中找出对应的中断服务函数的地址,并将地址赋给PC寄存器,进而程序跳转去执行中断函数,而这个过程就是由硬件帮助我们完成的。

3.复位程序

在这里插入图片描述
上面的0x0000 0000地址是相当于是flash上的起始地址0x8000 0000
什么叫硬件复位:通俗点将按一下板子上面的复位按钮,自会有硬件电路实现对板子的复位工作。
在这里插入图片描述

一定一定看懂下图,关于flash 的起始地址以及CPU寄存器SP,PC有何作用请看->《FreeRTOS-ARM架构与程序的本质》

在这里插入图片描述

Reset handler的作用
在这里插入图片描述
在这里插入图片描述
Reset handler函数内部会调用_main 函数,而_main调用到main函数进入到C语言的世界,但是_main 在调用main之前做了什么事情呢?
初始化堆栈:

在这里插入图片描述
当然_main做到事情远不止这些,还有关于BL如何返回详情参考—>《FreeRTOS-ARM架构与程序的本质》

反正_main函数的最后会调用main函数,然后你就可以随意的写C代码了

4.中断服务程序

在启动文件里面已经帮我们写好所有中断的中断服务函数,跟我们平时写的中断服务函数不一样的就是这些函数都是空的,真正的中断复服务程序需要我们在外部的 C 文件里面重新实现,这里只是提前占了一个位置而已,以防程序奔溃。
在这里插入图片描述

三.总结

打好基础,深入底层,为学RTOS做好铺垫,加油加油!!
结束语:
最近发现一款刷题神器,如果大家想提升编程水平,玩转C语言指针,还有常见的数据结构(最重要的是链表和队列)后面嵌入式学习操作系统的时如freerots、RT-Thread等操作系统,链表与队列知识大量使用。
大家可以点击下面连接进入牛客网刷题

点击跳转进入网站(C语言方向)
点击跳转进入网站(数据结构算法方向)

在这里插入图片描述

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...