你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】例说STM32F7高速缓存——Cache一致性问题(二)

[复制链接]
STMCU小助手 发布时间:2021-12-13 23:15
2. STM32F7 新特性——高速缓存
5 r/ n) W+ L4 a2.1 STM32F7 的存储系统
* L+ I$ i2 e- _STM32F7 系列微控制器作为高性能微控制器,为我们带来了很多让人眼前一亮的新特性,其中之一就是独立的指令和数据高速缓冲存储器,也就是所谓的 L1-cache,包括 I-Cache 和 D-Cache。Cache 的大小根据不同型号有所差别,有 4Kbytes、8Kbytes 和 16Kbytes 几种容量。* \* g# P* D( k, J6 Q$ s7 j
1 [' ]( T# G0 ~
实际上,这个 Cache 是放在 Cortex 内核里面的,半导体厂商(比如 ST)购买 IP 核的时候可以选择要多大的 cache,之后这款 MCU 的 cache 就已经固定了。这有点像我们去 4S 店买车,根据自身的需求和资金情况选择不同的配置。显然,cache 的容量越大,价格也就越高。本文所使用的 STM32F769I-DISCO 包含 16Kbytes 的 I-Cache 和 D-Cache。" y& p# {; ]8 [6 P$ z
4 r) M; d; [* m2 E
eb0701445eb8d7c38eeb8965dd31d08e.png

( n  I' L4 N% S5 p7 b3 v$ @9 j- Y% a4 \) b# b
上图是 STM32F7 系列微控制器的系统架构框图,我们可以看到在 Cortex-M7 内核里面有一个 I-Cache 和一个 D-Cache,它们是实实在在的高速存储器。而 DTCM 和 ITCM 则是两个接口,对应 Data TCM 和 Instruction TCM,它们有利于数据和指令的快速读取,可实现内嵌 Flash 的零时延数据读取。但是要注意 TCM 接口是不经过缓存的!9 A) L7 ~1 h; S4 D4 V; i& \
2 _7 y0 @  q6 e- T) I& l
上图的 F7 框图,包含 1 MB Flash 和 320 KB SRAM,其中的 320 KB 的 SRAM 是分离的,它包括 64 KB 的 DTCM RAM、240 KB SRAM1 以及 16 KB SRAM2,而 16 KB 的 ITCM RAM 和 4 KB 的备份 RAM 并不包含在内。6 e1 `' [1 A5 }' W' J

; l2 t6 S$ o( g这几个 SRAM 的关系,我们来看下面这个图就比较明白了。! K4 f" ?- L4 T

% P5 x+ p- y# a, A2 m7 Y
51117c3f8c93425ecb5b5402d2115060.png

. a/ w+ L  e+ x( |; P* U9 z8 U+ ]/ L3 I7 ~. C! O, z, @1 h7 i- D
可以看到,DTCM RAM、SRAM1 和 SRAM2 在地址映射上是连续的,比如从 0x20000000 到 0x2007FFFF。1 U  l) N  C2 x) d5 K

4 o- I8 G3 J5 o( H3 T- [& E9 X我们还可以看到内嵌的 Flash 有两种接口,分别是 AXIM 和 ITCM 接口,对应于地址 0x08000000 和 0x00200000。那怎么通过不同的接口操作 Flash 呢?——只要操作对应的地址即可。
3 v1 @% h  U# u: n( c, x* W0 m* q; ^! z0 [. C0 ?
2.2 Cache 的组织
: K$ f/ _' `# j, ~* h! E- m( S' j在前面我们说过,绝大多数控制器的 Cache 都是采用组关联(set-associative)的映射方式,STM32F7 当然也不例外。那么,F7 的 Cache 是如何组织的呢?
" p, w' R1 ~0 g% F% Q2 ^, G( g
. N/ h2 y2 [+ g/ N3 a; E通过文档 AN4839,我们可以了解到:( m7 W9 H- R) ^% C+ p

2 N. U% x% y4 P// 第5页
& Y' o# M$ c9 l. f( nA cache is normally implemented using sets of lines where a line is just a short segment of memory. The number of lines in a set is called x-way associative. This property is set in the hardware design.
- n0 _# ~: P9 t, Y  ?7 n3 |6 f5 a7 B
6 D' I7 ?& ]3 T" {$ [( j6 \// 第6页
9 N1 o# j/ `( Y8 Q0 ]The L1-caches on all Cortex®-M7s are divided into lines of 32 bytes. Each line is tagged with an address. The data cache is 4-way set associative (four lines per set) and the instruction cache is 2-way set associative. This is a hardware compromise to keep from having to tag each line with an address.
, V  q* e1 [5 }& ]+ K
" \: K7 i, s3 D8 t也就是说,D-Cache 和 I-Cache 的块大小(cache line)为 32 bytes,采用组关联映射方式。对于 D-Cache,每组(set)包含 4 个缓冲行(line);对于 I-Cache,每组(set)包含 2 个缓冲行(line)。
! D! K+ t5 [: d  I9 \, [/ }2 e; l/ C* S5 j% f! C
以 16 KBytes 的 D-Cache 来计算,一共 512 个缓冲行(lines),128 个组(sets),每组包含 4 个 line,每个 line 包含 8 个字,也就是 32 个字节。
/ s1 G5 E+ o4 N/ i5 L% l/ l7 O3 G# g% T; P  _
2.3 存储器默认映射和属性
2 G  J7 a7 k+ E: _+ D  dSTM32F7 系列微控制器的存储器的默认映射和属性如下图所示。' j3 q3 g) g6 s5 p" T

( [+ U/ {5 N( `4 C! A& b0 g3 V
0598619c8a77aa253c5335c651dd7dc4.png
. G7 h/ F$ t: C2 W% b0 g

0 a) w+ G" n. u  H; J“默认”的意思就是如果没有启动 MPU,并且没有对某些特殊寄存器进行配置,那么存储器的映射地址及其属性就如上图所示。6 M/ \) P7 D7 V/ i5 ^  S6 M" }
; c; y0 \6 T# p: _) k
其中,WT 表示 Write-through(透写),WB 表示 Write-back(回写),WA 表示 Write-allocate(写分配),没有明确标注 WA 的就是 RA(读分配)。XN 的意思是 Execute-Never, 其含义为如果相应的地址空间是 XN,是绝不允许执行代码的。
6 v9 h; c3 g/ {% M; N* w( Q6 m; [0 x& N, g% g* m' _
存储器类型为 Normal 的才能使用 cache,并且 TCM 接口是 not cacheable 的。5 {2 J9 g6 d3 r  ?

  P% @: d8 \$ E. K5 Z; A当然,这只是默认值,部分存储器地址映射和属性是可以通过 MPU 来配置的。- s  m1 c9 {( V. a! P6 v2 j
' B+ n  ~- b! z* k6 v* ~$ O  _
选取几个有特点的区域稍微讲解一下吧:; l5 R' ^( f% X2 T3 V, h# o' a
) b: T3 M8 A- Y" I
0x00000000~0x1FFFFFFF:flash 空间, 属性为 normal, cache 的属性为 Write-through, 即更新 cache 的同时,将数据同时写入相应的物理地址空间。2 a; X: O" u: ]8 ]' @* t
0 w) m4 V0 Y- d
0x20000000~0x3FFFFFFF:SRAM 空间, 属性为 normal, cache 的属性为 write-back, 即仅更新 cache, 在合适的时候(由 cache 策略决定或者软件强制更新)将数据更新到相应的 SRAM 空间。0 r8 e0 H7 s3 z4 C8 v  _
5 h* J, w  \9 D# h% e# M
0x40000000~0x5FFFFFFFF:芯片内部的外设空间,属性为 device,这一区域是外设寄存器所处的位置,对其读写的过程中不会经过 cache。
/ n$ ?" u0 O/ P& q/ C2 K4 r6 Z- U" j
2.4 CMSIS 函数, F" {) a  ~5 e0 n
前面说了那么多,我自己都有点晕了。。。对于用户来说,如何正确使用 Cache 才是关键!' R* B& \* D8 x1 }" u8 E( c9 A
0 y% W* q' s) [; Q
下面这张图是在文档 PM0253 中截取的,Cache 相关操作的函数在 cmsis/include/core_cm7.h 头文件中声明。从函数名中可以知道,包括四种 cache 操作:enable、disable、clean 和 invalidate。
" H7 x2 j( [( y0 [" z+ f6 r
+ K* f8 ^" f# P8 C0 R; h- z+ g
c864476b5c7f0a5a537f7154eabde8e9.png
3 U6 s3 U6 _; s

6 d0 `  `3 M, M3 W2 R: C, l查看源代码发现,除了表中的8个函数,还有以下3个函数(都是以 _by_Addr 结尾):7 x  G$ W  I, `  i2 s/ A" E) ~
. A2 a" Z+ b4 N& ?, }8 Q
  1. void SCB_InvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);) n5 U* z3 y- {- w0 R; W

  2. . C% ]2 {2 ^) `
  3. void SCB_CleanDCache_by_Addr(uint32_t *addr, int32_t dsize);
    / M# k& r# ~  B" l
  4. # I& {0 k: U/ ~  h4 j% \3 m0 S
  5. void SCB_CleanInvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
复制代码

5 ^9 }" Z! O5 p4 N3 E3 I好,那下面我们一一来了解这些函数吧。' w6 I" h) `8 K1 {' F" c2 d

" }+ n( `" t5 y; N. @/ USCB_EnableICache() 和 SCB_EnableDCache()5 x: B1 V1 w" ^2 ]1 l. z: t) c) @4 Z
6 w- F; e. l4 ?% G
使能 I-cache 或 D-cache。7 t! p( `( F' U
  g' i8 P( X) [0 T, d1 |6 m' e2 ~
SCB_DisableICache() 和 SCB_DisableDCache()
+ Q- l2 p, z6 T
& @8 t' A' b' e  Z8 @- _2 `, @禁用 I-cache 或 D-cache。2 o6 ^) x( l( P" {  t2 M# V
6 {/ w* D% B5 _% E
SCB_InvalidateICache()
" b, N; |' |% K% E3 V
. t" s  ]# d( c/ s  k/ B4 ]( e4 U, @- p. l使 I-cache 无效,I-cache 被 invalidate 之后,当读取指令时,会忽略相应的 cache-line 中的内容(因为被 validate 了),而从真实的物理地址中去获取相应的指令。
) @, D" w' r7 h* p. G- b; t2 B4 Z# A$ u- F2 r7 ~" P
SCB_InvalidateDCache()
8 z" y: N4 w4 @6 v0 J使 D-cache 无效,D-cache 被 invalidate 之后,当有 Host(如 core,DMA 等)读取数据时,会忽略相应的 cache-line 中的内容( 因为被 validate 了),从真实的物理地址中去获取相应的数据。, K- T* i& y3 @1 B0 K9 u

5 S8 P7 t  ?9 [/ ^4 R) ASCB_InvalidateDCache_by_Addr()

6 O. G  p5 Z; x& Q( }根据地址信息无效其对应的 cache-line。
, X+ e9 J; G8 Q% w3 K% t! F, r7 E* D6 J6 t/ t4 s" R
SCB_CleanDCache()
, N- @4 ^) U  W3 m6 }Clean 所有的 cache-line,即将 dirty 的 cache-line 全部写到 cache line 对应的真实的物理地址中所谓的 drity 属性,即写操作时, 更新了相应的 cache-line,但是没有更新到真实的物理地址,而这个 clean 的动作, 就是将 cache 中的内容更新到真实的物理地址中。
0 ^4 ^8 |0 W+ k9 V0 F2 ?* L1 z9 L; z# n8 ]9 G
SCB_CleanDCache_by_Addr()
2 q, G" ^, I( y6 f# }" @
根据地址信息 clean 其对应的 cache-line。+ W" F& d6 g7 ~/ H; N  A

* r9 }- C$ a+ a7 X9 F: G9 SSCB_CleanInvalidateDCache_by_Addr()( H, d" a& l3 p$ J  d
根据地址信息 clean 并 invalidate 其对应的 cache-line。
7 w% n) S: W8 B8 z: |8 t' s( D" Q8 L. w! c' \+ R# c
9 ~' j  d1 ^! s8 ]3 l
收藏 评论0 发布时间:2021-12-13 23:15

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版