首页 > 系统相关 >嵌入式系统的内存访问和总线通信机制解析、PCI/PCIe引入

嵌入式系统的内存访问和总线通信机制解析、PCI/PCIe引入

时间:2024-12-08 14:28:29浏览次数:6  
标签:控制器 eMMC Flash 嵌入式 PCIe PCI 内存 CPU

往期内容

Uart子系统专栏:

  1. 专栏地址:Uart子系统
  2. Linux内核早期打印机制与RS485通信技术
    – 末片,有专栏内容观看顺序

interrupt子系统专栏:

  1. 专栏地址:interrupt子系统
  2. Linux 链式与层级中断控制器讲解:原理与驱动开发
    – 末片,有专栏内容观看顺序

pinctrl和gpio子系统专栏:

  1. 专栏地址:pinctrl和gpio子系统

  2. 编写虚拟的GPIO控制器的驱动程序:和pinctrl的交互使用

    – 末片,有专栏内容观看顺序

input子系统专栏:

  1. 专栏地址:input子系统
  2. input角度:I2C触摸屏驱动分析和编写一个简单的I2C驱动程序
    – 末片,有专栏内容观看顺序

I2C子系统专栏:

  1. 专栏地址:IIC子系统
  2. 具体芯片的IIC控制器驱动程序分析:i2c-imx.c-CSDN博客
    – 末篇,有专栏内容观看顺序

总线和设备树专栏:

  1. 专栏地址:总线和设备树
  2. 设备树与 Linux 内核设备驱动模型的整合-CSDN博客
    – 末篇,有专栏内容观看顺序

img

目录

1.最容易访问的设备是什么?

是内存!

要读写内存,知道它的地址就可以:

volatile unsigned int *p = 某个地址;
unsigned int val;
*p = val;  /* 写 */
val = *p;  /* 读 */

只有内存能这样简单、方便地使用吗?

不是的,所有的"ram-like"接口设备都可以这样操作。

什么叫"ram-like"接口?

  • 要发出地址:有地址线
  • 要读写数据:有数据线
  • 怎么分辨是读还是写:有读写信号
  • 众多"ram-like"设备共享上面的信号,怎么才能互不影响?每个设备都有自己的片选信号

如下图所示:

img

  • CPU发出addr,到达内存控制器,也出现在RAM、Flash、GPIO等设备上

  • 使能设备:

    • 如果addr属于RAM的地址范围,cs0就被使能
    • 如果addr属于Flash的地址范围,cs1就被使能
    • 如果addr属于GPIO的地址范围,cs2就被使能
    • 没有被使能的设备,就相当于没接上去一样,不会影响其他设备
  • 读写数据、

关键在于:内存控制器,它会根据地址范围发出对应的片选信号,选中对应的设备。

内存控制器(Memory Controller)是负责管理系统中的内存(如 DRAM、SRAM)的硬件或逻辑组件。它在处理器与内存之间起到桥梁作用,主要负责处理器对内存的访问控制、调度和数据传输。现代的内存控制器通常集成在 CPU 中(即集成内存控制器,IMC),也可以作为独立的芯片存在。通过内存控制器,实现CPU访问某个设备时,放弃其它设备来干扰到了addr和data。

内存控制器的作用:

  1. 处理内存访问请求
    内存控制器接收来自 CPU 或其他硬件组件的内存读写请求,翻译这些请求为内存可识别的操作,并按照一定的顺序将其传递到内存芯片。
  2. 内存寻址
    内存控制器负责将 CPU 的逻辑地址转换为物理内存地址,并根据请求类型(读取或写入)执行相应的操作。它确保每个内存访问能够在正确的内存地址上执行。
  3. 管理内存时序
    不同类型的内存(如 DDR、LPDDR)具有不同的时序要求,内存控制器根据内存的特性管理操作的延时,确保时序要求得到满足以保持内存读写的稳定性。
  4. 数据缓冲和预取
    内存控制器会缓冲数据,以提高处理器与内存之间的数据传输效率。它还可能通过预取机制,提前将可能被 CPU 需要的数据从内存取出放入缓存,减少内存访问延迟。
  5. 内存访问优化
    内存控制器通过调度和优化内存访问请求,提高内存的带宽利用率。例如,它可以重排序内存请求,以减少等待时间(例如最早-最少行开销调度),避免多次刷新同一行数据。
  6. 支持多通道内存
    许多内存控制器支持多通道(如双通道、四通道等)内存架构,通过并行处理多个内存访问请求,增加带宽,提高整体系统性能。
  7. 刷新管理(DRAM)
    动态内存(如 DRAM)需要周期性刷新以保持数据的完整性。内存控制器负责在后台进行这些刷新操作,不干扰正常的读写操作。
  8. 纠错功能(ECC)
    一些内存控制器支持错误校正码(ECC)内存,它能够检测并纠正内存中的单比特错误,确保数据的可靠性,尤其在服务器和关键任务系统中非常重要。
  9. 内存访问权限和安全性
    内存控制器可以管理不同进程或设备对内存的访问权限,以确保不同内存区域之间的隔离,防止未经授权的访问。

2.地址空间的概念

2.1 概念

嵌入式系统中的地址空间:

  • CPU发出addr,可以用来方位EMMC控制器

  • 但是CPU发出的addr,不能直接到达EMMC Flash

  • 想访问EMMC Flash

    • 必须用过EMMC控制器
    • 编写EMMC控制器驱动程序
  • 如果CPU发出的addr,可以直接到达EMMC Flash,那就简单了

img

在嵌入式系统中,当CPU发出一个内存地址请求(例如给eMMC Flash),这个请求需要经过多个层次的硬件控制器进行处理,其中包括内存控制器、eMMC控制器等。以下是原因和流程的详细解释:

1. eMMC与内存的不同工作方式

eMMC(嵌入式多媒体卡)与常规的RAM(如DDR)相比,工作机制和协议不同。eMMC是一种基于NAND Flash技术的非易失性存储设备,而内存(RAM)是一种随机存取存储器,两者的读写机制、协议、时序要求都存在较大差异。为了桥接这些差异,eMMC需要一个专门的eMMC控制器来处理和管理它的操作。

2. 内存控制器与eMMC控制器的不同职责

  • 内存控制器:负责管理系统中的随机存取内存(如DRAM、SRAM),它直接与CPU和系统总线进行交互,并为CPU提供快速的读写操作支持。内存控制器的设计主要面向同步存储设备的高速数据访问需求。
  • eMMC控制器:eMMC设备使用标准的eMMC协议,它是一种专用的协议,包含复杂的读写命令集、数据块管理、以及数据的写保护等功能。eMMC控制器的主要职责是处理这些协议细节,并通过标准化接口(如SD/MMC协议)与eMMC Flash芯片交互。

3. eMMC控制器的主要作用

  • 协议转换:CPU通过内存控制器发出的地址和数据是基于系统总线的协议,而eMMC Flash本身使用的是eMMC协议。eMMC控制器负责将系统总线上的读写命令和数据,转换为eMMC设备能够理解的命令格式(如CMD/RESP命令结构)。eMMC控制器需要根据eMMC协议发送特定的指令来控制eMMC Flash的读写操作。
  • 数据管理:eMMC Flash采用块设备的形式进行管理,其数据读写通常需要按照块或页的单位进行操作,而不是直接按字节寻址。eMMC控制器负责管理这些数据的打包、拆分以及对应块的寻址工作。
  • 时序控制:eMMC控制器负责管理eMMC Flash的时序。与RAM不同,eMMC Flash的写入和擦除操作涉及物理层的NAND Flash技术,因此时序要求复杂得多。eMMC控制器确保这些操作的顺序和时序符合Flash设备的工作要求。
  • 错误检测与管理:eMMC Flash中的数据可能会发生错误(如位翻转等),eMMC控制器通常包含错误检测和纠错功能,以保证数据的完整性。控制器还可以实现坏块管理(bad block management)和磨损均衡(wear leveling)等操作,以延长Flash的使用寿命。
  • DMA传输:为了提高传输效率,eMMC控制器可以通过直接内存访问(DMA)与系统内存交互,避免CPU处理每一个数据块。通过DMA,数据可以直接从eMMC控制器传送到内存,减少CPU的负担。

4. 流程解析

当CPU发出访问eMMC Flash的请求(例如读写数据),整个流程大致如下:

  1. CPU发出请求:CPU发出一个存储操作(地址和数据),并通过内存控制器发送到系统总线。
  2. 内存控制器处理:内存控制器根据系统的内存映射,确定这是对外部设备(如eMMC Flash)的请求,并将其转交给eMMC控制器。
  3. eMMC控制器接收请求:eMMC控制器解析来自系统总线的请求,并转换为eMMC协议命令。
  4. eMMC控制器与eMMC Flash交互:eMMC控制器通过eMMC总线发送合适的命令给eMMC Flash芯片,并进行数据传输(读或写)。
  5. 返回结果:eMMC控制器将数据或状态反馈回内存控制器,再通过总线返回给CPU。

内存控制器和eMMC控制器的存在是为了处理不同类型存储器的访问需求。内存控制器管理RAM等高速存储器,而eMMC控制器专门处理eMMC Flash这种基于NAND技术的非易失性存储设备。eMMC控制器承担协议转换、时序控制、数据打包、错误管理等任务,确保CPU能够通过标准的总线协议与eMMC设备进行交互。

2.2 例子

以人类为例:

  • 爷爷生了4个小孩,排行1234
  • 老大又生了4个小孩,排行1234
  • 这2个"1234"辈分不一样,空间不一样

img

在嵌入式系统中,eMMC控制器与eMMC Flash之间的地址空间、访问方式和协议是不一样的。为了让CPU能够成功地与eMMC Flash交互,必须通过eMMC控制器来进行“桥接”,就像家族中的不同辈分和不同位置,虽然都属于同一个家族,但辈分和位置决定了他们的不同角色和互动方式。

用上面的例子来类比:

  • CPU的地址空间可以理解为爷爷生的4个小孩的地址空间(在系统总线中分配的地址范围),这些地址是统一的系统内存或I/O地址,CPU直接管理它们。
  • eMMC控制器的地址空间则像是老大生的4个小孩的地址空间。虽然这些小孩也是家族的一部分,但他们属于不同的辈分,和爷爷生的小孩不同。
  • eMMC Flash可以理解为这些“更年轻”的小孩中的一个。eMMC控制器知道如何和他们沟通,因为他们使用了一套不同的“语言”或“协议”。

为什么需要经过eMMC控制器?

  1. 协议不同:CPU使用的是通用的内存访问协议,而eMMC Flash使用的是专用的eMMC协议。eMMC控制器需要负责将这两者之间的协议进行转换,就像不同辈分的家族成员之间有不同的沟通方式。
  2. 时序和操作复杂性:eMMC Flash不像内存那样可以随时读写,它的操作更加复杂,包含块擦除、页读写、坏块管理等。eMMC控制器负责管理这些复杂的操作,以确保CPU可以方便地读写数据。
  3. 地址空间不同:eMMC控制器和eMMC Flash的地址空间是独立于CPU的系统总线地址空间的。eMMC控制器会将系统总线上的地址映射到eMMC Flash设备的物理地址范围,从而使CPU能够通过eMMC控制器正确访问eMMC Flash上的数据。

不同的控制器和存储设备有各自的“地址空间”和“访问协议”。CPU要通过内存控制器和eMMC控制器,才能成功访问eMMC Flash。这是因为不同存储设备和外设在系统中的层次和访问规则是不一样的,就像不同辈分的家族成员,他们的角色和职责不同,需要通过合适的渠道进行沟通。

3.理解PCI和PCIe的关键

3.1 地址空间

img

把上文第2大点所谈到的emmc控制器换成PIC/PICe就行了

将eMMC控制器换成PCI/PCIe控制器,基本道理也是相似的。无论是eMMC、PCI、PCIe,还是其他设备,CPU与这些外设之间的通信都需要经过一个专用的控制器来进行数据的传递和协议转换,原因也大致相同。

类似的核心概念:

  1. 协议不同
    不同设备(例如eMMC、PCI/PCIe设备)使用不同的通信协议和信号传输方式。CPU和PCI/PCIe设备之间不能直接进行通信,PCI/PCIe控制器负责处理通信协议的转换。就像eMMC控制器负责将CPU发出的命令转换成eMMC Flash能够理解的协议,PCI/PCIe控制器负责协调CPU与PCI/PCIe设备之间的数据传输。
  2. 地址空间不同
    CPU的地址空间是基于系统总线的,而PCI/PCIe设备有它们自己的地址空间。PCI/PCIe控制器负责将系统总线上的地址映射到PCI/PCIe设备的物理地址上,让CPU能够通过这个映射访问设备的资源和寄存器。类似的情况也出现在eMMC控制器中,控制器负责将系统地址映射到eMMC Flash的存储空间。
  3. 访问管理与优化
    PCI/PCIe控制器不仅负责协议转换,还负责传输管理、资源分配、时序优化等复杂的任务。这与eMMC控制器需要管理读写、坏块管理等类似。

上面的例子例子:

就像之前的家族辈分类比,CPU相当于长辈(爷爷)PCI/PCIe控制器就像家中的某个成员(比如老大),而PCI/PCIe设备就是老大的小孩。为了让长辈和这些小孩沟通,老大(PCI/PCIe控制器)需要负责桥接他们的沟通方式,处理不同辈分之间的关系(地址空间和协议)。

额外的功能差异:

虽然原理相似,但具体功能和作用可能会有所不同,比如:

  • PCI/PCIe支持多设备通信,可以通过总线桥接多个外设,而eMMC主要是面向存储设备。
  • PCIe的速度和拓展性更高,支持高速串行数据传输,而eMMC是专用存储接口。

3.2 PIC接口速览

考文件:01_pci接口引脚电路示例.pdf

资料可以点击此处下载

img

在PCI控制器到PCI设备之间,addr线和data是复用的,也就是上图的AD0-AD31,传输的是数据还是地址由FRAMEL决定。

PCI是采用并行接口来传输的,它的传输速率比较高,但是达到一定速率后,相互之间会有很大的干扰。

3.3 PCIe接口速览

参考文件:01_pcie接口引脚电路示例_AX99100.pdf

资料可以点击此处下载

img

这个图片是一个典型的 PCIe X1 接口的引脚定义和电路图。

电源部分:

  • +3.3V 和 +12V 电源引脚

    • A2, A3, B1, B2, B3:这些引脚为 PCIe 设备提供 +12V 电源。
    • A8, A9, B8, B10:这些引脚提供 +3.3V 电源。
    • B11 提供 3.3Vaux,用于维持设备的辅助电源。
    • 电源引脚用于为 PCIe 设备供电,它们是输入端口,PCIe 设备从这些引脚获取所需的电源。

信号部分:

  • PCIe REFCLK(参考时钟)

    • A12(REFCLKN#),A13(REFCLKP#):这两个引脚提供 PCIe 的参考时钟信号。PCIe 设备会使用这些时钟信号进行数据传输的同步。
    • 这两个引脚是输入引脚,提供给 PCIe 设备的时钟信号。
  • PCIe 数据传输信号

    • TX

      • A15(PCIe_TXP)、A16(PCIe_TXN):这是 PCIe 的传输信号对,分别是正负差分对。用于从设备发送数据到主机(上传)。
    • RX

      • B14(PCIe_RXP)、B15(PCIe_RXN):这是 PCIe 的接收信号对,分别是正负差分对。用于从主机接收数据到设备(下载)。
    • TX 和 RX 引脚分别用于 PCIe 设备的数据发送和接收,属于输入输出信号。

控制信号部分:

  • PCIe RST#(复位信号)

    • A11:这是 PCIe 设备的复位信号,用于复位设备。通常在系统启动时,这个信号会被拉低,复位 PCIe 设备。
    • 这是输入信号,主机向设备发送复位命令。
  • PCIe WAKE#(唤醒信号)

    • B11:这个信号用于从低功耗模式唤醒设备,当设备需要唤醒时,它可以通过拉低此信号通知主机。
    • 这是输出信号,设备通知主机它需要唤醒。
  • PRSNT#(存在信号)

    • A1 和 B17:表示设备是否已插入插槽。通常 PRSNT 信号用于检测设备是否正确插入。
    • 这是输出信号,用于告知主机设备是否存在。

接地部分:

  • 多个接地引脚分布在 A7, A10, A14, A17, A18, B4, B6, B13, B16, B18。这些是用于提供电气接地的引脚。

和PCIe控制器连接的部分:

  • 输入信号:PCIe_REFCLKP/N(时钟同步)、PCIe_RST#(复位控制),
  • 输出信号:PCIe_WAKE#(唤醒信号)、PRSNT#(复位控制)
  • 双向信号:PCIe_TXP/N(输出)、PCIe_RXP/N(输入)

PCIe则是使用串行接口来进行传输,差分信号。

img

标签:控制器,eMMC,Flash,嵌入式,PCIe,PCI,内存,CPU
From: https://blog.csdn.net/caiji0169/article/details/144279104

相关文章

  • 深入解析非桥PCI设备的访问和配置方法
    往期内容本文章相关专栏往期内容,PCI/PCIe子系统专栏:嵌入式系统的内存访问和总线通信机制解析、PCI/PCIe引入Uart子系统专栏:专栏地址:Uart子系统Linux内核早期打印机制与RS485通信技术–末片,有专栏内容观看顺序interrupt子系统专栏:专栏地址:interrupt子系统Linux链......
  • PCI总线基本概念
    PCI是PeripheralComponentInterconnect(外设部件互连标准)的缩写,它曾经是个人电脑中使用最为广泛的接口,几乎所有的主板产品上都带有这种插槽。目前该总线已经逐渐被PCIExpress总线所取代。PCI即PeripheralComponentInterconnect,中文意思是“外围器件互联”,是由PCISIG(PCIS......
  • PCIe扫盲——PCIe简介
    PCI-Express是继ISA和PCI总线之后的第三代I/O总线,即3GIO。由Intel在2001年的IDF上提出,由PCI-SIG(PCI特殊兴趣组织)认证发布后才改名为“PCI-Express”。它的主要优势就是数据传输速率高,另外还有抗干扰能力强,传输距离远,功耗低等优点。注:第一代总线一般指ISA、EISA、VESA和MicroPla......
  • 2.PCIe协议分析
    从今天开始,我们讲解PCIE协议分析章节的内容,本章分为4节内容,具体如下。第1节:预备知识点我们知道要想深入了解FPGAPCIe逻辑、理解PIO例子工程、应用XAPP1052demo、应用XDMA例子工程,需要熟练知道PCIe的一些最基本的概念,比如PCIe配置空间、PCIeBar空间、PCIe地址映射、PCIe传输层......
  • 新手必看!小小白也能用Rust点亮LED,入门嵌入式开发(上)
    讲动人的故事,写懂人的代码"你作为编程新手,为什么要学Rust?"我在微信里问小小白。我是一名有着30多年IT从业经验的老程序员,正在创作一本Rust编程入门书,致力于降低Rust那传说中陡峭的学习曲线。小小白是我最近在社交网络上认识的朋友,他对学习Rust充满热情。作为一名......
  • 嵌入式linux系统中实现I2C通信的方法
    第一章 I2C编程  I2C(Inter-IntegratedCircuitBUS)是I2CBUS简称,中文为集成电路总线,是目前应用最广泛的总线之一。和IMX6ULL有些相关的是,刚好该总线是NXP前身的PHILIPS设计。1.1I2C协议1.1.1概述I2C是一种串行通信总线,使用多主从架构,最初设计目的为了让主板、嵌入式系统......
  • CPU_和C++_计算机组成原理-嵌入式系统-C++
    CPUCPU(CentralProcessingUnit,中央处理器)CPU缓存流水线Pipelining超线程Hyper-ThreadingCPU调度(CPUScheduling)和上下文切换(ContextSwitching)让控制器从存储器中读取二进制并解释然后让运算器去计算数值CPU核心组件:算术逻辑单元(ALU):执行算术和逻辑操作。寄存......
  • PCIe发展及基础知识
    1.什么是PCIePCIExpress是新一代的总线接口。早在2001年的春季,英特尔公司就提出了要用新一代的技术取代PCI总线和多种芯片的内部连接,并称之为第三代I/O总线技术。随后在2001年底,包括Intel、AMD、DELL、IBM在内的20多家业界主导公司开始起草新技术的规范,并在2002年完成,对其正式命......
  • 【嵌入式】-VMware-Ubuntu-Linux- 基础指令 | 使用工具安装 | 常见问题
    ### 本篇博客主要记录我在学习过程中用到的比较好的工具以及遇到的一些问题及解决办法。###   目录一、常用Shell命令及快捷键##shell命令##文件操作快捷键二、VIM编辑器三、OpenVMTools安装(1)更新软件包列表(2)安装open-vm-tools-desktop(3)安装必要的依赖项......
  • 痞子衡嵌入式:简析i.MXRT1170 XECC开启及Data Swap功能对于外部RAM的访问性能影响
    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是i.MXRT1170XECC开启及DataSwap功能对于外部RAM的访问性能影响。文接上篇《i.MXRT1170XECC功能特点及其保护串行NORFlash和SDRAM之道》,这篇文章里痞子衡给大家介绍了XECC原理及在其使能下操作NORF......