ARM数据/地址总线架构简析

article/2025/9/16 23:47:44

ARM架构简析

1,ARM概述

现在大家讲的ARM的概念实际上是很模糊的,他可能指的是一类芯片,或者指的是ARM公司,亦或者是精简指令集,还是千万人手中的饭碗。下面引用一段关于百度百科关于ARM的准确描述

ARM架构,曾称进阶精简指令集机器(Advanced RISC Machine)更早称作Acorn RISC Machine,是一个32位精简指令集(RISC)处理器架构。还有基于ARM设计的派生产品,重要产品包括Marvell的XScale架构和德州仪器的OMAP系列。

ARM家族占比所有32位嵌入式处理器的75%,成为占全世界最多数的32位架构。

在1980年代晚期,苹果电脑开始与Acorn合作开发新版的ARM核心,由于这专案非常重要,Acorn甚至于1990年将设计团队另组成一间名为安谋国际科技(Advanced RISC Machines Ltd.)的新公司。也基于这原因,使得ARM有时候反而称作Advanced RISC Machine而不是Acorn RISC Machine。由于其母公司ARM Holdings plc于1998年的伦敦交易市场和NASDAQ挂牌上市[1],使得Advanced RISC Machines成了ARM Ltd旗下拥有的产品。

这个专案到后来进入了ARM6,首版的式样在1991年释出,然后苹果电脑使用ARM6架构的ARM 610来当作他们Apple Newton PDA的基础。在1994年,Acorn使用ARM 610做为他们Risc PC电脑内的CPU。

这里八卦一下,其实咱们现在主流的手机芯片骁龙,麒麟和苹果A系列都是基于ARM架构,至于为啥苹果芯片在能耗比和性能上甩开同行1~2代差距,大概就是因为苹果电脑是ARM初创股东吧。

2,储存和架构

接下来用的是一款基于ST公司M4内核的芯片STM32F407ZG举例,一个总的系统架构总的来说需要包含数据总线储存结构****编译器及代码软件指令解释器外部电路

2.1 系统总线概述

STM32F407主系统是一款32位,基于多种AHB总线矩阵构成的,以此来实现多种主控总线的互联互通。

八条主控总线:

— Cortex™-M4F 内核 I 总线、D 总线和 S 总线

— DMA1 存储器总线

— DMA2 存储器总线

— DMA2 外设总线

— 以太网 DMA 总线

— USB OTG HS DMA 总线

七条被控总线:

— 内部 Flash ICode 总线

— 内部 Flash DCode 总线

— 主要内部 SRAM1 (112 KB)

— 辅助内部 SRAM2 (16 KB)

— 辅助内部 SRAM3 (64 KB)(仅适用于 STM32F42xxx 和 STM32F43xxx 器件)

— AHB1 外设(包括 AHB-APB 总线桥和 APB 外设)

— AHB2 外设

— FSMC

通过主控总线与被控总线与总线矩阵的互联互通,实现主控总线对被控总线上数据的访问,以此实现M4内核对外部代码指令和数据的执行和计算。接下来通过芯片手册中提供的系统总线图来了解西总体框架样式。

2_1 M4总线结构

图中所示,各种总线都汇聚在总线矩阵上,通过总线矩阵的流水线实现对所有数据的实时调度,采用的是循环调度算法。

2.1 主控总线
2.1.1 S0:I 总线

此总线用于将 Cortex™-M4F 内核的指令总线连接到总线矩阵。内核通过此总线获取指令。 此总线访问的对象是包含代码的存储器(内部 Flash/SRAM 或通过 FSMC 的外部存储器)。

2.1.2 S1:D 总线

此总线用于将 Cortex™-M4F 数据总线和 64 KB CCM 数据 RAM 连接到总线矩阵。内核通过 此总线进行立即数加载和调试访问。此总线访问的对象是包含代码或数据的存储器(内部Flash 或通过 FSMC 的外部存储器)。

2.1.3 S2:S 总线

此总线用于将 Cortex™-M4F 内核的系统总线连接到总线矩阵。此总线用于访问位于外设 或 SRAM 中的数据。也可通过此总线获取指令(效率低于 ICode)。此总线访问的对象是 112 KB、64 KB 和 16 KB 的内部 SRAM、包括 APB 外设在内的 AHB1 外设、AHB2 外设以 及通过 FSMC 的外部存储器。

2.1.4 S3、S4:DMA 存储器总线

此总线用于将 DMA 存储器总线主接口连接到总线矩阵。DMA 通过此总线来执行存储器数据 的传入和传出。此总线访问的对象是数据存储器:内部 SRAM(112 KB、64 KB、16 KB) 以及通过 FSMC 的外部存储器。

2.1.5 S5:DMA 外设总线

此总线用于将 DMA 外设主总线接口连接到总线矩阵。DMA 通过此总线访问 AHB 外设或执 行存储器间的数据传输。此总线访问的对象是 AHB 和 APB 外设以及数据存储器:内部 SRAM 以及通过 FSMC 的外部存储器。

2.1.6 S6:以太网 DMA 总线

此总线用于将以太网 DMA 主接口连接到总线矩阵。以太网 DMA 通过此总线向存储器存取 数据。此总线访问的对象是数据存储器:内部 SRAM(112 KB、64 KB 和 16 KB)以及通过 FSMC 的外部存储器。

这里附带说一句,其实M4内核在访问FLASH上的软件是分成两个部分进行的,分别是:I总线和S总线,一个访问指令,一个访问数据,这种将指令和数据分开的结构称之为哈佛结构,反之使用一条总线访问数据和指令则称之为冯诺依曼结构,至于孰优孰劣则取决于嵌入式平台应用场景了以及处理复杂程度和系统的实时性。

2.1.7 S7:USB OTG HS DMA 总线

此总线用于将 USB OTG HS DMA 主接口连接到总线矩阵。USB OTG DMA 通过此总线向存储 器加载/存储数据。此总线访问的对象是数据存储器:内部 SRAM(112 KB、64 KB 和 16 KB) 以及通过 FSMC 的外部存储器。

2.2 被控总线

2.2.1 AHB/APB 总线桥 (用一个不恰当的比喻就是类似于电脑里面的南北桥)

借助两个 AHB/APB 总线桥 APB1 和 APB2,可在 AHB 总线与两个 APB 总线之间实现完全 同步的连接,从而灵活选择外设频率。

AHB,是Advanced High performance Bus的缩写,译作高级高性能总线,这是一种“系统总线”。AHB主要用于高性能模块(如CPU、DMA和DSP等)之间的连接。AHB系统由主模块、从模块和基础结构(Infrastructure)3部分组成,整个AHB总线上的传输都由主模块发出,由从模块负责回应。

APB,是Advanced Peripheral Bus的缩写,这是一种外围总线。APB主要用于低带宽的周边外设之间的连接,例如UART、1284等,它的总线架构不像 AHB支持多个主模块,在APB里面唯一的主模块就是APB 桥。再往下,APB2负责AD,I/O,高级TIM,串口1;APB1负责DA,USB,SPI,I2C,CAN,串口2345,普通TIM。

这两者都是总线,符合AMBA规范。AHB为系统资源总线,使用系统最高时钟,主要应用在主屏较高的外设资源通信上,例如以太网,USB等通信协议;而APB则是经过系统时钟分频后总线,主要面向外接设备总线通信,例如:IIC,SPI,UART,AD,TIM等。通过芯片手册中描述的系统时钟树便可以清晰了解到这种结构。

2_2 被控总线结构

2.3 外设总线

上一节中提到外设总线挂载APBX的系统总线上,外设总线根据传输类型来区分主要分为:
1,并行传输
通过多根数据线在一个时钟周期内,同时访问多个寄存器地址,若数据线有8根,那么单次操作则可以获取1个字节的数据长度。较为典型的外设通信协议有:FMSC(静态储存控制器),主要用来外接SDRAM。

2,串行协议
串行通信协议实际上将来自系统总线的并行数据进行拆分,将一个字节分成8位传输,以此实现串口通信。目前ARM外设总线扩展基本都是基于串口协议。串口协议相对于并行传输速度慢,但是物理引脚少,易于封装以及外设接口的通用性收到广泛应用。我们常说的SPI,IIC,UART和CAN等通信都是串行通信。

我们在熟悉ARM系统总线后,若是要提高开发产品的能力,还必须学习外部总线扩展协议,无论是SOC还是MCU始终只是一个芯片,离开了外设他也将毫无价值。我们也必须清楚以上几个常用的串行协议在电平时序和电平电压上及电路抗干扰特点,根据应用场景选择最适合且成本最低的通信方式。关于以上几个常用的串行通信做个简单归纳则为:

① IIC应用场景
多主多从,片上通信(抗干扰差),速度低,端口少(2PIN),半双工异步收发。

② UART(RS232 485 645…)
一主多从,片外通信(抗干扰一般,可以接线),距离一般,端口少(2PIN),全双工同步收发。

③ SPI
一主多从,片内通信(抗干扰较IIC强些而已),速度快(在IIC基础上独立的片选来控制启停,而IIC需要一个ACK电平,双向收发IO),距离短,端口多(较IIC增加两个端口)

④CAN
多主模式(加入了仲裁优先级,光这一点秒杀上述所有协议),片外通信(可外部接线50米来着),距离远(与采用12V差分信号RS485一样),速度快(多主模式下的优势),端口少,成本贵(每个CAN节点均配备独立的CAN控制器和稍复杂的协议驱动)

2.4 储存器组织结构##

上面一整节描述的都是各种各样的总线结构,总线只不过是人们对架构设计时候虚构出来的通道而已,设计总线的目的只不过是对一整个系统中海量的数据设计一个相对安全有序的通道,但是这些数据最终是要保存在硬件设备上的,依托的这个设备就是我们非常常见的储存器了,这也是所有芯片运行最基本硬件了。

2.4.1 储存映射
存储器映射是指把芯片中或芯片外的FLASH,RAM,外设,BOOT,BLOCK等进行统一编址。即用地址来表示对象。这个地址绝大多数是由厂家规定好的,用户只能用而不能改。用户只能在挂外部RAM或FLASH的情况下可进行自定义。

Cortex-M4支持4GB的存储空间,它的存储系统采用统一编址的方式; 程序存储器、数据存储器、寄存器被组织在4GB的线性地址空间内,以小端格式(little-endian)存放。由于Cortex-M3是32位的内核,因此其PC指针可以指向2^32=4G的地址空间,也就是0x0000_0000——0xFFFF_FFFF这一大块空间。

上面描述了两个点:

①统一编址:将IO映射到内存中的架构(区别于51等的独立编码而言),目前主流的大型计算机多使用这种编码方式,其优点是在设计芯片时候可以根据储存大小很容易扩充IO管脚数量,缺点嘛就是浪费了这一块内存了,还有就是访问IO实际上要访问一遍储存,比较消耗时间不适用于小型系统。

②地址总线:M4内核支持16,32,64,128位寻址,而STM32F4则设计为32位系统,意思是他们地址总线有32根,单个周期内能够获取4个字节数据,同时STM32储存器地址被映射为4字节长度表达,所以这款芯片最长寻址地址为:0xff ff ff ff,也就是4GB空间了,当然是不是可以通过两条指令实现64位寻址呢,啊哈哈哈。

还是和上面一样来一张芯片手册山的储存映射图吧,不过4G内存较大导致图片太长了,就不打算用手册上那张详细的图了。

我找了一写网上关于映射储存的描述图片,都不太满意,过两天我把我自己手动画的贴上去吧。

2.4.2 储存分块及其对应功能

① 0x00 00 00 00 —> 0x1f ff ff ff
512M的code区,主要的RW,RO,ZI区域,具体可以看图,想了解详细软件运行过程及数据存放区域自行百度。

② 0x20 00 00 00 —> 0x3f ff ff ff
SRAM内核外部储存器部分

③ 0x40 00 00 00 —> 0x5f ff ff ff
内核外设模块使用空间,主要有APB2,APB1,AHB2

⑥ 0x60 00 00 00 —> 0xbf ff ff ff
外部FSMC的SRAM外部地址总线扩展(其实也不叫扩展,分明就是预留给他的)。

⑦ 0xc0 00 00 00 —> 0xdf ff ff ff
not used

⑧ 0xe0 00 00 00 —> 0xff ff ff ff
芯片内核外设资源储存快

结束语:

其实吧了解上面这些对你开发似乎带来不了什么裨益,但是我们可以学习这种设计思路。可以看到ARM架构在设置之处就非常讲究分层,从总线的分层到时钟的分层,整个流程宛如一个树状图,数据从各个分支汇总到系统总线上,再通过各个途径返回外设各分支总线上。

对于我们编程开发而言,关心的其实只有外设总线那个部分,所以对于我们来说如何在现有的通信协议基础上对通信数据存取进行优化,目前除了系统在带的DMA功能很好用之外,也可以通过一些软件的手段来优化通信数据存取,例如环形链表之类的操作。

后面的话主要讲一下软件工程架构之类的主要和重要细节吧,今天就先说到这儿了。

回外设各分支总线上。

对于我们编程开发而言,关心的其实只有外设总线那个部分,所以对于我们来说如何在现有的通信协议基础上对通信数据存取进行优化,目前除了系统在带的DMA功能很好用之外,也可以通过一些软件的手段来优化通信数据存取,例如环形链表之类的操作。

后面的话主要讲一下软件工程架构之类的主要和重要细节吧,今天就先说到这儿了。


http://chatgpt.dhexx.cn/article/wc4ieWYd.shtml

相关文章

什么是前端总线,后端总线,内部总线、系统总线,外部总线,地址总线,数据总线,控制总线

文章 部分内容来自于 电子发烧友 内部总线、系统总线和外部总线汇总 部分内容来自于 知乎 前端总线,系统总线,内部总线,外部总线 本文是在两篇文章的基础上进行了二次加工,对两篇文章的精华内容进行了提炼,删掉了对理解…

地址总线是单向还是双向_「计算机组成原理」:总线、地址总线、数据总线和控制总线...

总线(Bus):是计算机各种功能部件之间传送信息的公共通信干线. 总线(Bus):是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束, 按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制…

计算机控制总线传输的是,总线,地址总线,数据总线和控制总线

总线(Bus): 这是一条通用的通信干线,可以在计算机的各种功能组件之间传输信息. 它是由电线组成的变速箱线束. 根据计算机传输的信息类型,计算机的总线可以分为数据总线和地址. 总线和控制总线分别用于传输数据,数据地址和控制信号. 总线是一种…

计算机64位地址总线,地址总线与数据总线的关系,功能和宽度

1. 地址总线与数据总线之间的关系 数据总线用于传输数据. 每条数据线传输一个二进制位64位处理器 数据总线,而8条线恰好传输一个字节. 但是,地址总线传输地址,每个地址也传输一个二进制位,而8条地址线传输8个二进制位. 这8个二进制位具有2 ^ 8个不同的变化,因此它们可用于…

地址总线

现在我们知道,CPU是通过地址总线来指定存储器单元的。可见地址总线上能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址。 现假设,一个CPU有10根地址总线,让我们来看一下它的寻址情况。我们知道,在电子计算机…

地址总线、物理地址、虚拟地址讲解

什么是地址总线? 地址总线(Address Bus ;又称位址总线)属于一种电脑总线(一部份),是由CPU或有DMA能力的单元,用来沟通这些单元想要存取(读取/写入)电脑内存元件/地方的实体位址。 换而言之,就…

计算机总线详解(数据总线、地址总线、控制总线)

文章目录 1 概述2 总线分类2.1 数据总线 Data Bus2.2 地址总线 Address Bus2.3 控制总线 Control Bus 3 扩展3.1 常考题3.2 百度百科 - 总线 Bus 1 概述 总线(Bus) 是计算机各种功能部件之间传送信息的 公共通信干线如果说 主板(Mother Boar…

总线之地址总线、数据总线、控制总线

https://www.cnblogs.com/codexlx/p/13252705.html 1.地址总线: CPU是通过地址总线来指定存储单元的,因此总线地址上能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址 一个CPU有N根地址线,那么可以说这个CPU的地址总线…

CentOS8 arm64架构 鲲鹏服务器上安装zabbix-agent

1、使用系统yum源中自带的资源安装 查看yum中自带的zabbix资源包 sudo yum list |grep zabbix安装 sudo install zabbix40-agent.aarch64 # 填写自己服务器上的资源2、下载资源包安装 获取官网下载地址 zabbix官网下载.aarch64.rpm的资源包,地址 搜索需要的包 …

ARM64(aarch64)下安装tensorflow

首先从Github下载安装包: tensorflow-on-arm 选择合适的版本,例如tensorflow-1.14.0-cp35-none-linux_aarch64.whl 命名规则:cp35代表python3.5,aarch64表示架构信息 wget https://github.com/lhelontra/tensorflow-on-arm/rele…

QEMU启动ARM64 Linux内核

目录 前言前置知识virt开发板ARM处理器家族简介 安装qemu-system-aarch64安装交叉编译工具交叉编译ARM64 Linux内核交叉编译ARM64 Busybox使用busybox制作initramfs使用QEMU启动ARM64 Linux内核 前言 本文介绍采用 qemu 模拟ARM-64bit开发板(针对ARM-32bit的有另一…

centos for arm64

Arm64的centos版本自7.5.1804以后不再和7.4、7.3、7.2等之前的一样直接提供一个rootfs.tar.xz的压缩包,全部变成了ISO的安装文件,因此需要EFI来引导安装,如果Aarch64的cpu用的是uboot就只有干瞪眼了,笔者花了一翻功夫,…

ARM64逆向基础

为什么要学ARM64? android 5.0系统就开始引入Arm64-v8a,它用于支持全新的AArch64架构,这个架构也就是我们要学习的arm64汇编。目前android系统已经发展到anroid 11版本。因此现在主流的apk都是支持AArch64架构。那么我们利用IDA(…

第一章 QEMU虚拟机与ARM64平台搭建

系列文件目录 《ARM64体系结构结构编程与实践》学习与应用记录 第一章 QEMU虚拟机与ARM64平台搭建 文章目录 系列文件目录本章前言一、ubuntu虚拟机安装1.ubuntu20.04镜像下载2.镜像安装3.工具安装 二、代码下载1.git配置2.runninglinuxkernel代码下载3.代码编译 总结 本章前言…

搭建arm64的qemu环境

说明 qemu在调试内核方面还是比较方便、效率的。以前基本上多是用arm32的平台,网上大部分资源也是关于arm32的。现在arm64的也比较普遍了,最近刚好要看一些内核的东西,花了2天的时间搭建了这个环境,希望看到的朋友少走弯路&#…

x86_64(intel64、amd64)和ARM64的区别以及发展

文章目录 区别引用 区别 ARM64架构 ARM 公司研发的,用的是精简指令集(追求节能,低功耗)。通常用于手机、平板等CPU,目前笔记本电脑也会采用ARM64构架的CPU,比如mac m1就是arm64(查看命令:uname…

x86 x64 arm64的区别

x86 x64 arm64的区别 源地址:https://www.cnblogs.com/zhaoqingqing/p/13145115.html 我们常说的高通 865,麒麟990 不是 CPU 是 SoC(System On Chip),SoC 除了 CPU 外,还有 GPU,还有可选的浮…

Python线性方程求解-矩阵左除“\“、右除“/“

目录 1 线性方程组求解方法 2 左除“\”→AxB 3 右除"/"→xAB 4 其它说明 1 线性方程组求解方法 如果AxB,则xA\B,称为左除;如果xAB,则xB/A,称为右除。 式中x为未知数。一般情况下,左除用的系…

Matlab:用矩阵的除法替代逆运算的操作(inv)

在matlab中直接用逆运算常常会提示,建议用矩阵的左除或右除替换,因为inv(A)*b速度更慢且准确度更低。 matlab中部分详细信息:为了求解线性方程组,矩阵的逆主要是理论值。 切勿使用矩阵的逆 ,即 x inv(A)*b 来求解线性…

逆矩阵的概念、应用和求解

目录 逆矩阵的概念 求解逆矩阵 应用例子 可能没有逆矩阵 求解逆-方法1:初等行运算(高斯-若尔当) 求解逆-方法2:余子式、代数余子式和伴随 求解逆-方法3:程序库 逆矩阵的概念 矩阵运算中,…