【STM32】MPU内存保护单元

  • 注:仅在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);
  • 作者:菲子叭叭

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【STM32】MPU内存保护单元

    发表回复