ARM开发初级-STM32F4启动流程与启动文件分析-学习笔记04

1. STM32F4的启动流程

启动流程指复位或上电到执行到main中间,板子做的事情
ARM开发初级-STM32F4启动流程与启动文件分析-学习笔记04_第1张图片
中断向量表是处理终端时函数的地址。中断向量表中的前1-4个字节是一个地址,指向一个栈空间;第5-8个字节是复位向量,它表示程序执行的起始位置。
在板子一上电或者复位的时候,板子做的第一件事情是读取 0x0000 0000 - 0x0000 0003,把读到的值指向MSP(主栈指针),然后读取0x0000 0004 - 0x0000 0007存放的复位向量,把读取到的值指向Reset_Handler。到这一步位置都是处理器自动完成,不需要写代码。

ARM开发初级-STM32F4启动流程与启动文件分析-学习笔记04_第2张图片
上图能将跳转关系体现的更加明显。在0x00000000读取到栈顶地址0x20000428。然后读取后四个字节0x00000004的值是0x08000c59,这个地址指向Reset_Handler的地址0x08000c58。我们发现0x0800c59和0x0800c58之间差了一个数,这是因为奇数能证明其在Thumb状态下执行。最后在复位程序中有一步可以跳转到我们的main函数。
下面思考三个问题

  1. 我们程序是烧录在Flash里的,Flash的起始地址为0x08000000。CPU怎么从0x00000000开始运行呢?
    ARM开发初级-STM32F4启动流程与启动文件分析-学习笔记04_第3张图片
    这涉及到STM32F4的启动模式,它有三种启动模式,分别是从片上闪存启动、从片上系统闪存启动运行bootloader 和 从片上SRAM启动。我们通过控制BOOT引脚来决定怎么启动。
    Flash就是我们常用烧录代码的地方
    System memory处启动:厂商会烧一些固件,支持通过串口烧录程序到板子
    SRAM处启动:SRAM掉电数据会丢失,当我们调试程序的时候需要大量的改动代码的时候,可以把程序烧入SRAM进行调试,调试好了以后在烧入Flash中
    ARM开发初级-STM32F4启动流程与启动文件分析-学习笔记04_第4张图片
    上图就是具体怎么控制引脚来决定怎么启动。系统会把对应的启动地址赋值给0x00000000,我们开机取值的之后就指向了我们要求的启动位置。

  2. 堆、栈是什么?我们为什么要有堆栈

    C语言的运行必须要堆栈的环境,因此我需要在程序的一开始设置好堆栈,以便运行C函数

    • 栈的作用是用于局部变量,函数调用,函数形参等的开销
    • 堆主要用来动态内存的分配
      ARM开发初级-STM32F4启动流程与启动文件分析-学习笔记04_第5张图片
      上图是C语言的执行环境,我们有只读区、可读写区、堆区、共享库的内存映像、栈区。共享库的内存映像里封装了库函数之类的东西可供调用;可读写区中data是指初值非0的全局变量,bss指初始化为0的全局变量,
  3. 为什么堆栈要分配到SRAM中而不是Flash中?
    在这里插入图片描述
    项目在build以后会显示上图,Code、RO-data等的含义见下表

程序组件 所属类别
机器代码指令 Code
常量 RO-data
初值非0的全局变量 RW-data
初值为0的全局变量 ZI-data
局部变量 ZI-data栈空间
使用malloc动态分配的空间 ZI-data堆空间

上表有6个程序组件但是在实际上并不是每一块都被烧录进板子,只烧录了可读写区的数据和只读的数据(包含代码),下图很好的体现了,ZI-data没有被烧进Flash,这些值得初始值为0,虽然这些数据是需要被执行的,但浪费空间。在真正执行的时候我们只需要知道ZI-data多大,给他分配这一块空间就可以了。在执行的时候只读部分不动,RW section需要复制到SRAM中进行具体操作,这是SRAM和FLASH的特点不同导致的。
ARM开发初级-STM32F4启动流程与启动文件分析-学习笔记04_第6张图片

2. 部分STM32F4的启动文件分析

你可能感兴趣的:(#,1.,ARM开发初级,arm开发,stm32,学习)