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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 23:15
2. STM32F7 新特性——高速缓存
2 @. k2 x7 r# i/ i: m6 A2.1 STM32F7 的存储系统( d3 h9 t" K! c, a- X" ?2 a% k0 i
STM32F7 系列微控制器作为高性能微控制器,为我们带来了很多让人眼前一亮的新特性,其中之一就是独立的指令和数据高速缓冲存储器,也就是所谓的 L1-cache,包括 I-Cache 和 D-Cache。Cache 的大小根据不同型号有所差别,有 4Kbytes、8Kbytes 和 16Kbytes 几种容量。9 ]7 L8 K" E  v$ [/ ]8 g
0 ?3 c0 P% S' r6 t3 }2 ]$ ^/ r
实际上,这个 Cache 是放在 Cortex 内核里面的,半导体厂商(比如 ST)购买 IP 核的时候可以选择要多大的 cache,之后这款 MCU 的 cache 就已经固定了。这有点像我们去 4S 店买车,根据自身的需求和资金情况选择不同的配置。显然,cache 的容量越大,价格也就越高。本文所使用的 STM32F769I-DISCO 包含 16Kbytes 的 I-Cache 和 D-Cache。
; `* R- x6 \. z7 a8 V+ p: n" O1 }( I! @4 g! d  \9 s
eb0701445eb8d7c38eeb8965dd31d08e.png

3 L9 [& w" |" @/ W4 K. {% l- p9 U4 t
上图是 STM32F7 系列微控制器的系统架构框图,我们可以看到在 Cortex-M7 内核里面有一个 I-Cache 和一个 D-Cache,它们是实实在在的高速存储器。而 DTCM 和 ITCM 则是两个接口,对应 Data TCM 和 Instruction TCM,它们有利于数据和指令的快速读取,可实现内嵌 Flash 的零时延数据读取。但是要注意 TCM 接口是不经过缓存的!
9 ?/ q" g6 y$ o$ s9 m
% C# ?) ]! T' ?/ d5 a; L) n上图的 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 并不包含在内。+ O" V2 s( {5 l) }2 B% U
5 m7 H2 N+ v4 |, ^
这几个 SRAM 的关系,我们来看下面这个图就比较明白了。& p2 \0 ~8 y- I8 u  V
8 M1 g$ r: H5 N+ `0 j: n$ A1 R7 R
51117c3f8c93425ecb5b5402d2115060.png
3 c2 R0 A5 c5 C/ x- @" Z0 F
2 w/ B# U- ~; b# J) Q8 t
可以看到,DTCM RAM、SRAM1 和 SRAM2 在地址映射上是连续的,比如从 0x20000000 到 0x2007FFFF。( I2 P: a+ s! [, V+ Q. z' O
; `- D+ K+ _- C- F) q2 G
我们还可以看到内嵌的 Flash 有两种接口,分别是 AXIM 和 ITCM 接口,对应于地址 0x08000000 和 0x00200000。那怎么通过不同的接口操作 Flash 呢?——只要操作对应的地址即可。4 e% d% u+ u* U1 G( g' t

, o, Z+ g& w1 x2.2 Cache 的组织5 x  A9 y; _7 q; D- \3 L
在前面我们说过,绝大多数控制器的 Cache 都是采用组关联(set-associative)的映射方式,STM32F7 当然也不例外。那么,F7 的 Cache 是如何组织的呢?
. k8 `1 f8 C* k+ w6 V2 I# g7 {# u  k# h% x$ x: U
通过文档 AN4839,我们可以了解到:
. M/ |5 E, A* r5 J4 X2 l1 z$ k9 D8 W/ U: t( E6 b' X
// 第5页* S% u8 q; P9 j4 I# P; r
A 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.* a( R! O7 Y) h9 ^- r- B0 N

1 Y9 \- B7 h- i) @; S! I; p// 第6页
' [+ @  t0 J" s7 g3 UThe 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.
9 F( l; n. S2 a& r. a% O; D
3 Q0 t7 k8 e1 K5 V0 ]6 V0 B+ i1 ^也就是说,D-Cache 和 I-Cache 的块大小(cache line)为 32 bytes,采用组关联映射方式。对于 D-Cache,每组(set)包含 4 个缓冲行(line);对于 I-Cache,每组(set)包含 2 个缓冲行(line)。
" v2 u- j, H( h0 ]1 D, j
. G; [0 ?9 F- S$ P) j以 16 KBytes 的 D-Cache 来计算,一共 512 个缓冲行(lines),128 个组(sets),每组包含 4 个 line,每个 line 包含 8 个字,也就是 32 个字节。
" C& T9 b: H: s
% x, ?0 Z! H1 j1 C2.3 存储器默认映射和属性+ T* r" j/ d5 [
STM32F7 系列微控制器的存储器的默认映射和属性如下图所示。; o" U. L, |, B5 {. K4 ?+ A- p4 k3 j
, c- b" @! x8 C$ L
0598619c8a77aa253c5335c651dd7dc4.png
2 R  S! p5 X3 V6 ~  Y" R
6 l* y- R) T7 q) Q# X# }
“默认”的意思就是如果没有启动 MPU,并且没有对某些特殊寄存器进行配置,那么存储器的映射地址及其属性就如上图所示。
1 z6 l9 O0 ~! l. l7 E* p5 g6 _( s6 B0 z- R5 ~
其中,WT 表示 Write-through(透写),WB 表示 Write-back(回写),WA 表示 Write-allocate(写分配),没有明确标注 WA 的就是 RA(读分配)。XN 的意思是 Execute-Never, 其含义为如果相应的地址空间是 XN,是绝不允许执行代码的。6 t) {4 s" [* y/ ]
; l: Z+ Y6 d0 ^( M' a' c
存储器类型为 Normal 的才能使用 cache,并且 TCM 接口是 not cacheable 的。
( n' e4 y0 E! Z2 u  u' O: T" X
- @- H3 n1 o0 G( a当然,这只是默认值,部分存储器地址映射和属性是可以通过 MPU 来配置的。2 D/ d3 d' R0 a' m+ V

. I8 f5 \  f1 S/ s8 z选取几个有特点的区域稍微讲解一下吧:& S+ W4 J/ _  e3 Z
" e3 Y- g2 l0 n* y
0x00000000~0x1FFFFFFF:flash 空间, 属性为 normal, cache 的属性为 Write-through, 即更新 cache 的同时,将数据同时写入相应的物理地址空间。
8 a: S0 y: x) H2 {0 y
3 }- A6 x" g( p9 u8 E) Y2 ?1 j0x20000000~0x3FFFFFFF:SRAM 空间, 属性为 normal, cache 的属性为 write-back, 即仅更新 cache, 在合适的时候(由 cache 策略决定或者软件强制更新)将数据更新到相应的 SRAM 空间。% d4 {( y" k2 d! m$ S

4 t0 D, q1 G+ f. a5 Y. [0x40000000~0x5FFFFFFFF:芯片内部的外设空间,属性为 device,这一区域是外设寄存器所处的位置,对其读写的过程中不会经过 cache。# Z9 j- i& k! e% [: [/ S* j' w

' |! w6 r+ w5 E4 E/ z$ N+ B2.4 CMSIS 函数8 M& }: O9 t" C" W* F4 n
前面说了那么多,我自己都有点晕了。。。对于用户来说,如何正确使用 Cache 才是关键!
. \# a; N6 C1 @' J3 W6 U; e5 e
5 U3 e5 K0 W4 Y8 Q$ w8 c% H下面这张图是在文档 PM0253 中截取的,Cache 相关操作的函数在 cmsis/include/core_cm7.h 头文件中声明。从函数名中可以知道,包括四种 cache 操作:enable、disable、clean 和 invalidate。
8 P3 }% ^: `5 _5 {7 i% H3 s! X6 a, ]& e2 k& f3 M6 q
c864476b5c7f0a5a537f7154eabde8e9.png
: T. i( J3 a8 S) ^
0 i5 C8 |6 z" [% e* a! ]' L
查看源代码发现,除了表中的8个函数,还有以下3个函数(都是以 _by_Addr 结尾):
' ~0 X! j: r$ R/ ?
& z7 ^. V* A* F+ q! {
  1. void SCB_InvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);0 X- z3 R; p5 |! c6 C' ?

  2. 9 b2 d/ z3 @& F$ G' X
  3. void SCB_CleanDCache_by_Addr(uint32_t *addr, int32_t dsize);1 u( P! d! w7 T2 h8 ^& f- M
  4. * r+ I6 W4 h$ `  A9 `
  5. void SCB_CleanInvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
复制代码

( i) _, r, O* E, }8 D) o4 k. W; _好,那下面我们一一来了解这些函数吧。, Y5 ^4 y4 v) r1 X
+ Q: [- B# J; ~2 I
SCB_EnableICache() 和 SCB_EnableDCache()
2 n1 p0 Q. ]& k* x3 \- Q7 {9 Q+ C% Q5 F
使能 I-cache 或 D-cache。
( Y2 g5 f( N  b
6 M& \" t% _( M6 x- ~SCB_DisableICache() 和 SCB_DisableDCache()7 {$ q, i4 C/ I
* I' F& i! V- \% W6 w  {; X5 {
禁用 I-cache 或 D-cache。
) y0 ]4 |) i6 ?! i* Z2 O2 g0 I
2 ~" v7 B7 O8 ?" m9 P5 @3 k% W0 jSCB_InvalidateICache()* t' u4 q$ c6 p. O# i) W
2 {4 k/ F5 f3 D, \6 q' Y+ _) H7 J
使 I-cache 无效,I-cache 被 invalidate 之后,当读取指令时,会忽略相应的 cache-line 中的内容(因为被 validate 了),而从真实的物理地址中去获取相应的指令。
% V0 W8 K# M$ {( ?
9 V0 a! J# j" r. J! mSCB_InvalidateDCache()2 A$ A/ m. G# c. J7 H
使 D-cache 无效,D-cache 被 invalidate 之后,当有 Host(如 core,DMA 等)读取数据时,会忽略相应的 cache-line 中的内容( 因为被 validate 了),从真实的物理地址中去获取相应的数据。
/ g7 C; F6 h0 F- q$ V+ k+ Q' A+ @4 c, K. g9 r
SCB_InvalidateDCache_by_Addr()
, L) z+ k( u- V  {
根据地址信息无效其对应的 cache-line。! I3 \; q2 ]- c/ v8 d
$ I7 m1 G+ h8 i6 |2 K* K
SCB_CleanDCache(); J) |) y9 v+ f2 e) i, Y3 `
Clean 所有的 cache-line,即将 dirty 的 cache-line 全部写到 cache line 对应的真实的物理地址中所谓的 drity 属性,即写操作时, 更新了相应的 cache-line,但是没有更新到真实的物理地址,而这个 clean 的动作, 就是将 cache 中的内容更新到真实的物理地址中。$ S+ ]" S4 ~% o/ }' L( C
# |) q2 P$ S' q+ A7 J0 y
SCB_CleanDCache_by_Addr()

' e( c0 P/ O* x' J3 W2 I根据地址信息 clean 其对应的 cache-line。7 }+ ~6 l+ _+ P/ R7 k5 k

1 O1 A# r4 \9 `$ J7 }SCB_CleanInvalidateDCache_by_Addr()
6 x; ?. G( z7 ]- o$ J. I( p根据地址信息 clean 并 invalidate 其对应的 cache-line。1 y+ t' G5 J: Q; _8 ?( C+ i

  m" h8 h$ n  d% ~% S: C
6 c3 i2 F, P: I; T9 i) a
赞 收藏 评论0 发布时间:2021-12-13 23:15

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版