注:仅在F7和M7系列上使用
介绍
功能:
设置不同存储区域的存储器访问权限(管理员、用户)
设置存储器(内存和外设)属性(可缓冲、可缓存、可共享)
优点:提高嵌入式系统的健壮性,使系统更加安全
阻止用户破坏操作系统的数据
阻止一个任务访问其他任务的数据区,从而隔离任务
把关键数据区域设置为只读,从根本上解决被破坏的可能
检测意外的存储访问,如堆栈溢出、数组越界
将SRAM或者RAM空间定义为不可执行,防止代码注释
内核地址映射
MPU可配置保护8(针对F7)/16(针对H7)个内存区域,每个区域最小要求256字节,且每个区域还可配置为8个子区域

MPU设置内存区域的访问权限
MPU_REGION_NO_ACCESS———无访问(管理员+用户级都不能访问)
MPU_REGION_PRIV_RW ———仅支持特权级读写访问
MPU_REGION_PRIV_RW_URO—–禁止用户写访问(管理员可读写访问)
MPU_REGION_FULL_ACCESS——全访问(管理员、用户都可以访问)
MPU_REGION_PRIV_RO ——–仅支持管理员访问
MPU_REGION_PRIV_RO_URO——只读(管理员&用户都不可以写)
MPU配置内存区域的访问属性
三种内存类型
Normal memory(性能最强)
-> “ROM” “FLASH” “SRAM”
CPU以最高效的方式加载和存储字节,半字和字,CPU对于这种内存区的加载或存储不一定要按照程序代码的顺序执行
Device memory(性能中)
->外设
加载和存储要严格按照次序进行,确保寄存器按照正确顺序执行
Strongly ordered memory(性能最差)
程序完全按照代码顺序执行,CPU会等待当前加载存储执行完毕后才执行下一条指令,所以导致性能下降
Cache
F4、M4当中有MPU却不用是因为:没有Cache
分类
数据缓存D-Cache
指令缓存I-Cache
4种基本操作
使能
禁止清空
清空
无效化
读写操作

写操作
CPU要写的SRAM区域数据在Cache中已经开辟了对应的区域———-“写命中”(Cache Hit)
若Cache里面没有开辟对应的区域———-(Cache Miss)
写操作
CPU要读取的SRAM区域数据在Cache中已经加载好———-“读命中”(Cache Hit)
若Cache里面没有———-(Cache Miss)
Core读Cache
Cache hit :直接从cache当中读出数据即可
Cache miss:两个处理方式
read through 直接从内存中读出,不用cache
read allocate 把数据从内存加载到cache,再从cache传给core
Core写Cache

Cache hit
write through 直接写到内存中并同时放在cache里面 内存和cache同步更新
write back 数据更新时只写入cache,只在数据被替换出cache时,被修改的cache数据才会写入内存
Cache miss
write allocate 先要把写的数据载入到cache,对cache写后,更新到内存里面
no write allocate 直接写入内存,不用cache
数据不一致的解决问题
设置共享属性
Cache相当于没有开启
软件进行cache维护
clean 清空:cache已经变化,SRAM数据未更新,DMA搬运数据前,将cache相对应数据更新到SRAMSCB_CleanDCache/SCB_CleanInvalidateDCache
invalidate无效化:SRAM数据已变化,Cache未更新DMA后
TEX用来设置Cache策略
只要开启Cache,read allocate 是开启

Non-cacheable 正常读写操作,无cache
Write throught 写操作命中 no write allocate 不命中 read allocated 读操作没有命中
Write back 写操作命中 no write allocate 不命中 read allocated 读操作没有命中
write back 写操作命中 write allocate 不命中 read allocated 读操作没有命中
HAL库驱动
结构体 MPU_Region_InitTypeDef

参数

MPU基本配置步骤(可查芯片手册)
禁止MPU void HAL_MPU_Disable();
配置某个区域的MPU保护参数 通过调用HAL_ConfigRegion()函数去设置
使能MPU void HAL_MPU_ Enable();
编写MemManage中断服务函数 void MemManage_Handler(void);
作者:菲子叭叭