一、Cache

1、介绍

Cache又分数据缓存D-Cache和指令缓冲I-Cache,STM32H7的数据缓存和指令缓存大小都是16KB。STM32H7主频是400MHz,除了TCM和Cache以400MHz工作,其它AXI SRAM,SRAM1,SRAM2等都是以200MHz工作。数据缓存D-Cache就是解决CPU加速访问SRAM。

如果每次CPU要读写SRAM区的数据,都能够在Cache里面进行,自然是最好的,实现了200MHz到400MHz的飞跃,实际是做不到的,因为数据Cache只有16KB大小,总有用完的时候。

2、操作,分为读操作和写操作

读操作: 如果CPU要读取的SRAM区数据在Cache中已经加载好,这就叫读命中(Cache hit),如果Cache里面没有怎么办,这就是所谓的读Cache Miss。

写操作: 如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域(专业词汇叫Cache Line,以32字节为单位),这就叫写命中(Cache hit),如果Cache里面没有开辟对应的区域怎么办,这就是所谓的写Cache Miss。

3、H7支持的Cache策略,共4种

4、风险

从上面的图就看出来使用Cache的风险,因为DMA是直接与SRAM交换数据的,而CPU与SRAM之间隔了一个Cache,如果DMA更新了某个数据到SRAM,CPU要去访问,而恰好Cache中有,那么CPU就不会去SRAM中拿,就会拿到Cache中已经过时的数据。因此使用了DMA的内存区要配置为无Cache或者拿数据前清一次Cache。

5、相关函数

SCB_EnableICache(void) :用于使能指令Cache,系统上电后优先初始化即可。

SCB_DisableICache(void) :用于禁止指令Cache。

SCB_InvalidateICache(void) :用于将指令Cache无效化,无效化的意思是将Cache Line标记为无效,等同于删除操作。这样Cache空间就都腾出来了,可以加载新的指令。

SCB_EnableDCache(void) :用于使能数据Cache,系统上电后优先初始化即可。

SCB_DisableDCache(void) :用于禁止数据Cache。

SCB_InvalidateDCache(void) :用于将数据Cache无效化,无效化的意思是将Cache Line标记为无效,等同于删除操作。这样Cache空间就都腾出来了,可以加载新的数据。

SCB_CleanDCache(void):用于将数据Cache清除,清除的意思是将Cache Line中标记为dirty的数据写入到相应的存储区。

SCB_CleanInvalidateDCache(void) :此函数是前面两个函数SCB_InvalidateDCache和SCB_CleanDCache的二合一。将Cache Line中标记为dirty的数据写入到相应的存储区后,再将Cache Line标记为无效,表示删除。这样Cache空间就都腾出来了,可以加载新的数据。

SCB_InvalidateDCache_by_Addr(uint32_t *addr,int32_t dsize):可以指定地址和存储区大小,地址要32字节对齐,大小要是32字节的整数倍。用于将数据Cache无效化,无效化的意思是将Cache Line标记为无效,等同于删除操作。这样Cache空间就都腾出来了,可以加载新的数据。

SCB_CleanDCache_by_Addr(uint32_t *addr,int32_t dsize):可以指定地址和存储区大小,地址要32字节对齐,大小要是32字节的整数倍。用于将数据Cache清除,清除的意思是将Cache Line中标记为dirty的数据写入到相应的存储区。

SCB_CleanInvalidateDCache_by_Addr(uint32_t *addr,int32_t dsize):可以指定地址和存储区大小,地址要32字节对齐,大小要是32字节的整数倍。将Cache Line中标记为dirty的数据写入到相应的存储区后,再将Cache Line标记为无效,表示删除。这样Cache空间就都腾出来了,可以加载新的数据。

二、MPU

1、作用

防止不受信任的应用程序访问受保护的内存区域; 防止用户应用程序破坏操作系统使用的数据;通过阻止任务访问其它任务的数据区;允许将内存区域定义为只读,以便保护重要数据;检测意外的内存访问。 简单的说就是内存保护、外设保护和代码访问保护。

2、MPU可以配置的三种内存类型

1)、Normal memory

CPU以最高效的方式加载和存储字节、半字和字,对于这种内存区,CPU的加载或存储不一定要按照程序列出的顺序执行。

2)、Device memory

对于这种类型的内存区,加载和存储要严格按照次序进行,这样是为了确保寄存器按照正确顺序设置。

3)、Strongly ordered memory

程序完全按照代码顺序执行,CPU需要等待当前的加载/存储指令执行完毕后才执行下一条指令。这样会导致性能下降。

3、MPU的使用

MPU可以配置保护16个内存区域(这16个内存域是独立配置的),每个区域最小要求256字节,每个区域还可以配置为8个子区域。由于子区域一般都相同大小,这样每个子区域的大小就是32字节,正好跟Cache的Cache Line大小一样。

使用时把一段连续的内存区配置为一个MPU保护区域,然后再配置这个MPU保护区域的特性。比如128KB的DTCM、64KB的SRAM4、32MB的SDRAM。MPU保护区域的特性使用MPU_RASR寄存器来配置,描述如下:

1)、XN:用于控制这个MPU保护区域能否执行程序代码。

2)、AP:用于控制这个MPU保护区域的特权级和非特权级的读写访问权限。

3)、TEX、C、B、S:H7支持4种Cache策略,这几位就是用来控制这个MPU保护区域使用哪一种。

S位用于解决多总线或者多核访问的共享问题,一般不要开启。

4)、SRD:这个位用于控制内存区的子区域 ,使用的是bit[15:8],共计8个bit,一个bit控制一个子区域, 0表示使能此子区域, 1表示禁止。一般情况下,取值0x00,表示8个子区域都使能。

5)、SIZE:配置这个MPU保护区域的大小。

三、HAL配置例程

//设置某个区域的MPU保护

//baseaddr:MPU保护区域的基址(首地址)

//size:MPU保护区域的大小(必须是32的倍数,单位为字节),可设置的值参考:CORTEX_MPU_Region_Size

//rnum:MPU保护区编号,范围:0~7,最大支持8个保护区域,可设置的值参考:CORTEX_MPU_Region_Number

//ap:访问权限,访问关系如下:可设置的值参考:CORTEX_MPU_Region_Permission_Attributes

//0,无访问(特权&用户都不可访问)

//1,仅支持特权读写访问

//2,禁止用户写访问(特权可读写访问)

//3,全访问(特权&用户都可访问)

//4,无法预测(禁止设置为4!!!)

//5,仅支持特权读访问

//6,只读(特权&用户都不可以写)

//详见:STM32F7 Series Cortex-M7 processor programming manual.pdf,4.6节,Table 89.

//sen:是否允许共用;0,不允许;1,允许

//cen:是否允许catch;0,不允许;1,允许

//返回值;0,成功.

//    其他,错误.

u8 MPU_Set_Protection(u32 baseaddr,u32 size,u32 rnum,u32 ap,u8 sen,u8 cen,u8 ben,u8 Tex)

{

MPU_Region_InitTypeDef MPU_Initure;

HAL_MPU_Disable();        //配置MPU之前先关闭MPU,配置完成以后在使能MPU

MPU_Initure.Enable=MPU_REGION_ENABLE;        //使能该保护区域

MPU_Initure.Number=rnum;                    //设置保护区域

MPU_Initure.BaseAddress=baseaddr;                    //设置基址

MPU_Initure.Size=size;                    //设置保护区域大小

MPU_Initure.SubRegionDisable=0X00;                      //禁止子区域

MPU_Initure.TypeExtField=Tex;                           //设置类型扩展域

MPU_Initure.AccessPermission=(u8)ap;            //设置访问权限,

MPU_Initure.DisableExec=MPU_INSTRUCTION_ACCESS_ENABLE;//允许指令访问(允许读取指令)

MPU_Initure.IsShareable=sen;                            //是否允许共用

MPU_Initure.IsCacheable=cen;                            //是否允许cache

MPU_Initure.IsBufferable=ben;                           //是否允许缓冲

HAL_MPU_ConfigRegion(&MPU_Initure);                     //配置MPU

HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);        //开启MPU

return 0;

}

//设置需要保护的存储块

//必须对部分存储区域进行MPU保护,否则可能导致程序运行异常

//比如MCU屏不显示,摄像头采集数据出错等等问题...

void MPU_Memory_Protection(void)   //特意把SRAM4设置为不允许cache,使用DMA的变量可以放在这里。但要注意相应DMA能否访问SRAM4

{

MPU_Set_Protection(0x20000000,MPU_REGION_SIZE_128KB,MPU_REGION_NUMBER1,MPU_REGION_FULL_ACCESS,0,1,1,MPU_TEX_LEVEL0);//保护整个DTCM,共128K字节,禁止共用,允许cache,允许缓冲

MPU_Set_Protection(0x24000000,MPU_REGION_SIZE_512KB,MPU_REGION_NUMBER2,MPU_REGION_FULL_ACCESS,0,1,1,MPU_TEX_LEVEL0);//保护整个内部SRAM,包括SRAM1,SRAM2和DTCM,共512K字节

MPU_Set_Protection(0x30000000,MPU_REGION_SIZE_512KB,M

[1] [2]

cache stm32h7_STM32H7的Cache和MPU相关推荐

  1. Cache总义Cache用法之页面声明

    Cache总义Cache用法之页面声明 <%@ outputCache Duration="#ofseconds" Location="Any|Client|Dow ...

  2. Linux系统中的Page cache和Buffer cache

    Free命令显示内存 首先,我们来了解下内存的使用情况: Mem:表示物理内存统计 total:表示物理内存总量(total = used + free) used:表示总计分配给缓存(包含buffe ...

  3. 学习笔记:cache 和spring cache 技术(1)

    title: 学习笔记:cache 和spring cache 技术(1) author: Eric liu tags: [] categories: hexo 缓存是实际工作中非常常用的一种提高性能 ...

  4. 和linux关系_Linux内核Page Cache和Buffer Cache关系及演化历史

    在我们进行数据持久化,对文件内容进行落盘处理时,我们时常会使用fsync操作,该操作会将文件关联的脏页(dirty page)数据(实际文件内容及元数据信息)一同写回磁盘.这里提到的脏页(dirty ...

  5. 【转载】Java Cache系列之Cache概述和Simple Cache

    原文地址:http://www.blogjava.net/DLevin/archive/2013/10/15/404770.html 前记:最近公司在做的项目完全基于Cache(Gemfire)构建了 ...

  6. HttpContext.Current.Cache vs. HttpRuntime.Cache

    .NET中Cache有两种调用方式:HttpContext.Current.Cache 和 HttpRuntime.Cache,这两种方式有什么区别呢?我们先看MSDN上的解释:       Http ...

  7. Page cache和Buffer cache[转1]

    http://www.cnblogs.com/mydomain/archive/2013/02/24/2924707.html Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的 ...

  8. Elasticsearch搜索引擎之缓存:Request Cache、Query Cache、Fielddata Cache

    ElasticSearch 查询需要占用 CPU.内存资源,在复杂业务场景,会出现慢查询,需要花费大量的时间.为了提高系统的性能,除了增加集群硬件配置这种成本高昂的开销外,还可以使用 ES 的缓存,下 ...

  9. linux刷新磁盘_Linux内核Page Cache和Buffer Cache关系及演化历史

    在我们进行数据持久化,对文件内容进行落盘处理时,我们时常会使用fsync操作,该操作会将文件关联的脏页(dirty page)数据(实际文件内容及元数据信息)一同写回磁盘.这里提到的脏页(dirty ...

最新文章

  1. kindeditor上传图片的大小在哪控制
  2. 关于BCH交易规范排序(CTOR)的优缺
  3. springboot-24-restTemplate的使用
  4. 论文笔记:ShuffleNet v2
  5. 蓝桥杯练习系统习题-基础训练2
  6. IQ测试(jzoj 5048)
  7. 解决Yii2邮件发送问题(结果返回成功,但接收不到邮件)
  8. 01-09 Linux三剑客-awk
  9. 无法访问移动磁盘显示磁盘未被格式化的文件寻回方案
  10. Struts2+Spring3+MyBatis3整合以及Spring注解开发
  11. 分立元器件——电感器
  12. Kubernetes30--弹性伸缩总结
  13. ImageView显示灰色图片
  14. Word公式居中,公式编号右对齐
  15. vue项目设置footer始终处于页面底部
  16. JavaScript百炼成仙 1.18 函数七重关之一 (函数定义)
  17. 医院招聘计算机管理岗考试题库13套
  18. Martin Fowler三万字解读源代码分支管理模式 | IDCF
  19. mysql innodb 存储引擎
  20. 景深决定照相机什么特性_2018年自考《摄影基础》复习试题及答案

热门文章

  1. MySQL语句-查看当前数据库有哪些表(SHOW TABLES)
  2. ArcGIS Server manger管理页面无法打开问题解决
  3. 第2组 团队展示(组长)
  4. 银行计算机安全工作会议记录,商丘市一高召开2020年度网络安全信息化专题会议...
  5. FreeRTOS个人笔记-初谈CM3内核
  6. 判断android已经root,android 如何用代码判断手机是否被root
  7. 使用@ConfigurationProperties注解获取为null的问题
  8. 4.链表LinkedList
  9. win10 截屏方法
  10. 三星s8怎么分屏操作_双屏互动,大有可为 三星Galaxy Z Fold2 5G的魅力折叠体验