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