基础——MCU和MPU,CACHE和MMU

本文详细对比了微控制器单元(MCU)与微处理器单元(MPU)的功能特性,强调了单片机属于MCU,而ARM系列如ARM9, ARM11, A8, A9则属于MPU。此外,深入讲解了CACHE(高速缓存)与MMU(内存管理单元)的工作原理及作用,解释了它们如何提升系统性能。

                                         MCU和MPU

1. 是什么 


       CPU(Central Processing Unit,中央处理器)发展出来三个分枝,一个是DSP(Digital Signal Processing/Processor,数字信号处理),另外两个是MCU(Micro Control Unit,微控制器单元)和MPU(Micro Processor Unit,微处理器单元)。

*********************单片机属于微控制器,也就是MCU********************************

*******************像ARM9,ARM11,A8,A9就是MPU*******************************

2. 异同

嵌入式MCU单片机集成了嵌入式系统工作所需的逻辑计算内核cpu,存储数据/代码的RAM,EEPROM和Flash,内部互联总线—Crossbar、AMBA(APB、AHB以及AXI bus),定时器资源、中断控制器(INTC,通用GPIO,ADC、DAC和ACMP,段码LCD控制器、TFT LCD控制器,通信接口/控制器—IIC、SPI、USART、CAN等;

当然,MPU中也会集成很多嵌入式系统工作所需的大部分片上外设,但因为其计算单元CPU内核运行速度非常快,所以其一般不会再片内集成系统工作所需的RAM和Flash存储器,而是集成SDR/DDR2/3/4等外部SRAM扩展接口和NAND/NOR Flash扩展接口,用户设计基于MPU的硬件系统时还需选择合适的SRAM和外部Flash才可以保证系统正常工作。

相比较于MCU来说MPU多了两个部件, CACHEMMU。

                                           CACHE和MMU

1. 是什么

CACHE:高速缓存,是硬件。

MMU:memory management unit,称为内存管理单元,是硬件。

物理地址:(英语:physical address),也叫实地址(real address)、二进制地址(binary address),它是在地址总线上,以电子形式存在的,使得数据总线可以访问主存的某个特定存储单元的内存地址。

虚拟地址:虚拟地址是相对于物理地址来说的。虚拟地址的提出,主要是为了解决在操作系统中,多线程内存地址重复,大进程在小内存运行等问题 , 在32位系统中,虚拟地址空间中有4G,在操作系统中程序中使用的都是虚拟地址
 

2. 特点,功能

2.1 Cache

Cache存储器:电脑中为高速缓冲存储器,是位于CPU和主存储器DRAM(Dynamic Random Access Memory)之间,规模较小,但速度很高的存储器,通常由SRAM(Static Random Access Memory静态存储器)组成。

就是因为处理器速度相对于内存速度,差距太大,所以就引入了CACHE。

而cache经常与写缓冲器(write buffer)一起使用,使用writer buffer的目的是,将处理器和cache从较慢的对主存的写操作中脱离出来。

 当CPU 要访问 cache 时, CPU 送来主存地址,放到主存地址寄存器中。然后通过地址变换部件把主存地址中的块号 B 变成 cache 的块号b,并放到 cache 地址寄存器当中。同时将主存地址中的块内地址 W 直接作为 cache 的块内地址 w装入到 cache 地址寄存器中。如果地址变换成功(通常称为 cache 命中),就用得到的 cache 地址去访问 cache,从 cache 中取出数据送到 CPU 中。如果地址变换不成功,则产生 cache 失效信息,并且接着使用主存地址直接去访问主存储器 。
工作原理:
              1.程序要读取内存中地址A数据,然后程序首先以地址A查找Cache,一开始Cache无数据,导致“cache  miss”。

              2.程序以地址A查找内存,读取数据后,把数据填入cache,称为”cache  fill“。

              3.程序再次读取内存中A地址数据,这次直接以地址A查找cache,读取数据后直接返回给CPU,不用再去操作内存。

              4.重复步骤1,周而复始,直到把cache填满(cache容量一般很小)。此时CPU再访问,就要发生cache替换,即把一些数据替换出去,填充新数据。
 

2.2 MMC

单片机里没有‘虚拟地址’这个概念,而是‘物理地址’,而在ARM领域,Linux编程的时候,就会涉及到‘虚拟地址’,经过MMU以后才是物理地址。

简单说MMC的作用有两点,地址翻译和内存保护。

具体参考:大神的博文

文档介绍:MMC原理

 

 

 

 

 

 

 

 

 

 

 

 

<think>嗯,用户这次聚焦在MCUcache device属性上,看来ta对内存管理的底层机制很感兴趣。之前讨论过内存类型运行时管理,这次需要深入缓存机制内存属性配置。 用户引用的资料[1]提到Armv8架构的Normal/Device内存分类,这正好是切入点。特别要注意ta强调的“gathering/re-ordering/early write”这些子属性,说明需要解释缓存策略对设备访问的影响。引用[3]的DMA示例也很关键,得结合缓存一致性说明。 用户身份应该是嵌入式开发工程师,问题直指缓存配置这种底层细节。ta可能正在调试外设通信问题,或是优化DMA性能。需要强调实操场景,比如“为什么DMA传输前要设置Uncacheable”这种具体痛点。 先从理论分层展开:第一层解释DeviceNormal内存的本质区别,第二层拆解G/R/E三个子属性的技术含义,第三层用MPU配置实例说明如何落地。特别要注意哈佛架构的影响(用户上次问过),比如Flash作为XIP设备时缓存的特殊性。 缓存策略对性能的影响必须量化说明:用DMA传输延迟对比,或中断响应时间差异。安全方面补充MPU如何隔离关键外设区域,这部分用户之前关注过栈溢出防护。 最后扩展方向要实用:提供cache命中率测试方法(perf工具)、混合内存场景的配置策略。用户显然需要能直接用于调试的解决方案,比如cache一致性问题的诊断步骤。</think>在MCU中,**Cache Device属性**是内存管理单元(MMU/MPU)对内存区域的关键分类,直接影响缓存策略与访问行为。以下从核心特性、配置机制及实践场景展开详解: --- ### 一、Cache属性的本质分类 根据Armv8架构规范,内存区域分为两类: 1. **Normal Memory** - **特性**:支持缓存、预取、乱序执行 - **适用场景**:SRAM、Flash等通用存储 - **缓存策略**: - *Write-Back (WB)*:写操作先更新缓存,延迟写回内存 - *Write-Through (WT)*:写操作同步更新缓存内存 2. **Device Memory** - **特性**:**禁用缓存**(避免数据不一致),访问严格有序 - **子属性**(引用[1]): | **属性** | 含义 | 影响 | |-------------------------|-------------------------------|--------------------------| | **Gathering (G/nG)** | 是否允许合并多次访问 | `nG`=禁止合并(如外设寄存器) | | **Re-ordering (R/nR)** | 是否允许指令重排序 | `nR`=严格顺序访问 | | **Early Write (E/nE)** | 是否允许写应答提前完成 | `nE`=需等待操作完成 | - **适用场景**:外设寄存器、DMA缓冲区(需显式维护一致性)[^3] --- ### 二、配置机制与实例 #### 1. **MPU/MMU配置(以Cortex-R52为例)** ```c // 设置外设寄存器区域为Device-nGnRnE(最严格属性) MPU->RBAR = 0x40000000; // 外设基地址 MPU->RASR = (0x01 << 28) | // 1MB区域 (0x03 << 24) | // TEX=0b000, S=0, C=0, B=0 (Device) (0x00 << 19) | // nG/nR/nE=0b000 → nGnRnE (0x03 << 16); // 全特权读写权限 ``` > **关键参数**: > - `TEX/S/C/B`位域:定义内存类型(`0b000`=Device) > - `nGnRnE`:禁止合并(G)、禁止重排序(R)、需完成写操作(E) #### 2. **Cache一致性操作(DMA场景)** ```c void dma_safe_transfer(void* src, void* dest, size_t size) { // 1. 设置目标区为Uncacheable(Device属性) set_memory_attributes(dest, UC_ATTRIBUTE); // 引用[3] // 2. 内存屏障确保顺序性 __DSB(); // 数据同步屏障 // 3. 启动DMA传输 DMA_Start(dest, src, size); // 4. 传输完成后恢复缓存策略 while(!DMA_Complete()); set_memory_attributes(dest, WB_ATTRIBUTE); } ``` --- ### 三、关键差异与影响 | **特性** | Normal Memory | Device Memory | |--------------------|---------------------|-----------------------| | **缓存支持** | ✅ | ❌(显式禁用) | | **访问合并** | 允许 | 禁止(nG属性) | | **执行顺序** | 可乱序 | 严格顺序(nR属性) | | **写应答时机** | 可提前响应 | 需完成操作(nE属性) | | **典型用例** | 代码/数据存储 | 外设寄存器、DMA缓冲区| > ⚠️ **错误配置的后果**: > - 若对Device区域启用缓存 → **数据不一致**(如DMA修改后CPU读取旧缓存值) > - 未设置`nR`属性 → **寄存器访问顺序错误**(如先读状态后写命令) > - 缺少内存屏障 → **硬件行为不可预测** --- ### 四、调试与优化策略 1. **Cache命中率分析** - 使用`perf`工具监控缓存效率(引用[3]) - 调整内存布局提升局部性(如热数据对齐缓存行) 2. **混合内存管理** ```c // 定义关键外设的强有序访问宏 #define REG_ACCESS(addr) (*(volatile uint32_t*)(addr)) REG_ACCESS(0x40021000) = 0x01; // 绕过缓存直接写 ``` 3. **哈佛架构的特殊性** - Flash通常配置为**Normal WB-WA**(加速代码执行) - 但XIP(就地执行)时需注意**指令预取与缓存一致性** --- ### 五、典型问题解析 #### Q1: 为何DMA操作需显式设置Uncacheable? **答**:DMA直接访问物理内存,若目标区域被缓存: - CPU写入数据可能滞留缓存 → DMA传输旧数据 - DMA修改数据后CPU读取缓存 → 获得旧值 通过`UC_ATTRIBUTE`确保数据直通物理内存[^3]。 #### Q2: 如何验证Device属性配置? **方法**: 1. 读取MPU寄存器检查区域属性 2. 测量访问延迟(Device内存通常无加速) 3. 使用逻辑分析仪捕捉总线时序(检查是否合并访问) ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值