打印
[其他ST产品]

stm32启动过程、cortex-m3架构、堆栈代码位置、编译汇编链接分析

[复制链接]
173|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
寄存器、架构、工作流程
1.这里以stm32的架构:cortex-m3(也即ARMv7)的寄存器的作用、在指令取,指令的译码,指令的执行在其中的作用以及是如何配合实现代码的执行的

哈佛结构和冯诺依曼结构是如何体现的?

编译后的代码为什么分为code、堆、栈、bss、data、符号等部分,分别存储在哪些地方?

首先看寄存器

寄存器分为寄存器组,和外设寄存器
寄存器组对用户是不可见的(用户不能直接操作),它是CPU处理数据时需要调用的
外设寄存器对用户是可见的(用户可以通过地址的映射来对寄存器操作,从而控制相应的外设动作)



上面的是寄存器组,是在Cortex-M3中用来临时存放运算的数据或者指示程序运行的位置

使用特权

评论回复
沙发
范德萨发法国队|  楼主 | 2024-2-28 10:13 | 只看该作者
1、 寄存器架构
参考官方Cortex-M3权威指南



使用特权

评论回复
板凳
范德萨发法国队|  楼主 | 2024-2-28 10:33 | 只看该作者
本帖最后由 范德萨发法国队 于 2024-2-28 11:05 编辑

总线与各个部件之间的关系(主要是I-Code Bus、D-Code Bus、System Bus)

使用特权

评论回复
地板
范德萨发法国队|  楼主 | 2024-2-28 11:06 | 只看该作者



上图所示的指令总线与数据总线与CM3内部的数据总线和数据总线不一样,具体可以看下面Cortex-M3内部结构图,而且上图的两个总线共用一个总线矩阵,就导致取指令和访问数据不能同时访问flash(在CM3里,指令和数据都是存放在flash中,部分数据存放在SRAM中,具体可以看指令和数据在stm32中存放的结构那一节),

使用特权

评论回复
5
范德萨发法国队|  楼主 | 2024-2-28 11:07 | 只看该作者
而CM3外部总线部分是有芯片产商来决定,所以stm32的指令和数据总线是由意法半导体来设计制造的,具体架构如下图所示,可以看到该架构,指令和数据总线并没有共用一个总线矩阵,数据总线和系统总线是共用总线矩阵,从Cortex-M3的地址映射关系(从存储器映射来看stm32架构(内存与外设)那一节和指令和数据在stm32中存放的结构那一节),可以知道数据总线是是访问flash中的程序编译好后生成的常量数据(RO-data ),系统总线是访问SRAM中程序运行过程中产生的动态数据(ZI-data、)
RW-data在程序复位启动时是数据总线访问然后RW-data被复制到SRAM中通过系统总线访问

使用特权

评论回复
6
范德萨发法国队|  楼主 | 2024-2-28 11:07 | 只看该作者
因为静态数据和动态数据不会同时访问,所以不用设计成可以同时访问的,也就可以共用一个总线矩阵
而读取指令和访问数据是可以同时进行的,所以就没有共用一个总线矩阵,这里就体现了哈佛结构的特性,指令与数据可以同时访问

使用特权

评论回复
7
范德萨发法国队|  楼主 | 2024-2-28 11:13 | 只看该作者
下面这个是32官方参考手册,才是我们真正使用stm32的MCU具备的系统结构

使用特权

评论回复
8
范德萨发法国队|  楼主 | 2024-2-28 11:18 | 只看该作者
体系结构:哈佛结构与冯诺依曼结构的区别
上述I-code与D-code与flash的连接就体现了哈佛结构的特性:



复位有三种启动方式,从哪里开始启动、启动代码的所在的位置
复位后启动的位置都是从内存地址为0x00000000的位置开始,如下图:

使用特权

评论回复
9
范德萨发法国队|  楼主 | 2024-2-28 12:05 | 只看该作者
但是根据boot引脚的硬件配置,有三种不同的硬件映射方式,将处于内存(Flash、system memery、SRAM)中不同地址(参考上面存储器映射)的启动代码,映射到0x00000000这个位置;


一般都是将位于Flash的启动代码映射到0地址的位置,这个时候,取指令是通过ICode总线,取数据靠的是DCode和System 总线,通过不同的总线和总线矩阵,以及流水线的实现,可以实现指令和数据的同时访问,这样就体现了哈佛结构;

使用特权

评论回复
10
范德萨发法国队|  楼主 | 2024-2-28 12:12 | 只看该作者
从存储器映射来看stm32架构(内存与外设)
STM32架构相关

内存的映射就是数据和代码实际存放的地址

外设映射的地址其实是控制该外设的寄存器的地址

整个架构说的就是处理核心、内存与外设寄存器它们的关系,是怎么通过各种总线连接起来的

如果取指令和访问数据能同时进行,那么这种总线连接的关系,就可以称之为哈佛结构;

存储器地址映射如下:

使用特权

评论回复
11
范德萨发法国队|  楼主 | 2024-2-28 12:26 | 只看该作者


以上三图都是在 Cortex-M3权威指南 中定义的,说明该架构的这些存储器映射是有arm定义好的,不是由芯片生产厂商来定义

下图为 stm32中文参考手册中定义的,这具体的就是有芯片生产厂家来定义的,主要介绍了code区、SRAM、片上外设(编程时主要就是用这里的地址来控制相应的模块)

使用特权

评论回复
12
范德萨发法国队|  楼主 | 2024-2-28 12:46 | 只看该作者

使用特权

评论回复
13
范德萨发法国队|  楼主 | 2024-2-28 12:55 | 只看该作者
由上四图可知,外设分为片上外设(USART、GPIO等模块)、片外外设(这个需要自己扩展)、核内外设(中断NVIC、路径跟踪TPIU等、调试接口SWJ,它并不是调试组件),这里的核内是相对于Cortex-M3,在它内部的外设叫核内外设(用户程序没有权限访问);
下图的附加调试组件与再下一个图的外部私有外设总线相连

使用特权

评论回复
14
范德萨发法国队|  楼主 | 2024-2-28 12:55 | 只看该作者
Cortex-M3内部还有一个核心CM3Core,它周围的外设叫核内外设(调试系统(调试组件)为核内外设,核内外设是由arm公司设计的); CM3Core和核内外设组成Cortex-M3;
Cortex-M3周围的外设叫片上外设;
Cortex-M3和片上外设组成stm32芯片;
Cortex-M3模块结构图:


使用特权

评论回复
15
范德萨发法国队|  楼主 | 2024-2-28 12:56 | 只看该作者
上述两张图第一张是CM3Core和核内外设(包括调试组件,调试组件分为核内和核外调试组件,核内调试组件由arm公司设计,核外调试组件由st公司设计),主要由ARM设计;
第二张图除了CM3Core和核内外设组成的Cortex-M3,以及Trace controller(调试组件),其它的是芯片制造公司设计制造的
抽象图如下两张图所示:

使用特权

评论回复
16
范德萨发法国队|  楼主 | 2024-2-28 12:56 | 只看该作者
下图的调试系统应该也属于Cortex-M3内核中的一部分,由arm设计的应该是属于核内外设(在图4G地址空间划分中block 7 属性中有说)

使用特权

评论回复
17
范德萨发法国队|  楼主 | 2024-2-28 13:00 | 只看该作者
试系统知识

提示:Cortex-M3内核内含的硬件调试模块是ARM CoreSight开发工具集的子集。

ARM Cortex-M3内核提供集成的片上调试功能。它由以下部分组成:

SWJ-DP:串行/JTAG调试端口
AHP-AP: AHB访问端口
ITM:执行跟踪单元
FPB:闪存指令断点
DWT:数据触发
TPUI:跟踪单元接口(仅较大封装的芯片支持)
ETM:嵌入式跟踪微单元(在较大的封装上才有支持此功能的引脚),专用于STM32F1的调试特性
灵活的调试引脚分配
MCU调试盒(支持低电源模式,控制外设时钟等)

使用特权

评论回复
18
范德萨发法国队|  楼主 | 2024-2-28 13:00 | 只看该作者
从CM3内核架构来看CPU流水线–分析Cortex-M3内核架构
从上一节我们了解到Cortex-M3的内核CM3,它就相当于日常电脑的CPU,架构图如下:Processor Core System那部分

使用特权

评论回复
19
范德萨发法国队|  楼主 | 2024-2-28 13:46 | 只看该作者
上图的Register Bank又可以分为以下:

使用特权

评论回复
20
范德萨发法国队|  楼主 | 2024-2-28 13:54 | 只看该作者
ARM CPU的组成



三级流水线

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

88

帖子

0

粉丝