- 注:仅在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会等待当前加载存储执行完毕后才执行下一条指令,所以导致性能下降
- Normal memory(性能最强)
- 三种内存类型
- 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);
- 结构体 MPU_Region_InitTypeDef