STM32H7的Cache学习和应用

STM32H7的Cache学习和应用

  • 啥是Cache?
  • Cache的配置
    • 配置 Non-cacheable
    • 配置 Write through,read allocate,no write allocate
    • 配置 Write back,read allocate,no write allocate
    • 配置 Write back,read allocate,write allocate
    • 共享配置是个隐形的大坑
  • Cache的关键知识点
  • Cache的推荐配置和隐患

啥是Cache?

当前芯片厂商出的 M7 内核芯片基本都做了一级 Cache 支持,Cache 又分数据缓存 D-Cache 和指令缓冲 I-Cache,STM32H7 的数据缓存和指令缓存大小都是 16KB。对于指令缓冲,用户不用管,这里主要说的是数据缓存 D-Cache。以 STM32H7 为例,主频是 400MHz,除了 TCM 和 Cache 以 400MHz工作,其它 AXI SRAM,SRAM1,SRAM2 等都是以 200MHz 工作。数据缓存 D-Cache 就是解决 CPU加速访问 SRAM。
如果每次 CPU 要读写 SRAM 区的数据,都能够在 Cache 里面进行,自然是最好的,实现了 200MHz到 400MHz 的飞跃,实际是做不到的,因为数据 Cache 只有 16KB 大小,总有用完的时候。
读操作:
如果 CPU 要读取的 SRAM 区数据在 Cache 中已经加载好,这就叫读命中(Cache hit),如果 Cache里面没有怎么办,这就是所谓的读 Cache Miss。
写操作:
如果 CPU 要写的 SRAM 区数据在 Cache 中已经开辟了对应的区域(专业词汇叫 Cache Line,以 32字节为单位),这就叫写命中(Cache hit),如果 Cache 里面没有开辟对应的区域怎么办,这就是所谓的写 Cache Miss。
在这里插入图片描述

Cache的配置

主要通过配置TEX C B S位,其中TEX是设置Cache的策略,B是缓冲用来配合Cache设置,S则是共享。
在这里插入图片描述
分为4种模式:
在这里插入图片描述

配置 Non-cacheable

这个最好理解,就是正常的读写操作,无 Cache。

配置 Write through,read allocate,no write allocate

使能了此配置的 SRAM 缓冲区写操作
如果 CPU 要写的 SRAM 区数据在 Cache 中已经开辟了对应的区域,那么会同时写到 Cache 里面和SRAM 里面;如果没有,就用到配置 no write allocate 了,意思就是 CPU 会直接往 SRAM 里面写数据,而不再需要在 Cache 里面开辟空间了。
在写 Cache 命中的情况下,这个方式的优点是 Cache 和 SRAM 的数据同步更新了,没有多总线访问造成的数据一致性问题。缺点也明显,Cache 在写操作上无法有效发挥性能。
对应的两种 MPU 配置如下:
TEX = 000 C=1 B=0 S=1
TEX = 000 C=1 B=0 S=0

配置 Write back,read allocate,no write allocate

使能了此配置的 SRAM 缓冲区写操作
如果 CPU 要写的 SRAM 区数据在 Cache 中已经开辟了对应的区域,那么会写到 Cache 里面,而不会立即更新 SRAM;如果没有,就用到配置 no write allocate 了,意思就是 CPU 会直接往 SRAM 里面写数据,而不再需要在 Cache 里面开辟空间了。
安全隐患,如果 Cache 命中的情况下,此时仅 Cache 更新了,而 SRAM 没有更新,那么 DMA 直接从 SRAM 里面读出来的就是错误的。
对应两种 MPU 配置如下:
TEX = 000 C=1 B=1 S=1
TEX = 000 C=1 B=1 S=0

配置 Write back,read allocate,write allocate

使能了此配置的 SRAM 缓冲区写操作
如果 CPU 要写的 SRAM 区数据在 Cache 中已经开辟了对应的区域,那么会写到 Cache 里面,而不会立即更新 SRAM;如果没有,就用到配置 write allocate 了,意思就是 CPU 写到往 SRAM 里面的数据,会同步在 Cache 里面开辟一个空间将 SRAM 中写入的数据加载进来,如果此时立即读此 SRAM 区,那么就会有很大的速度优势。
安全隐患,如果 Cache 命中的情况下,此时仅 Cache 更新了,而 SRAM 没有更新,那么 DMA 直接从 SRAM 里面读出来的就是错误的。

注意,M7 内核只要开启了 Cache,read allocate 就是开启的,因此4种模式的Cache的对SRAM的读操作一样
read allocate下SRAM 缓冲区读操作
如果 CPU 要读取的 SRAM 区数据在 Cache 中已经加载好,就可以直接从 Cache 里面读取。如果没有,就用到配置 read allocate 了,意思就是在 Cache 里面开辟区域,将 SRAM 区数据加载进来,后续的操作,CPU 可以直接从 Cache 里面读取,从而时间加速。
安全隐患,如果 Cache 命中的情况下,DMA 写操作也更新了 SRAM 区的数据,CPU 直接从 Cache里面读取的数据就是错误的。

共享配置是个隐形的大坑

在这里插入图片描述
而 H7 的应用笔记对齐的描述是开启共享基本等同于关闭 Cache。
实际测试下面四种开 Cache 的情况,开关共享对缓冲区的大批量数据的读操作影响很大,基本差出两倍,而写操作基本没有影响,也许这就是所谓的多总线同步读造成的。另外共享开关仅对开启了 Cache 的情况下有影响,而对于关闭了 Cache 的情况是没有影响的,开不开没关系。(来源于安富莱_STM32-V7开发板手册)

Cache的关键知识点

  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的推荐配置和隐患

推荐使用 128KB 的 TCM 作为主 RAM 区其它的专门用于大缓冲和 DMA 操作等
Cache 问题主要是 CPU 和 DMA 都操作这个缓冲区时容易出现,使用时要注意。
Cache 配置的选择,优先考虑的是 WB,然后是 WT 和关闭 Cache,其中 WB 和 WT 的使用中可以配合 ARM 提供的函数解决上面说到的隐患问题(见本章 24.6 小节)。但不是万能的,在不起作用的时候,直接暴力选择函数 SCB_CleanInvlaidateDCache 解决。关于这个问题,在分别配置以太网MAC 的描述符缓冲区,发送缓冲区和接收缓冲区时尤其突出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/540781.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

05 SQL进阶 -- 复杂查询方法 -- 视图与子查询

1. 视图 我们先来看一个查询语句 SELECT stu_name FROM view_students_info; 单从表面上看起来这个语句是和正常的从数据表中查询数据是完全相同的,但其实我们操作的是一个视图。所以从SQL的角度来说操作视图与操作表看起来是完全相同的,那么为什么还会有视图的存在呢?视…

002nodejs详细安装步骤和npm配置

1、Node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时。Node.js 使用高效、轻量级的事件驱动、非阻塞 I/O 模型。它的包生态系统,npm,是目前世界上最大的开源库生态系统。 2、下载Node.js 官方地址:https://nodejs.org/…

2024年阿里云服务器新购、续费、升级优惠活动和价格表

阿里云服务器租用价格表2024年最新,云服务器ECS经济型e实例2核2G、3M固定带宽99元一年,轻量应用服务器2核2G3M带宽轻量服务器一年61元,ECS u1服务器2核4G5M固定带宽199元一年,2核4G4M带宽轻量服务器一年165元12个月,2核…

SAFe认证Leading SAFe官方认证班/Leading SAFe领导大规模敏捷认证课

课程简介 SAFe – Scaled Agile Framework是目前全球运用最广泛的大规模敏捷框架,也是全球敏捷相关认证成长最快、最被认可、最有价值的规模化敏捷认证,目前全球SAFe认证专业人士已达120万人。 据官方统计,获得新证书的IT专业人士的平均工资…

Linux 系统下对于 MySQL 的初级操作

由于公司老板想把早已封存的服务器陈年老码捣鼓一下,所以找了一个外援,我则是配合提供支持。但是过程并不顺利。至少 5 年以上的间隔,导致外援查看的时候发现很多代码和配置是缺失的,目前卡在数据库部分,而我这边就帮忙…

CorelDRAW2024绿色精简汉化版本安装包下载

CorelDRAW是一款由加拿大Corel公司开发的平面设计软件,主要用于矢量图形制作、排版和编辑。它以其强大的功能和用户友好的界面而广受欢迎,被广泛应用于各个领域,包括设计、广告、出版和印刷等。 CDR2017-2024全版本下载网盘汉化版链接: http…

【RK3399】Ubuntu系统,HDMI输出固定分辨率

在linux系统目录下:/usr/share/X11/xorg.conf.d,新增 screen-resolution.conf文件。 在改文件中添加: Section "Monitor"Identifier "HDMI-1"Option "Primary" "true"Modeline "1280x800_60.0…

区块链游戏:探索未来的可能性与挑战

区块链游戏是一种将区块链技术应用于游戏领域的创新产品,它为游戏行业带来了全新的模式和可能性。本文将深入探讨区块链游戏的优点、挑战和未来趋势,帮助读者了解这一新兴领域。 一、区块链游戏的优点 1. 公平性:区块链技术保证了游戏中的物…

隐式转换和强制转换

一.前言: 数字进行运算时,数据类型不一样不能运算,需要转成一样的,才能运算 二.取值范围 byte-------->short--------------->int------------->long------------------>float----------->double 三.隐式转换 1.概念 把取值范围小的数值转换成取值范围大的数…

在 Next.js App Router 中使用仅在服务端的代码

React Server Components 架构将组件分为客户端和服务端类型,并与 Next.js 的 App Router 集成。 使用 App Router 进行开发时,区分服务端代码和客户端代码对于应用程序的安全性、性能和可维护性至关重要。这篇博文将介绍在 Next.js 应用程序中定义服务…

【前缀合】Leetcode 连续数组

题目解析 525. 连续数组 寻找一个子数组,这个子数组中包含相同数目的0和1,但是这个子数组需要最长的 算法讲解 只需在[0,i]寻找一段区间使得这一段区间的和也等于sum即可 细节问题:1. 这里的哈希表的value存的是下标,因为需要找…

C++STL(stack类、queue类)

文章目录 1.stack类和queue类的介绍2.stack类和queue类的基本用法2.1 (stack)下列代码的运行结果是( )2.2 (queue)下列代码的运行结果是( ) 3.stack类和queue类的底层(模拟实现)3.1 deque类(双端队列)3.2 适配器模式3.3 stack类的…

python创建word文档并向word中写数据

一、docx库的安装方法 python创建word文档需要用到docx库,安装命令如下: pip install python-docx 注意,安装的是python-docx。 二、使用方法 使用方法有很多,这里只介绍创建文档并向文档中写入数据。 import docxmydocdocx.Do…

CSS导读 (复合选择器 上)

(大家好,今天我们将继续来学习CSS的相关知识,大家可以在评论区进行互动答疑哦~加油!💕) 目录 二、CSS的复合选择器 2.1 什么是复合选择器 2.2 后代选择器(重要) 2.3 子选择器(重要) Questions 小提…

【CSS基础】9.形变transform

1. transform介绍 CSS transform属性允许对某个一个元素进行形变,包括旋转、位移、缩放、倾斜等并非所有的盒子都可以形变(通常来说行内级盒子不能进行形变) 2. transform的用法 transform可以增加多个transform function,通过空…

短视频转gif怎么做?三十秒在线转换gif

在现在这个快节奏的时代,gif动画相较于长时间的视频更受大众的欢迎。当我们需要将短视频、电影等视频制作成gif动画图片的时候就可以使用gif动画图片(https://www.gif.cn/)制作网站-GIF中文网,无需下载软件,手机、pc均…

K8s 命令行工具

文章目录 K8s 命令行工具kubectl 工具在任意节点使用kubectl方式创建对象命令显示和查找资源更新资源修补资源编辑资源Scale 资源删除资源查看pod信息节点相关操作 K8s 命令行工具 在搭建集群的时候,我们通过yum 下载了kubeadm kubelet kubectl 三个命令行工具&…

C 语言贪吃蛇源码解析

贪吃蛇是一款经典的电子游戏,玩家控制一条不断成长的蛇,需要避免撞到自己的身体或者游戏边界,同时吃掉出现在屏幕上的食物以增长身体长度。 下面是一个简单的贪吃蛇游戏的C语言实现,使用了标准输入输出库conio.h和时间库windows.h…

(弟)递归•斐波那契数、n的k次方

这里是目录哦 题目一:递归计算斐波那契数斐波那契数的定义代码运行截图递归过程递归停止条件(1个参数)✨非递归实现方法 题目二:递归实现n的k次方代码运行截图递归过程递归停止条件(不止1个参数)✨ 加油&am…

DETR论文粗读

一.前情提要 1.本文理论为主,并且仅为个人理解,能力一般,不喜勿喷 2.本文理论知识较为散碎 3.如有需要,以下是原文,更为完备 DETR 论文精读【论文精读】_哔哩哔哩_bilibili 二.正文 示意图: 1.不同与…