STM32H7——高速缓存Cache(二)【含代码】

上一讲我们说了cache的一些基本原理,这一讲我们来说说H7的cache配置所有资料点击这里领取哈

STM32H7—高速缓存Cache(一)

Cortex-M7内核的L1 Cache由多行内存区组成,我们的H7是分为 16Kbytes 的 I-Cache 和 D-Cache
每行有32字节,每行都配有一个地址标签。数据缓冲DCache是每4行为一组,称为4-way set associative。而指令缓冲区ICache是2行为一组,2-way set 这样节省地址标签,不用每个行都标记一个地址

  • 以16 KBytes 的 D-Cache 来计算,一共128 个组(sets), 512 个缓冲行(lines),每个缓冲行 32 个字节

首先来看下H7的默认内存地址映射范围:

其中,WT 表示 Write-through(透写),WB 表示 Write-back(回写),WA 表示 Write-allocate(写分配),没有明确标注 WA 的就是 RA(读分配)。XN 的意思是 Execute-Never, 其含义为如果相应的地址空间是 XN,是绝不允许执行代码的。

存储器类型为 Normal 的才能使用 cache,并且 TCM 接口是 not cacheable 的。

在H7中 Cache 的配置是通过 MPU 来设置的,通常只用到下几种方式。

Cache 相关操作的函数在 cmsis/include/core_cm7.h 头文件中声明从函数名中可以知道,包括四种 cache 操作:enable、disable、clean 和 invalidate。

当然还有三个不常用的函数:

void SCB_InvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize); void SCB_CleanDCache_by_Addr(uint32_t *addr, int32_t dsize); void SCB_CleanInvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);

下面我们来看一下这些函数。

SCB_EnableICache() 

使能指令I-Cache,系统上电后优先初始化即可

SCB_DisableICache() 

禁止指令I-Cache。

SCB_InvalidateICache()

使 I-cache 无效,无效化Invalid是将Cache Line标记为无效,即删除操作。

SCB_EnableDCache()

此函数使能数据D-Cache,系统上电后优先初始化即可

SCB_DisableDCache()

禁止数据D-Cache。

SCB_InvalidateDCache()

使 D-Cache 无效,无效化Invalid是将Cache Line标记为无效,即删除操作。

SCB_CleanDCache()

Clean 清空所有的 cache-line,即将 dirty 的 cache-line 全部写到 cache line 对应的真实的物理地址中

所谓的 drity 属性,即写操作时, 更新了相应的 cache-line,但是没有更新到真实的物理地址,而这个 clean 的动作, 就是将 cache 中的内容更新到真实的物理地址中。

SCB_CleanInvalidateDCache()

此函数是前面两个函数SCB_InvalidateDCache和SCB_CleanDCache的二合一。将Cache Line中标记为dirty的数据写入到相应的存储区后,再将Cache Line标记为无效,表示删除。这样Cache空间就都腾出来了,可以加载新的数据。

SCB_InvalidateDCache_by_Addr()

根据地址信息无效其对应的 cache-line。

SCB_CleanDCache_by_Addr()

根据地址信息 clean 其对应的 cache-line。

SCB_CleanInvalidateDCache_by_Addr()

根据地址信息 clean 并 invalidate 其对应的 cache-line。

一共就这么多,大部分都是对D-Cache的操作,正常使用的时候,直接调用函数进行初始化就行

 SCB_EnableICache();//使能I-Cache SCB_EnableDCache();//使能D-Cache 

但是,在STM32H7—高速缓存Cache(一) 中我们提到了Cache的一致性问题,比方说DMA操作等引起的一致性错误等

1.CPU写数据到内存

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

完整资料可进群免费领取!!!

嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。点击下方链接,0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!

点击这里找小助理0元领取

the end

评论(0)