• 滨海湾新区要变“湾区明珠” 2019-05-21
  • 孙杨、宁泽涛扛起中国游泳大旗 2019-05-11
  • 那你就写个帖子驳呀!告诉你,我是普通老百姓就是错了也没有啥,你可是论坛“真理化身”呀! 2019-05-11
  • 守住青山不放松 护好绿水不辞难——在渝全国人大代表聚焦“共抓大保护、不搞大开发”专题调研记略 2019-05-10
  • 巴厘岛被爆众多海域垃圾成灾 潜水常被塑料瓶塑料袋包围 2019-05-04
  • 两个不能否定,怎会是停留在30年前? 2019-04-27
  • 国际在线:向世界报道中国,向中国报道世界 2019-04-27
  • 【理上网来喜迎十九大】外媒记者:稳步推进生态文明建设的中国更加美丽 2019-04-26
  • 董卿海霞李思思康辉撒贝宁 央视名嘴童年照谁更萌 2019-04-26
  • “龙江二号”微卫星传回地月合影 2019-04-18
  • 中国驻泰国大使考察合艾国光中学孔子课堂 2019-04-18
  • 【清园20年】感恩大回馈!半价!半价! 2019-04-18
  • 中央纪委紧盯节点 4年来通报曝光问题近4000起 2019-04-13
  • 2013环球企业领袖宁夏圆桌会议嘉宾云集 2019-04-13
  • 《魔兽世界》未解之谜 那些仍不能被玩家们踏足的领地 2019-04-11
  • ST MCU Finder
    安装免费手机应用,
    寻找理想的ST MCU
    打印

    法律擦边球捞偏门赚钱: [STM32 H7] 言简意赅介绍M7内核Cache工作流程,摸爬滚打半年的经验总结

    [复制链接]
    2537|20
    跳转到指定楼层
    楼主
    本帖最后由 Eric2013 于 2018-11-6 01:05 编辑

    说明:
        初学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的描述符缓冲区,发送缓冲区和接收缓冲区时尤其突出。

    沙发
    | 2018-11-6 08:42 | 只看该作者
    板凳
    | 2018-11-6 09:04 | 只看该作者
    不明觉历。
    地板
    | 2018-11-6 12:07 | 只看该作者
    绝对好贴 顶
    5
     楼主 | 2018-11-7 11:25 | 只看该作者
    6
    | 2018-11-7 12:52 | 只看该作者
    这经验太宝贵了
    7
    | 2018-11-7 12:59 | 只看该作者
    cache支持是什么呀
    8
     楼主 | 2018-11-7 13:15 | 只看该作者

    引出问题部分写了。
    9
    | 2018-11-7 14:28 | 只看该作者
    楼主都遇到什么问题了 怎么解决的呀
    10
    | 2018-11-8 11:08 | 只看该作者
    感觉 很少有人 这么用心的 点点滴滴的 学习了!

    大部分还是做一些基础性 或者 应用性的开发!
    11
    | 2018-11-8 11:13 | 只看该作者
    请问楼主现在这些文档有中文版本的了吗
    12
    | 2018-11-8 12:14 | 只看该作者
    这是M7所独有的吗
    13
    | 2018-11-8 14:59 | 只看该作者
    Eric2013 发表于 2018-11-7 13:15
    引出问题部分写了。

    好的 我仔细看看 谢谢楼主
    14
     楼主 | 2018-11-9 01:40 | 只看该作者
    xiaoqizi 发表于 2018-11-7 14:28
    楼主都遇到什么问题了 怎么解决的呀

    帖子末尾写了些。
    15
     楼主 | 2018-11-9 01:41 | 只看该作者
    Diyer2015 发表于 2018-11-8 11:08
    感觉 很少有人 这么用心的 点点滴滴的 学习了!

    大部分还是做一些基础性 或者 应用性的开发! ...

       
    16
     楼主 | 2018-11-9 01:41 | 只看该作者
    磨砂 发表于 2018-11-8 11:13
    请问楼主现在这些文档有中文版本的了吗

    都是英文的。
    17
     楼主 | 2018-11-9 01:41 | 只看该作者
    晓伍 发表于 2018-11-8 12:14
    这是M7所独有的吗

    STM32只有F7和H7的M7内核带Cache
    18
    | 2018-11-9 09:07 | 只看该作者
    Eric2013 发表于 2018-11-9 01:41
    STM32只有F7和H7的M7内核带Cache

    哦哦 好的 谢谢您啊
    19
    | 2018-11-9 09:20 | 只看该作者
    Eric2013 发表于 2018-11-9 01:41
    STM32只有F7和H7的M7内核带Cache

    我晕 我手头上有F7的 我都没有仔细看 谢啦
    20
    | 2018-11-9 13:37 | 只看该作者
    真心希望 楼主赶紧出 网络的 freemodbus!
    扫描二维码,随时随地手机跟帖
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    我要发帖 投诉建议 创建版块 申请版主

    快速回复

    您需要登录后才可以回帖
    登录 | 注册
    高级模式

    论坛热帖

    快速回复 广东快乐十分走势图 返回列表
  • 滨海湾新区要变“湾区明珠” 2019-05-21
  • 孙杨、宁泽涛扛起中国游泳大旗 2019-05-11
  • 那你就写个帖子驳呀!告诉你,我是普通老百姓就是错了也没有啥,你可是论坛“真理化身”呀! 2019-05-11
  • 守住青山不放松 护好绿水不辞难——在渝全国人大代表聚焦“共抓大保护、不搞大开发”专题调研记略 2019-05-10
  • 巴厘岛被爆众多海域垃圾成灾 潜水常被塑料瓶塑料袋包围 2019-05-04
  • 两个不能否定,怎会是停留在30年前? 2019-04-27
  • 国际在线:向世界报道中国,向中国报道世界 2019-04-27
  • 【理上网来喜迎十九大】外媒记者:稳步推进生态文明建设的中国更加美丽 2019-04-26
  • 董卿海霞李思思康辉撒贝宁 央视名嘴童年照谁更萌 2019-04-26
  • “龙江二号”微卫星传回地月合影 2019-04-18
  • 中国驻泰国大使考察合艾国光中学孔子课堂 2019-04-18
  • 【清园20年】感恩大回馈!半价!半价! 2019-04-18
  • 中央纪委紧盯节点 4年来通报曝光问题近4000起 2019-04-13
  • 2013环球企业领袖宁夏圆桌会议嘉宾云集 2019-04-13
  • 《魔兽世界》未解之谜 那些仍不能被玩家们踏足的领地 2019-04-11
  • 重庆时时彩后一技巧 福彩3d试机号开奖对应数据统计 如何下载新浪彩票网 幸运28 十一运夺金玩法 江苏省体育彩票走势图 下载新疆时时彩 快乐8360 二八杠app 幸运赛车专家推荐号 北京pk10 排列5开奖号码是多少 北京赛车pk10六码投注 今天彩票开奖是什么 七乐彩走势图表综合版 幸运飞艇到晚上几点