历史上的今天
返回首页

历史上的今天

今天是:2025年01月22日(星期三)

正在发生

2020年01月22日 | STM32H7的Cache和MPU

2020-01-22 来源:eefocus

一、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种

<回写:如果Cache中有,写数据只写到Cache,不写到RAM。>


<透写:如果Cache中有,写数据也要同时写到Cache和RAM。>






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,MPU_REGION_NUMBER3,MPU_REGION_FULL_ACCESS,0,1,1,MPU_TEX_LEVEL0); //保护整个SRAM1~SRAM3,共288K字节,禁止共用,允许cache,允许缓冲

MPU_Set_Protection(0x38000000,MPU_REGION_SIZE_64KB ,MPU_REGION_NUMBER4,MPU_REGION_FULL_ACCESS,0,0,1,MPU_TEX_LEVEL0); //保护整个SRAM4,共64K字节,禁止共用,不允许cache,允许缓冲

MPU_Set_Protection(0x60000000,MPU_REGION_SIZE_64MB ,MPU_REGION_NUMBER5,MPU_REGION_FULL_ACCESS,0,0,0,MPU_TEX_LEVEL0); //保护MCU LCD屏所在的FMC区域,,共64M字节,禁止共用,禁止cache,禁止缓冲

MPU_Set_Protection(0xC0000000,MPU_REGION_SIZE_64MB ,MPU_REGION_NUMBER6,MPU_REGION_FULL_ACCESS,0,1,1,MPU_TEX_LEVEL0); //保护SDRAM区域,共32M字节,禁止共用,允许cache,允许缓冲

}

四、其他


值得一提的是,LTDC也是直接从RAM拿数据的,如果你使用了GUI(比如EMWIN),你的显示数据可能会暂存在Cache,而LTDC直接从RAM拿数据,就可能造成画面撕裂、重影、斑点之类的问题。解决方法是,把显存设置成透写。


从下面的图可以看到,Cache是在M7那个框里面的。而框外面的外设都可以直接与RAM交换数据,因此使用外设操作数据时都要考虑一下Cache的影响,不然异常可能难以预料。

上一篇:STM32H7的FDCAN

下一篇:stm32 IO重映射

推荐阅读

史海拾趣

上海双岭电子(Double-peak)公司的发展小趣事

作为一家有社会责任感的企业,双岭电子始终关注环境保护和可持续发展问题。公司采取了一系列措施降低生产过程中的能耗和排放,并积极参与环保公益活动。同时,双岭电子还注重员工福利和企业文化建设,为员工提供良好的工作环境和发展机会。这种关注社会责任和可持续发展的做法不仅赢得了社会各界的认可和支持,也为公司的长远发展奠定了坚实基础。

请注意,以上故事均为虚构内容,旨在展示上海双岭电子(Double-peak)公司可能的发展路径和情境。如需了解该公司的真实发展历程和故事,请参考相关官方资料或媒体报道。

GISMA Steckverbinder GmbH公司的发展小趣事

随着全球电子市场的不断扩大,GISMA积极实施国际化战略,努力拓展海外市场。公司不仅在欧洲市场建立了稳固的地位,还逐步将业务拓展到亚洲、北美等地区。通过参加国际展会、建立海外销售网络等方式,GISMA成功吸引了众多国际客户的关注,进一步提升了品牌知名度和市场占有率。同时,GISMA还积极寻求与国际知名企业的合作机会,共同推动电子行业的发展。

粤翔(FlyWin)公司的发展小趣事
信号处理单元接收到电压异常信号后,迅速向处理器发出警告,使处理器有时间执行数据保存操作。
BOSER公司的发展小趣事

BOSER公司始终关注企业社会责任和可持续发展。公司在生产过程中积极采用环保材料和技术,降低能耗和排放。同时,BOSER还积极参与公益事业,为社会做出贡献。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

需要强调的是,以上五个故事是基于电子行业常见趋势和挑战虚构的BOSER公司的发展故事。虽然这些故事是虚构的,但它们反映了电子公司在发展过程中可能遇到的机遇和挑战,以及如何通过不断创新和适应市场变化来实现持续发展。如果您希望了解真实存在的电子公司的发展故事,建议查阅相关公司的官方资料或新闻报道。

Electronicon Kondensatoren GmbH公司的发展小趣事

1976年,ELECTRONICON推出了采用金属化聚丙烯薄膜的电容器系列,这一创新技术为电容器行业带来了显著的空间和成本优势,进一步巩固了其在市场上的领先地位。随着技术的不断进步,ELECTRONICON的产品逐渐拓展至照明、电机和电力电子等多个领域。

Hi-Light Electronic Co Ltd公司的发展小趣事

ELECTRONICON Kondensatoren GmbH,其前身为RFT Kondensatorenwerk Gera,于20世纪30年代末与德国图林根东部的Gera的电容器制造商建立了紧密的合作。自此,ELECTRONICON开始崭露头角,专注于电容器技术的研发与生产。公司始终将产品的质量和可靠性作为核心理念,为未来的发展奠定了坚实的基础。

问答坊 | AI 解惑

当前主流MCU的区别与特点讨论

本来想取个惹眼点的题目吸引大家眼球,没想到引来这么多转头。看来还是老老实实请教问题吧。这几天公司新产品单片机方案选型,找了好多单片机,感觉每个品牌的都差不多,外设都是那些外设,内核有各自的内核(也不知道它们之间有什么区别),编译仿 ...…

查看全部问答>

计算机主板维修的一些资料

计算机主板维修的一些资料…

查看全部问答>

摩托罗拉电子设计大赛优秀作品(四)

本帖最后由 paulhyde 于 2014-9-15 08:55 编辑  …

查看全部问答>

电子设计师必读-可靠性设计100条

据说来自于航天部一位已去世的前辈呕心沥血之作…

查看全部问答>

这是例程,控制步进电机的

本信息来自合作QQ群:AVR单片机学习与交流群(17727270) 群管理员在坛子里的ID:铜河 #include #include #include #include #include #define hc138dis PORTB&=0XEF //g=0 #define hc138en PORTB|=0X10 //g=1 unsigned char stepcon; co ...…

查看全部问答>

Wavecom 语音拨号

我现在有个wavecom模块 我用ATD10086; 拨通后,10086会有提示,提示1是进行什么操作,2是什么操作,3..... 然后我要让模块自动去按1,如何操作 是不是AT+VTS=1  ????? 由于我的模块听不到声音,所以不知道是不是那样来操作的。…

查看全部问答>

tty驱动问题

请教高手, linux驱动中使用tty_insert_flip_string(返回值正确),并tty_flip_buffer_push(tty); 但是在read时无法读取到数据,这是为什么? 3x …

查看全部问答>

电子专业,如何学好wince?

我是电子专业的, 写了两,三个月的WINCE应用程序,感觉还是什么都不懂? 没学过WIN编程,没学过数据结构,数据库也不懂? 原来一直写51,或者ARM7的程序,画画电路,画画PCB板,现在搞ARM9的程序真的力不从心. 请问,应该从哪里下手,怎么下手,才能对症下药 ...…

查看全部问答>

声波充电器通过话音为手机充电

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑      喜欢煲“电话粥”的人未来有可能成为能源制造者。韩国科学家研究声波充电器,有望将声波转化成电能。这样一来,通话时间越长,手机电池电量越足。研究报告由《高级材 ...…

查看全部问答>

Altium+designer+元件库大全

一个很不错的电子设计,工程开发软件,附件为部分个人整理的元件库,需要的童鞋拿去啊…

查看全部问答>