STM32F7 MPU Cache的原理和一致性问题

目录

概述

1 Cache 及其原理

2 结构及策略

2.1 Cache类型

2.2 Cache实例

3 Cache 及 MPU 属性

4 Cache 一致性问题

4.1 未Clean写Cache情况

4.2 DMA 更新物理内存情况

4.3 一个实例

4.3.1 功能描述

4.3.2 代码实现

4.3.3 结论 


概述

本文主要从结构原理以及应用方面对 MPU 和 Cache 进行分析,通过对cache相关知识体系的学习,以Cache 有基本的了解。便于在具体的实际应用中, 使用带有一级 cache 的 MCU 时,避免出现一些不必要的错误。

1 Cache 及其原理

cache 是一种高速缓存,其位于CPU与memory之间的存储设备。

Cache是高速缓存,一般指的是 L1 cache,即和 Core 紧耦合的, 从 STM32F7 系列开始,基于 ARM cortex-M7 内核,增加了对 L1 Cache 的支持。

Cache分为两类:

1)指令 Cache(I-cache)

2)数据 Cache(D-cache)

从上图片可以看出来,无论是指令 Cache(I-cache)还是数据 Cache(D-cache), 一旦使能之后,
就分别与 Core 的 prefetch unit(I-cache)load-store unit(D-cache)相连。

 Cache的特点:

以 D-cache 为例, 因为直接与 LSU 相连,访问速度会比直接访问 SRAM 或外部 RAM 快很多, 只要保证 cache 有足够高的命中率(由 cache 策略保证), 尽量少的 cache miss, 读/写的速度会有比较大的提高。
 

2 结构及策略

2.1 Cache类型

1)指令Cache

2)数据Cache

2.2 Cache实例

同样这里以 D-cache 为例, 看一下 D-cache 的构成:包括 Address 和 cache-line, Address 表明其地址, 对应一条包含 32bytes 的 cache-line。

1)读数据

当地址命中时即 cache-hit,便可以直接从 cache line 中取出相应的数据, 反之,当遍历address 都没有找到, 就会产生 cache-miss,这时便会从实际的内存单元(如 SRAM)中取出相应的数据,并更新到某一条 cache-line 中并修改相应的 cache-line 信息;

2)写数据: write-through 策略和 write-back 策略。

write-though策略

更新 cache-line 的同时, 同样会更新其对应的实际物理地址的区域。

write-back策略

更新cache-line 的同时,并不是马上去更新其对应的实际物理地址的内容,而是在其认为合适或者所有的cache-line 都 dirty 的时候才会去更新, 当然,也可以通过软件让其强制更新,即 clean 的动作, 这一块会在后面的 cache 一致性问题上也会有体现;

同样,对于为什么将 cache 拆分为 2-way 或是 4-way, 这和 cache 自身的策略如查找算法等相关。


3 Cache 及 MPU 属性

cache 一般是配合 MPU(memory protection unit)一起使用的, 首先需要通过 MPU配置相应 memory 的属性(normal, strongly-ordered, device, XN etc.), 如下表所示:

地址空间描述
0~0x1FFF_FFFFflash 空间, 属性为 normal, cache 的属性为 Write-through, 即更新 cache 的同时,将数据同时写入相应的物理地址空间
0x2000_0000~0x3FFF_FFFFSRAM 空间, 属性为 normal, cache 的属性为 write-back, 即仅更新cache, 在合适的时候(由 cache 策略决定或者软件强制更新)将数据更新到相应的SRAM 空间
0x4000_0000~0x5FFFF_FFFF芯片内部的外设空间,属性为 device,这一版是外设寄存器所处的位置,对其读写的过程中不会经过 cache

4 Cache 一致性问题

4.1 未Clean写Cache情况

当写物理内存的指令时, core 会先去更新相应的 cache-line(Write-back 策略), 在没有clean 的情况下,会导致其对应的实际物理内存中的数据并没有被更新。如果这个时候有其它的 Host( 如 DMA) 访问这段内存时, 就会出现问题( 由于实际物理内存并未被更新,和 D-cache 中的不一致) , 这就是所谓的 cache 一致性的问题!

4.2 DMA 更新物理内存情况

在DMA 更新了某段物理内存( DMA 和 cache 直接没有直接通道)时 , 而这个时候 Core 再读取这段内存的时候,由于相对应地址的 cache-line 没有被 invalidate,导致 Core 读到的是 cache-line中的数据,而非被 DMA 更新过的实际物理内存的数据

4.3 一个实例

4.3.1 功能描述

执行流程:

step -1:  SRAM1_Buffer 先全部写入 0x55

step -2: Core 将 Flash 中的 Const_Buffer 写入 SRAM1_Buffer( 这里会先经过 d-cache) 

step -3:配置 DMA,将 SRAM1_Buffer 中的数据通过 DMA 写入另一段内存 DTCM_Buffer

step -4:比较 DTCM_Buffer 中的数据和 Flash 中的 Const_Buffer 数据, 看是否一致

4.3.2 代码实现

step -1: MPU 对 memory 的配置 

参数描述
BaseAddress要配置的存储空间的起始地址;
Size要配置的存储空间的大小
IsCacheable表明这段存储空间是否可以 cache
IsBufferable使能 cache 之后, 策略是 write-through 还是 write-back(bufferable) 这里需要特别注意的 1 点:配置的 BaseAddress 需要被 Size 整除, 以上述配置为例, 即0x20010000 除以 256K 需要是整数!

step- 2: 使能 Cache

step- 3: 初始化 SRAM1_Buffer 为 0x55

step- 4: Copy Flash 中的 Const_Buffer 到 SRAM1_Buffer

step- 5: 配置 DMA,将 SRAM1_Buffer 写入 DTCM_Buffer

step- 6: 比较 DTCM_Buffer 和 Const_Buffer, 看是否一致

4.3.3 结论 

从结果上看,step- 6比较的结果并不一致, 原因比较简单, 由于设定的 WB 策略,所以在
step4 的时候, 数据会暂存在 D-cache 当中, 并没有更新到 SRAM1_Buffer, 所以当
SRAM1_Buffer 被 DMA 拷到 DTCM_Buffer 中的时候,有一部分可能还是初始值,导致最终
的比较不一样,而解决的方法有以下几个:

1)MPU 配置的代码,将属性改为 MPU_ACCESS_BUFFERABLE, 即使用 write-though 策略

2)通过 cache 控制寄存器,将所有 cacheable 的空间全部强制 write-though


 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

接口自动化测试(python+pytest+requests)

一、选取自动化测试用例 优先级高:先实现业务流程用例、后实现单接口用例功能较稳定的接口优先开展测试用例脚本的实现二、搭建自动化测试环境 核心技术:编程语言:python;测试框架:pytest;接口请求:requests安装/验证requests:命令行终端分别输入 pip install requests / p…

助力低碳出行 | 基于ACM32 MCU的电动滑板车方案

随着智能科技的快速发展,电动滑板车的驱动系统也得到了长足的发展。国内外的电动滑板车用电机驱动系统分为传统刷式电机和无刷电机两种类型。其中,传统的刷式电机已经逐渐被无刷电机所取代,无刷电机的性能和寿命都更出色,已成为电…

蓝桥杯-单片机基础16——利用定时计数中断进行动态数码管的多窗口显示

综合查阅了网络上目前能找到的所有关于此技能的代码,最终找到了下述方式比较可靠,且可以自定义任意显示的数值。 传统采用延时函数的方式实现动态数码管扫描,在题目变复杂时效果总是会不佳,因此在省赛中有必要尝试采用定时计数器中…

HCIP课后习题之一

1、路由协议用工作机制上分为那几种?分别是? A:两种。分别是静态路由和动态路由(可分为IGP和EGP) 2、IGP和EGP协议有哪些? A:IGP: RIP、OSPF、ISIS、EIGRP EGP: BGP 3、路由优先级的用途&…

嵌入式学习52-ARM1

知识零散: 1.flash: nor flash 可被寻地址 …

如何设置端口映射?

端口映射是一种网络技术,通过在网络路由器或防火墙上设置规则,将外部网络请求转发到内部特定设备或服务的端口上。这样可以实现不同地区电脑与电脑、设备与设备、电脑与设备之间的信息远程通信,提供更加便捷的网络连接。 2. 天联组网 天联是…

Day:005 | Python爬虫:高效数据抓取的编程技术(爬虫效率)

爬虫之多线程-了解 单线程爬虫的问题 因为爬虫多为IO密集型的程序,而IO处理速度并不是很快,因此速度不会太快如果IO卡顿,直接影响速度 解决方案 考虑使用多线程、多进程 原理: 爬虫使用多线程来处理网络请求,使用线程…

废品回收 小程序+APP

用户实名认证、回收员实名认证、后台审核、会员管理、回收员管理、订单管理、提现管理、地图、档案管理。 支持,安卓APP、苹果APP、小程序 流程: 一、用户端下单,地图选择上门位置、填写具体位置、废品名称、预估重量、选择是企业废旧、家…

MySQL - 掌握MySQL锁的必备知识

1. 多个事务更新同一行数据时是如何加锁避免脏写? 当有多个事务同时并发更新一行数据的时候,不就是会有脏写的问题吗?那么脏写是靠什么防止的呢? 其实就是靠锁机制,依靠锁机制让多个事务更新一行数据的时候串行化,避免同时更新一行数据。 在MySQL里,假设有一行数据摆…

基于JAVA的校园失物招领平台

采用技术 基于JAVA的校园失物招领平台的设计与实现~ 开发语言:Java 数据库:MySQL 技术:SpringMVCMyBatis 工具:IDEA/Ecilpse、Navicat、Maven 页面展示效果 管理员功能 论坛管理 失物认领管理 寻物启事管理 用户管理 失物…

neo4j-01

Neo4j是: 开源的(社区版开源免费)无模式(不用预设数据的格式,数据更加灵活)noSQL(非关系型数据库,数据更易拓展)图数据库(使用图这种数据结构作为数据存储方…

基于java的某超市进销存管理系统

开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclip…

lovesql 手工sql注入

1.页面 2.万能密码登录成功 我还傻乎乎的以为密码就是flag 但不是 3. 继续注入 判断列数 确定了只有三列 开始尝试联合注入 4.使用联合注入之前先判断显示位 5.之后一步一步的构造,先得到当前数据库名 利用database() 再得到库里有哪些表 …

前端保留两位小数

一、保留两位小数(四舍五入) 解决方案:使用 toFixed(x) 方法可以对小数进行指定位数保留,其中x是要保留的位数用法:num.toFixed(x),其中num为需要操作的数据,x为要保留的位数示例:1…

20240410解决OK3588-C的核心板刷机之后无法启动的问题

20240410解决OK3588-C的核心板刷机之后无法启动的问题 2024/4/10 19:38 1、编译OK3588的LINUX/Buildroot?forlinxubuntu: ~/3588/OK3588_Linux_fs$ sudo ./build.sh BoardConfig-linuxfs-ok3588.mk 2、进行全编译 forlinxubuntu: ~/3588/OK3588_Linux_fs$ sudo ./bu…

互联网轻量级框架整合之MyBatis核心组件

在看本篇内容之前,最好先理解一下Hibernate和MyBatis的本质区别,这篇Hibernate和MyBatis使用对比实例做了实际的代码级对比,而MyBatis作为更适合互联网产品的持久层首选必定有必然的原因 MyBatis核心组件 MyBatis能够成为数据持久层首选框&a…

每日一题(leetcode1702):修改后的最大二进制字符串--思维

找到第一个0之后,对于后面的子串(包括那个0),所有的0都能调上来,然后一一转化为10,因此从找到的第一个0的位置开始,接下来是(后半部分子串0的个数-1)个1,然后…

电力系统卫星授时信号安全隔离装置防护方案

电力系统是国家关键基础设施, 电力安全关系国计民生, 是国家安全的重要保障, 与政治安全、经济安全、 网络安全、社会安全等诸多领域密切关联。电网运行情况瞬息万变,为了在其发生事故时能够及时得到处理,需要统一的时…

vue2 二次封装element 组件,继承组件原属性,事件,插槽 示例

测试页面代码 这里主要记录如何封装element的el-input 并且封装后具有el-input原本的属性 事件 插槽 下面为测试页面即组件调用 <script> import CustomInput from /components/CustomInput.vue;export default {name: TestPage,components: { CustomInput },data() …

jvm中jdk常用的几个命令总结

1.jmap 此命令可以用来查询内存信息&#xff0c;实例个数及占用内存大小 1.1 查看堆内存概要信息&#xff08;内存分配统计&#xff09; jmap -histo[:live] <pid> .-histo&#xff1a;显示堆中对象的统计信息&#xff0c;包括每个类的实例数量、占用内存大小等 :live…