搜索
bottom↓
回复: 52

言简意赅介绍M7内核Cache工作流程,摸爬滚打半年的经验总结

  [复制链接]

出0入0汤圆

发表于 2018-11-6 00:55:23 | 显示全部楼层 |阅读模式
本帖最后由 Eric2013 于 2018-11-6 00:55 编辑

说明:
    初学M7的Cache时,经常是ARM的手册和ST的手册看了一遍又一遍,虽然每次看,每次都有收获,但是一直无法形成系统的认识,说到某一个知识点也明白,但是具体到读写操作的时候是怎么个流程,就懵逼了,也是心里烦躁,最近脑子开窍了些,特此分享下经验。

当前的认识能力有限,有不对的地方,欢迎批评指正。

一、引出问题:
    当前芯片厂商出的M7内核芯片基本都做了一级Cache支持,Cache又分数据缓存D-Cache和指令缓冲I-Cache,对于指令缓冲,用户不用管,这里主要说的是数据缓存D-Cache。以STM32H7为例,主频是400MHz,除了TCM和Cache以400MHz工作,其它AXI SRAM,SRAM1,SRAM2等都是以200MHz工作。数据缓存D-Cache就是解决CPU加速访问SRAM。

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

对于使能了Cache的SRAM区,要分读写两种情况考虑。
读操作:   
    如果CPU要读取的SRAM区数据在Cache中已经加载好,这就叫读命中(Cache hit),如果Cache里面没有怎么办,这就是所谓的读Cache Miss。

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



二、支持的Cache配置:
Cache的配置是通过MPU来设置的,通常只用到下几种方式。


其中的TEX是用来设置Cache策略的,C是Cache,B是缓冲用来配合Cache设置的,而S是共享,用来解决多总线或者多核访问时的同步问题。MPU配置的时候,最主要的也是配置这几个参数。

Cache支持的策略有如下四种:


有了这四种方式,就可以在正式进入本帖的主题,Cache的读写操作是如何工作的,下面分这四种情况做一 一介绍。


三、四种Cache(MPU)配置的读写操作流程说明
1、 Non-cacheable
这个最好理解,就是正常的读写操作,无Cache。

(1)对应四种MPU配置如下:
TEX = 000 C=0 B=0  S=忽略此位,强制为共享
TEX = 000 C=0 B=1  S=忽略此位,强制为共享
TEX = 001 C=0 B=0  S=0
TEX = 001 C=0 B=0  S=1

2、Write through, read allocate,no write allocate
注意,M7内核只要开启了Cache,read allocate就是开启的。

(1)使能了此配置的SRAM缓冲区写操作
    如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域,那么会同时写到Cache里面和SRAM里面;如果没有,就用到配置no write allocate了,意思就是CPU会直接往SRAM里面写数据,而不再需要在Cache里面开辟空间了。

    在写Cache命中的情况下,这个方式的优点是Cache和SRAM的数据同步更新了,没有多总线访问造成的数据一致性问题。缺点也明显,Cache在写操作上无法有效发挥性能。

(2)使能了此配置的SRAM缓冲区读操作
    如果CPU要读取的SRAM区数据在Cache中已经加载好,就可以直接从Cache里面读取。如果没有,就用到配置read allocate了,意思就是在Cache里面开辟区域,将SRAM区数据加载进来,后续的操作,CPU可以直接从Cache里面读取,从而时间加速。

    安全隐患,如果Cache命中的情况下,DMA写操作也更新了SRAM区的数据,CPU直接从Cache里面读取的数据就是错误的。

(3)对应两种MPU配置如下:
TEX = 000 C=1 B=0  S=1
TEX = 000 C=1 B=0  S=0

3、Write back, read allocate,no write allocate
注意,M7内核只要开启了Cache,read allocate就是开启的。

(1)使能了此配置的SRAM缓冲区写操作
    如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域,那么会写到Cache里面,而不会立即更新SRAM;如果没有,就用到配置no write allocate了,意思就是CPU会直接往SRAM里面写数据,而不再需要在Cache里面开辟空间了。

    安全隐患,如果Cache命中的情况下,此时仅Cache更新了,而SRAM没有更新,那么DMA直接从SRAM里面读出来的就是错误的。

(2)使能了此配置的SRAM缓冲区读操作
   如果CPU要读取的SRAM区数据在Cache中已经加载好,就可以直接从Cache里面读取。如果没有,就用到配置read allocate了,意思就是在Cache里面开辟区域,将SRAM区数据加载进来,后续的操作,CPU可以直接从Cache里面读取,从而时间加速。

    安全隐患,如果Cache命中的情况下,DMA写操作也更新了SRAM区的数据,CPU直接从Cache里面读取的数据就是错误的。

(3)对应两种MPU配置如下:
TEX = 000 C=1 B=1  S=1
TEX = 000 C=1 B=1  S=0

4、Write back, read allocate,write allocate
注意,M7内核只要开启了Cache,read allocate就是开启的。

(1)使能了此配置的SRAM缓冲区写操作
    如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域,那么会写到Cache里面,而不会立即更新SRAM;如果没有,就用到配置write allocate了,意思就是CPU写到往SRAM里面的数据,会同步在Cache里面开辟一个空间将SRAM中写入的数据加载进来,如果此时立即读此SRAM区,那么就会有很大的速度优势。

    安全隐患,如果Cache命中的情况下,此时仅Cache更新了,而SRAM没有更新,那么DMA直接从SRAM里面读出来的就是错误的。

(2)使能了此配置的SRAM缓冲区读操作
    如果CPU要读取的SRAM区数据在Cache中已经加载好,就可以直接从Cache里面读取。如果没有,就用到配置read allocate了,意思就是在Cache里面开辟区域,将SRAM区数据加载进来,后续的操作,CPU可以直接从Cache里面读取,从而时间加速。

    安全隐患,如果Cache命中的情况下,DMA写操作也更新了SRAM区的数据,CPU直接从Cache里面读取的数据就是错误的。

    这个配置被誉可以最大程度发挥Cache性能,不过具体应用仍需具体分析。

(3)对应两种MPU配置如下:
TEX = 001 C=1 B=1  S=1
TEX = 001 C=1 B=1  S=0

5、共享配置是个隐形的大坑
这里以STM32H7为例进行说明,STM32H7编程手册对其的描述是多核共享。

而H7的应用笔记对齐的描述是开启共享基本等同于关闭Cache。


实际测试下面四种开Cache的情况,开关共享对缓冲区的大批量数据的读操作影响很大,基本差出两倍,而写操作基本没有影响,也许这就是所谓的多总线同步读造成的。
另外共享开关仅对开启了Cache的情况下有影响,而对于关闭了Cache的情况是没有影响的,开不开没关系。

6、总结这几种方式的几个关键知识点
(1)Cortex-M7内核的L1 Cache由多行内存区组成,每行有32字节,每行都配有一个地址标签。数据缓冲DCache是每4行为一组,称为4-way set associative。而指令缓冲区ICache是2行为一组,这样节省地址标签,不用每个行都标记一个地址。

(2)对于读操作,只有在第1次访问指定地址时才会加载到Cache,而写操作的话,可以直接写到内存中(write-through模式)或者放到Cache里面,后面再写入(write-back模式)。

(3)如果采用的是Write back,Cache line会被标为dirty,等到此行被evicted时,才会执行实际的写操作,将Cache Line里面的数据写入到相应的存储区。

(4)Cache命中是访问的地址落在了给定的Cache Line里面,所以硬件需要做少量的地址比较工作,以检查此地址是否被缓存。如果命中了,将用于缓存读操作或者写操作。如果没有命中,则分配和标记新行,填充新的读写操作。如果所有行都分配完毕了,Cache控制器将支持eviction操作。根据Cache Line替换算法,一行将被清除Clean,无效化Invalid或者重新配置。数据缓存和指令缓存是采用的伪随机替换算法。

(5)Cache支持的4种基本操作,使能,禁止,清空和无效化。Clean清空操作是将Cache Line中标记为dirty的数据写入到内存里面,而无效化Invalid是将Cache Line标记为无效,即删除操作。


四、面对这种繁冗复杂的Cache配置,推荐方式和安全隐患解决如下(以H7为例):
(1)推荐使用128KB的TCM作为主RAM区,其它的专门用于大缓冲和DMA操作等。
(2)Cache问题主要是CPU和DMA都操作这个缓冲区时容易出现,使用时要注意。
(3)Cache配置的选择,优先考虑的是WB,然后是WT和关闭Cache,其中WB和WT的使用中可以配合ARM提供的如下几个函数解决上面说到的隐患问题。但不是万能的,在不起作用的时候,直接暴力选择函数SCB_CleanInvlaidateDCache解决。关于这个问题,在分别配置以太网MAC的描述符缓冲区,发送缓冲区和接收缓冲区时尤其突出。

  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2018-11-6 01:11:47 | 显示全部楼层
我顶(水一波,嘿嘿嘿)

出140入115汤圆

发表于 2018-11-6 01:19:13 | 显示全部楼层
楼主辛苦了,
楼上夜猫子

出0入0汤圆

发表于 2018-11-6 01:40:31 来自手机 | 显示全部楼层
楼主辛苦了,

出0入0汤圆

发表于 2018-11-6 04:48:16 来自手机 | 显示全部楼层
cache策略配合对应的应用场景。M系列不大清楚,A系列cache相对容易

出140入8汤圆

发表于 2018-11-6 06:24:00 | 显示全部楼层
还是感觉很复杂的样子

出0入22汤圆

发表于 2018-11-6 07:04:05 来自手机 | 显示全部楼层
a9芯片里面,也是研究了好久cache的问题也没有完全明白。。

出0入0汤圆

发表于 2018-11-6 07:54:43 | 显示全部楼层
感谢 楼主!!

出0入0汤圆

发表于 2018-11-6 08:01:37 | 显示全部楼层
楼主  我们现在是用的策略是 只要涉及到 DMA操作的  专门化分出一块DMA RAM,直接关闭CACHE,以前用函数处理数据同步的问题,但是在长期大量数据测试中,还是有数据同步问题(很小的概率,但是有)。

出0入0汤圆

发表于 2018-11-6 08:09:24 | 显示全部楼层
学习了,

出0入8汤圆

发表于 2018-11-6 08:19:08 | 显示全部楼层
谢谢分享,我顶!

出0入4汤圆

发表于 2018-11-6 08:23:56 | 显示全部楼层
楼主威5!

出0入0汤圆

发表于 2018-11-6 08:26:09 来自手机 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2018-11-6 08:30:45 | 显示全部楼层
感谢楼主,之前自己学习,很长世间都没有弄明白

出0入0汤圆

发表于 2018-11-6 08:41:18 | 显示全部楼层
楼主辛苦了。。必须点赞

出0入0汤圆

发表于 2018-11-6 08:50:58 | 显示全部楼层
硬汉哥辛苦啦,,,早点休息,注意身体

出0入25汤圆

发表于 2018-11-6 08:52:44 | 显示全部楼层

大神又发干货,,赶紧收藏学习,,感谢楼主

出0入102汤圆

发表于 2018-11-6 09:02:52 来自手机 | 显示全部楼层
感谢硬汉分享干货

出0入0汤圆

发表于 2018-11-6 09:12:16 | 显示全部楼层
好帖子,感谢楼主的共享。

出0入0汤圆

发表于 2018-11-6 11:08:54 | 显示全部楼层
   thanks very much.

出0入4汤圆

发表于 2018-11-6 11:17:15 来自手机 | 显示全部楼层
LZ 厉害,留着 学习。

出0入0汤圆

发表于 2018-11-6 11:40:53 | 显示全部楼层
干货,感谢分享

出0入90汤圆

发表于 2018-11-6 11:50:05 | 显示全部楼层
这个知识还是挺不错的。

出0入0汤圆

发表于 2018-11-6 12:37:17 | 显示全部楼层
thanks very much.

出0入0汤圆

发表于 2018-11-6 14:43:25 | 显示全部楼层
收藏一下,谢谢楼主

出0入0汤圆

发表于 2018-11-6 14:48:15 | 显示全部楼层
资料非常不错,清晰明了。

出0入0汤圆

发表于 2018-11-6 14:53:56 | 显示全部楼层
cache感觉一直都理不太清楚,楼主写的挺详细的,谢谢分享

出870入263汤圆

发表于 2018-11-6 18:17:50 | 显示全部楼层
终于mcu也上了cache这些概念,跟arm9,arm11,ca9这些应用处理器越来越接近了。以前做单片机开发的人得把这些知识跟进上来,否则根本玩不转以后的芯片。

出0入0汤圆

发表于 2018-11-6 18:51:36 | 显示全部楼层
单片机越来越高级

出0入0汤圆

发表于 2018-11-6 18:56:35 来自手机 | 显示全部楼层
感谢楼主科普,有用到cache,但是都没有弄得太清楚原理。

出0入85汤圆

发表于 2018-11-6 19:36:57 | 显示全部楼层
cortex-A系列ic的cache资料比较多, 可以先看一下. 再来看m7的cache就豁然开朗啦

出0入24汤圆

发表于 2018-11-6 20:05:08 | 显示全部楼层
学习ing,感谢硬汉

出0入0汤圆

发表于 2018-11-6 21:49:17 | 显示全部楼层
感谢分享

出250入8汤圆

发表于 2018-11-6 22:04:23 | 显示全部楼层
我还看不懂,收藏希望以后能看懂。

出0入0汤圆

发表于 2018-11-6 22:08:15 来自手机 | 显示全部楼层
谢谢分享。           

出0入0汤圆

发表于 2018-11-7 10:18:33 | 显示全部楼层
楼主辛苦了,非常好的教程,学习学习

出0入0汤圆

发表于 2018-11-7 10:43:18 | 显示全部楼层
LZ厉害

出0入0汤圆

发表于 2018-11-7 10:51:32 | 显示全部楼层
赞!比官方文档还“官方”
  

出0入0汤圆

发表于 2018-11-7 12:54:46 | 显示全部楼层
普及得不错!

出0入0汤圆

发表于 2018-11-7 13:16:41 | 显示全部楼层
谢谢楼主。这样看起来就比较清晰明了

出90入0汤圆

发表于 2018-11-7 13:30:34 | 显示全部楼层
LZ辛苦了!

出0入0汤圆

发表于 2018-11-11 16:01:08 来自手机 | 显示全部楼层
LZ辛苦了!!!

出0入0汤圆

发表于 2018-11-11 20:09:22 来自手机 | 显示全部楼层
谢谢您分享宝贵的经验!写的非常好!

出0入0汤圆

发表于 2018-11-11 20:47:23 来自手机 | 显示全部楼层
我想请教一下,片外SDRam是不是也可以开启ceche?谢谢!

出0入0汤圆

 楼主| 发表于 2018-11-11 21:04:15 来自手机 | 显示全部楼层
xuekcd 发表于 2018-11-11 20:47
我想请教一下,片外SDRam是不是也可以开启ceche?谢谢!

对,没问题。

出100入101汤圆

发表于 2018-11-11 22:27:01 | 显示全部楼层
顶一下大牛

出0入0汤圆

发表于 2018-11-12 10:12:50 来自手机 | 显示全部楼层
越来越复杂的

出0入0汤圆

发表于 2018-11-12 11:32:52 | 显示全部楼层
谢谢分享。

出10入0汤圆

发表于 2018-11-12 13:57:40 | 显示全部楼层
虽然看不懂,但是感觉得出来很强大!楼主威武!

出10入12汤圆

发表于 2018-11-12 17:14:15 | 显示全部楼层
这个太伸入了!!!!!必须要了解

出0入0汤圆

发表于 2018-11-12 17:33:39 | 显示全部楼层
M7内核Cache工作流程 mark 谢谢楼主分享

出0入0汤圆

发表于 2018-11-12 17:36:21 | 显示全部楼层
腻害了,讲的通俗易懂。

出0入0汤圆

发表于 2018-11-12 19:57:36 | 显示全部楼层
谢谢楼主分享!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-18 21:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表