arm框架启动流程
STM32的内存管理相关(内存架构,内存管理,map文件分析)_stm32内存管理有什么用-CSDN博客
深入理解STM32内存管理_stm32存储器分为几个区域-CSDN博客
参考的这两个的,总结得很不错,收益匪浅我自己也是补充了一下
1. stm32flash
stm32flash部分可分为3个部分,FLASH主存储器(main memory),Flash 信息区(informationblock),Flash存储接口寄存器区(Flash memory interface)
- 主存储器,该部分用来存放代码和数据常数(cosnt修饰),对于大容量被划分256页,每页2k,小容量和中容量产品只有1k,主存储器的起始地址为0x0800_0000。b0和b1为0的时候运行的就是这个代码
- 信息区,其中启动程序代码,是用来存储ST自带的启动程序,用于串口下载,当B0= 1,B1=0。运行的就是这个区
- 闪存储器块,在执行闪存写操作时,任何对闪存的读操作都会锁定总线,在写完成后才能正确进行,在进行读取或擦除操作时,不能进行代码或者数据的读取操作。
在C/C++程序中,编译的程序占用内存分为5个区,分别为栈区、堆区、全局/静态存储区、常量存储区、代码区。
- 代码区,.text段。通常是指用来存放程序执行代码的一块内存区域
- 全局初始化数据区/静态数据区,.data 包含程序的全局变量,静态变量(全局静态变量和局部静态变量),常量数据(字符串常量)。
- BSS段,存放未初始化的全局变量
- heap,stack,它们在.data段
本质上,只有text段,data段,bss段
2 STM32程序占用ROM(FLASH)和RAM的大小分析
Code代表执行的代码,程序中所有的函数都位于此处。即上述的text段。
RO-data(Read Only)代表只读数据,程序中所定义的全局常量数据和字符串都位于此处,如const型。
RW-data(Read Write)代表已初始化的读写数据,程序中定义并且初始化的全局变量和静态变量位于此处。
ZI-data(Zero Initialize)代表未初始化的读写数据,程序中定义了但没有初始化的全局变量和静态变量位于此处。Keil编译器默认是把你没有初始化的变量都赋值为例0。即上述的bss段。
值得注意的是,这些参数的单位是Byte。
Code和RO-Data两个段统称为RO段,它们和RW段,需要烧录到FLASH等非易失性器件中。
RW段需要烧录到FLASH中,而ZI段则不用,但在运行时,它们都必须装载到可读可写的RAM中。
因此我们可以计算出FLASH和RAM的大小:
==Flash = Code + RO Data + RW Data==
==RAM = RW-data + ZI-data==
3.启动文件startup.xxs
startup_smt32fxxx.s文件是系统的启动文件,主要包括堆和栈的初始化配置、中断向量表、调用Reset Hander.
堆使用时候从起始地址开始,往上加
栈使用时候从结束地址,就是__initial_sp(栈顶指针的地址)开始,往下减他们的空间大小定义好了,如果入栈元素过大,使得元素减到了堆的地址范围,就是栈溢出,这会导致改变堆中相应地址元素的值。同样的,当申请的动态内存过大,使得堆的变量加到了栈的地址范围,就是堆溢出。
堆栈的大小在编译器编译之后是不知道的,只有运行的时候才知道,所以需要注意一点,就是别造成堆栈溢出了,不然就会发生hardfault错误。
ram从 0x2000 0000开始存放的依次为 .data、.bss、HEAP、STACK。
映像文件可以分为加载域(Load Region)和运行域(Execution Region):加载域反映了ARM可执行映像文件各个段存放在存储器中时的位置关系。
4. 启动流程
当选择相应的启动方式时,对应的存储器空间被映射到启动空间(0x00000000)。
从闪存存储器启动:主闪存存储器被映射到启动空间(0x0000 0000) ,也就是0x08000000被映射到0x00000000。
从内嵌SRAM启动 :SRAM起始地址 0x2000 0000 被映射到0x00000000。
从系统存储器启动:系统存储器被映射到启动空间(0x0000 0000),也就是0x1FFF F000被映射到0x00000000。
向量表不人为干预,它保存在FLASH的起始位置,向量表的第一个成员就是存放的SP的初始值,它的值是不固定的,但它被存放的位置是固定的。把PC指针指向RESET_Handler,即执行复位中断服务程序,执行__main,再跳到mian,它存放在向量表中的第二个成员
STM32的启动过程 — startup_xxxx.s文件解析(MDK和GCC双环境)_stm32 .s文件-CSDN博客
这篇文章讲的非常清晰