建议先看MPU笔记:
下载链接:通过网盘分享的文件:MPU内存保护单元.pdf
链接: https://pan.baidu.com/s/1Upa6NS_wtXn9mDsA7mqwhg 提取码: w8a4

请添加图片描述

基础Cache知识:

分数据缓存 D-Cache 和指令缓冲 I-Cache;缓存大小都是 16KB
STM32H7 为例,主频是 400MHz;除了 TCM 和 Cache 以 400MHz工作,其它 AXI SRAM,SRAM1,SRAM2 等都是以 200MHz 工作。数据缓存 D-Cache 就是解决 CPU加速访问 SRAM。如果每次 CPU 要读写 SRAM 区的数据,都能够在 Cache 里面进行,自然是最好的,实现了 200MHz到 400MHz 的飞跃,实际是做不到的,因为数据 Cache 只有 16KB 大小,总有用完的时候。对于使能了 Cache 的 SRAM 区,要分读写两种情况考虑。

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

特别注意的误区知识:
Cache 是 CPU 内核私有的硬件,只归 CPU 管;DMA 是另外一个总线主机,DMA 根本不知道 CPU Cache 的存在。DMA向SRAM写数据时Cache根本就不知道,所以就不会对Cache内存数据写更新

Cache知识点

参数配置问题

在这里插入图片描述
上面表一共四种情况,如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

共享配置是个隐形的大坑

STM32H7 编程手册对其的描述是多核共享。
在这里插入图片描述
豆包解释:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SCB_CleanDCache_by_Addr () 和 SCB_InvalidateDCache_by_Addr () 怎么区分它们的功能和场景

前提:Cortex‑M7(F7/H7),DCache 开启;Cache 里面可能有副本,SRAM 物理内存可能和 Cache 不一致。
两个函数操作单位是 Cache 行(32 字节),传入地址最好对齐 32 字节,缓冲区大小是 32 整数倍。

在这里插入图片描述
在这里插入图片描述
SCB_CleanDCache_by_Addr () :DMA发送数据
SCB_InvalidateDCache_by_Addr ():DMA接收数据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

刚才的错误示例:双向完整示例的 HAL_ADC_Start_DMA (); 为什么之前用 Clean 呢,又不是让 DMA 读缓存 adc 存放数组

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Cache相关函数

在这里插入图片描述

提醒

此部分笔记来源安富莱STM32-V7开发板用户手册(非常推荐)和豆包

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐