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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 23:15
2. STM32F7 新特性——高速缓存
0 C# _2 `; t7 v1 @% A$ P  |9 J7 r2.1 STM32F7 的存储系统) H4 [- W% P" e/ B% C$ L
STM32F7 系列微控制器作为高性能微控制器,为我们带来了很多让人眼前一亮的新特性,其中之一就是独立的指令和数据高速缓冲存储器,也就是所谓的 L1-cache,包括 I-Cache 和 D-Cache。Cache 的大小根据不同型号有所差别,有 4Kbytes、8Kbytes 和 16Kbytes 几种容量。7 T! Q- H' s8 n0 x4 D
0 Z. T, D7 f2 `
实际上,这个 Cache 是放在 Cortex 内核里面的,半导体厂商(比如 ST)购买 IP 核的时候可以选择要多大的 cache,之后这款 MCU 的 cache 就已经固定了。这有点像我们去 4S 店买车,根据自身的需求和资金情况选择不同的配置。显然,cache 的容量越大,价格也就越高。本文所使用的 STM32F769I-DISCO 包含 16Kbytes 的 I-Cache 和 D-Cache。" q, q  N1 G* t; X1 }3 Z

, k4 c; _( H6 P$ ^  x$ U
eb0701445eb8d7c38eeb8965dd31d08e.png

6 e  r* h# {/ m: q3 P7 v3 W; V. \# ]/ w3 m* D2 x# V- i
上图是 STM32F7 系列微控制器的系统架构框图,我们可以看到在 Cortex-M7 内核里面有一个 I-Cache 和一个 D-Cache,它们是实实在在的高速存储器。而 DTCM 和 ITCM 则是两个接口,对应 Data TCM 和 Instruction TCM,它们有利于数据和指令的快速读取,可实现内嵌 Flash 的零时延数据读取。但是要注意 TCM 接口是不经过缓存的!; x" R- N" b. P8 L4 t1 F) W
0 z- Q) @) R6 Q0 u% v) @6 V+ C
上图的 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 并不包含在内。9 L# u; l; y! f; ^+ N# p. A9 W$ k9 _) M$ n

( F+ P3 L3 Y+ Y. U% N这几个 SRAM 的关系,我们来看下面这个图就比较明白了。
) J* O' H& Y- W; M) W6 Q: T! m7 @- ^
; p0 E/ R; `' H
51117c3f8c93425ecb5b5402d2115060.png

8 u$ f0 e, x. G: {+ I
: ^. L$ b* U* U+ q. k; M可以看到,DTCM RAM、SRAM1 和 SRAM2 在地址映射上是连续的,比如从 0x20000000 到 0x2007FFFF。
# E0 t) {3 r) _/ m" J, l- c( Y/ P" l) \; I$ N  _& U# L! t/ b
我们还可以看到内嵌的 Flash 有两种接口,分别是 AXIM 和 ITCM 接口,对应于地址 0x08000000 和 0x00200000。那怎么通过不同的接口操作 Flash 呢?——只要操作对应的地址即可。
; F2 c) J  P* @- j* x0 U1 |3 b4 b4 N7 L' G- E- ~2 ]% j8 H
2.2 Cache 的组织& p5 {' I3 f! p5 Y
在前面我们说过,绝大多数控制器的 Cache 都是采用组关联(set-associative)的映射方式,STM32F7 当然也不例外。那么,F7 的 Cache 是如何组织的呢?
1 B7 Z4 `. h/ z% d
' V( a8 T' [& v. e5 T通过文档 AN4839,我们可以了解到:
: ~/ ^2 T1 }% p7 N- C& @. m. [; M/ S% M( w% I
// 第5页
) t1 X! V8 @$ b' f! MA 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.; o3 i+ a1 u) z8 P

' |1 I# p; R" p6 |1 T) o7 f8 t, l// 第6页
* T  V! x( C3 f, ]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.9 M2 j9 I' d8 O
( e1 v) @- ^" {$ ]6 n8 [3 {
也就是说,D-Cache 和 I-Cache 的块大小(cache line)为 32 bytes,采用组关联映射方式。对于 D-Cache,每组(set)包含 4 个缓冲行(line);对于 I-Cache,每组(set)包含 2 个缓冲行(line)。
" e- Z7 `( \7 h7 K* ^3 S0 Z0 s) K. |* J/ y! Y# e- ^
以 16 KBytes 的 D-Cache 来计算,一共 512 个缓冲行(lines),128 个组(sets),每组包含 4 个 line,每个 line 包含 8 个字,也就是 32 个字节。" y) z1 B- W  w0 V% f

4 }4 v# T! D+ T3 v7 X3 w; ~/ k' ?2.3 存储器默认映射和属性, n- O" F5 x0 r7 N, B0 \
STM32F7 系列微控制器的存储器的默认映射和属性如下图所示。
0 N4 Y+ W6 |. W% ^1 s) Y+ R2 B8 m. x0 [; r7 z0 `
0598619c8a77aa253c5335c651dd7dc4.png

5 f( D/ e$ ^# ?* ~1 x" ~! u. ~2 G1 Z( C) }
“默认”的意思就是如果没有启动 MPU,并且没有对某些特殊寄存器进行配置,那么存储器的映射地址及其属性就如上图所示。/ S3 l# J) o( u) E
6 `& @! Q9 T- Q
其中,WT 表示 Write-through(透写),WB 表示 Write-back(回写),WA 表示 Write-allocate(写分配),没有明确标注 WA 的就是 RA(读分配)。XN 的意思是 Execute-Never, 其含义为如果相应的地址空间是 XN,是绝不允许执行代码的。
% X  e5 H- x! C& E  D5 [! S9 A) A0 O' Z" ^. j4 s0 s, W) D
存储器类型为 Normal 的才能使用 cache,并且 TCM 接口是 not cacheable 的。+ R0 _) c, Z( T  @; M! p

: ?; l' F5 h: [当然,这只是默认值,部分存储器地址映射和属性是可以通过 MPU 来配置的。
6 ?6 p9 A5 ]8 ^: F- }
2 W$ x9 k' s1 o& S) O" X3 F选取几个有特点的区域稍微讲解一下吧:
2 P/ V  X& _- f5 g1 n2 A  u  D5 o9 c) s) s! E
0x00000000~0x1FFFFFFF:flash 空间, 属性为 normal, cache 的属性为 Write-through, 即更新 cache 的同时,将数据同时写入相应的物理地址空间。# V; g) y! r- l8 J
+ b+ K( V" C  K: ?$ E
0x20000000~0x3FFFFFFF:SRAM 空间, 属性为 normal, cache 的属性为 write-back, 即仅更新 cache, 在合适的时候(由 cache 策略决定或者软件强制更新)将数据更新到相应的 SRAM 空间。
# B, P: E+ W: [4 S
' U# t: t+ f* w! ~# c* G0x40000000~0x5FFFFFFFF:芯片内部的外设空间,属性为 device,这一区域是外设寄存器所处的位置,对其读写的过程中不会经过 cache。( v3 B- P" ~# k2 V1 M
7 M' b6 G; [5 F1 M3 `
2.4 CMSIS 函数9 R6 V6 r& j7 {
前面说了那么多,我自己都有点晕了。。。对于用户来说,如何正确使用 Cache 才是关键!  ?- g0 {2 t. Z
7 ^- d/ Q. R9 D" Z
下面这张图是在文档 PM0253 中截取的,Cache 相关操作的函数在 cmsis/include/core_cm7.h 头文件中声明。从函数名中可以知道,包括四种 cache 操作:enable、disable、clean 和 invalidate。
% ^4 c# P% D1 {, o7 o! i" |+ d# M
" C& \/ G; n7 A8 i
c864476b5c7f0a5a537f7154eabde8e9.png
0 s  {9 {. Y; |

3 `4 P+ ~& R8 V" i查看源代码发现,除了表中的8个函数,还有以下3个函数(都是以 _by_Addr 结尾):
0 v8 W! G5 h. W/ E6 R$ v, V" R
  P( W- R$ v# m/ ]* Z/ B1 i
  1. void SCB_InvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);! a7 A* w6 K# O7 H/ A7 V

  2. ' _+ W, x6 K) w* W" K; g
  3. void SCB_CleanDCache_by_Addr(uint32_t *addr, int32_t dsize);2 Q2 f: F# C0 B3 b6 G

  4. - `, n: d6 s. G: \1 P& [
  5. void SCB_CleanInvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
复制代码
$ w/ F. d7 z7 A$ v
好,那下面我们一一来了解这些函数吧。; b' s4 C0 ~* i1 Y$ c

" B/ ^5 ?- C. P& N! z, W, _SCB_EnableICache() 和 SCB_EnableDCache(): d: Y- ?8 ~6 o, T, j# B

6 K, b1 S0 S' z* V, Z6 T3 z) x使能 I-cache 或 D-cache。% i* p: X* ?5 A

7 P; d7 W- M+ T, A0 E) XSCB_DisableICache() 和 SCB_DisableDCache()
) z$ a1 f5 R; v6 c/ B1 Q
: l3 e: \) N' p禁用 I-cache 或 D-cache。
- O6 D7 p% u; {2 _
& b! T8 H  d+ T7 I6 c3 ^) mSCB_InvalidateICache(), R0 n. v4 l  v, m

- i! a3 q6 ?8 D$ \使 I-cache 无效,I-cache 被 invalidate 之后,当读取指令时,会忽略相应的 cache-line 中的内容(因为被 validate 了),而从真实的物理地址中去获取相应的指令。
1 S3 \5 {/ ?  N
( K' ]) Z" [% l1 `9 d* m& @SCB_InvalidateDCache()
8 I6 Q  q# M9 s9 }3 q* W5 ~6 T$ o! B使 D-cache 无效,D-cache 被 invalidate 之后,当有 Host(如 core,DMA 等)读取数据时,会忽略相应的 cache-line 中的内容( 因为被 validate 了),从真实的物理地址中去获取相应的数据。. }, M* p/ i- Q5 E# j9 E
1 u/ T' U, _* v4 m
SCB_InvalidateDCache_by_Addr()
2 x/ A, t& z. N3 F  M+ r
根据地址信息无效其对应的 cache-line。! [4 \+ ^: D- S, `: C$ E' V

- u1 m7 S9 o; a5 z- Z0 PSCB_CleanDCache()3 V# Q0 B! b1 |4 ?) z
Clean 所有的 cache-line,即将 dirty 的 cache-line 全部写到 cache line 对应的真实的物理地址中所谓的 drity 属性,即写操作时, 更新了相应的 cache-line,但是没有更新到真实的物理地址,而这个 clean 的动作, 就是将 cache 中的内容更新到真实的物理地址中。, C$ l6 l& s) c. Q/ v& I" p: e
! f% m$ G, H. E- d- d
SCB_CleanDCache_by_Addr()
* x- p1 ?- A$ l" q, e
根据地址信息 clean 其对应的 cache-line。
8 g1 v; w2 l5 Z5 C2 J! w( w6 u( t
SCB_CleanInvalidateDCache_by_Addr()
& L3 q: g/ d7 z8 v根据地址信息 clean 并 invalidate 其对应的 cache-line。
' b% b) {1 r8 Q* ^% @# A: R0 @3 G/ k; m6 [- @

# |' |6 y: r1 a5 {) H* Z' e8 d  U
收藏 评论0 发布时间:2021-12-13 23:15

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版