请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 23:15
2. STM32F7 新特性——高速缓存
* e6 Q6 ~8 t( \! ]( j2.1 STM32F7 的存储系统
% U8 }8 T# P9 _$ T) _2 Y$ j2 MSTM32F7 系列微控制器作为高性能微控制器,为我们带来了很多让人眼前一亮的新特性,其中之一就是独立的指令和数据高速缓冲存储器,也就是所谓的 L1-cache,包括 I-Cache 和 D-Cache。Cache 的大小根据不同型号有所差别,有 4Kbytes、8Kbytes 和 16Kbytes 几种容量。' G+ S% R# L" i1 L1 z
/ g% r- r8 y) q) \( D
实际上,这个 Cache 是放在 Cortex 内核里面的,半导体厂商(比如 ST)购买 IP 核的时候可以选择要多大的 cache,之后这款 MCU 的 cache 就已经固定了。这有点像我们去 4S 店买车,根据自身的需求和资金情况选择不同的配置。显然,cache 的容量越大,价格也就越高。本文所使用的 STM32F769I-DISCO 包含 16Kbytes 的 I-Cache 和 D-Cache。
# J7 Q9 i6 _# y  i6 e3 b1 {4 l5 A' w/ O" T% R; q/ l  ]# D
eb0701445eb8d7c38eeb8965dd31d08e.png
, O# ?' z! \6 J9 J/ `
7 N" w$ I  O/ h% q% D1 Y
上图是 STM32F7 系列微控制器的系统架构框图,我们可以看到在 Cortex-M7 内核里面有一个 I-Cache 和一个 D-Cache,它们是实实在在的高速存储器。而 DTCM 和 ITCM 则是两个接口,对应 Data TCM 和 Instruction TCM,它们有利于数据和指令的快速读取,可实现内嵌 Flash 的零时延数据读取。但是要注意 TCM 接口是不经过缓存的!! q# B6 H: c* m

3 g& u" G- S) N' p4 D  O$ U& X上图的 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 并不包含在内。
" L) s5 l. b8 u% H3 b. {0 Q+ `! L( g8 C: P) c
这几个 SRAM 的关系,我们来看下面这个图就比较明白了。
# d; S* [2 n7 h" U0 w
  o4 B9 k6 C( \5 h* b; O; q; E
51117c3f8c93425ecb5b5402d2115060.png
0 h$ r' W, B0 S
% e3 a+ H( D5 u$ P2 A
可以看到,DTCM RAM、SRAM1 和 SRAM2 在地址映射上是连续的,比如从 0x20000000 到 0x2007FFFF。
; Y4 ]! y% l  U7 @. P# v* d" A
) Y5 o/ q7 E" A2 [我们还可以看到内嵌的 Flash 有两种接口,分别是 AXIM 和 ITCM 接口,对应于地址 0x08000000 和 0x00200000。那怎么通过不同的接口操作 Flash 呢?——只要操作对应的地址即可。
0 q% N2 Q% T/ y$ z3 S
9 Q( P# Y) Q, Q" `# ]- g, C3 R2.2 Cache 的组织! d) z" |/ p8 r) y# t* H9 m) B5 Z
在前面我们说过,绝大多数控制器的 Cache 都是采用组关联(set-associative)的映射方式,STM32F7 当然也不例外。那么,F7 的 Cache 是如何组织的呢?, J4 v. A) m3 w/ w

% F7 z' _- B* j5 _* W通过文档 AN4839,我们可以了解到:2 W2 H) r; J$ n! D$ |
2 K0 p6 n% U& X2 a' e
// 第5页
+ U6 r9 g2 j7 \% E1 b3 GA 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.
  @, D3 H% {7 y& |: \: h; |
; H7 z7 t' t4 j: H0 O2 D// 第6页
4 S( Z5 j1 [' q2 Z) o3 \# [: l/ CThe 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.4 y: D) P' N# W0 |* X' ~$ G

% z# v: [+ w+ n+ v! e也就是说,D-Cache 和 I-Cache 的块大小(cache line)为 32 bytes,采用组关联映射方式。对于 D-Cache,每组(set)包含 4 个缓冲行(line);对于 I-Cache,每组(set)包含 2 个缓冲行(line)。
8 m# |% U* n0 y1 d$ e4 k, @
. O' c. U5 Y. p# q; h以 16 KBytes 的 D-Cache 来计算,一共 512 个缓冲行(lines),128 个组(sets),每组包含 4 个 line,每个 line 包含 8 个字,也就是 32 个字节。
2 [& I( F9 V5 d2 P% g0 H: k0 {5 a$ x$ A. ^
2.3 存储器默认映射和属性1 C4 t9 Y( s5 e' L$ ]/ C+ _
STM32F7 系列微控制器的存储器的默认映射和属性如下图所示。& m& Z2 o3 N  x' [  G. b. p

4 \% ^+ M9 L" C& y, g
0598619c8a77aa253c5335c651dd7dc4.png

% Z& y8 |  N3 e8 h4 e, ]6 B
3 f# h; t/ ]0 _& b) ^# ~/ |/ u“默认”的意思就是如果没有启动 MPU,并且没有对某些特殊寄存器进行配置,那么存储器的映射地址及其属性就如上图所示。
. d; Y! |" {7 Y& W8 K% l: B' [. C% x! Z- S8 p' ]! r0 O1 T4 V. s
其中,WT 表示 Write-through(透写),WB 表示 Write-back(回写),WA 表示 Write-allocate(写分配),没有明确标注 WA 的就是 RA(读分配)。XN 的意思是 Execute-Never, 其含义为如果相应的地址空间是 XN,是绝不允许执行代码的。
& o) }4 }4 c, Z! l2 [2 q2 C! u2 y3 f+ K
存储器类型为 Normal 的才能使用 cache,并且 TCM 接口是 not cacheable 的。9 j# W& l/ W) t
) I0 j# X6 O  |; y! d" |  |% m
当然,这只是默认值,部分存储器地址映射和属性是可以通过 MPU 来配置的。; ?5 z. \* @+ d: P
* v  O7 C7 Z+ w! d3 p
选取几个有特点的区域稍微讲解一下吧:
7 J% X; f$ T1 m) o. U9 [) r: }$ _3 b  Q5 |' ~2 l' C
0x00000000~0x1FFFFFFF:flash 空间, 属性为 normal, cache 的属性为 Write-through, 即更新 cache 的同时,将数据同时写入相应的物理地址空间。- F  r# Z  B# w; l6 B; L5 A  _
* u, N: y% J: h
0x20000000~0x3FFFFFFF:SRAM 空间, 属性为 normal, cache 的属性为 write-back, 即仅更新 cache, 在合适的时候(由 cache 策略决定或者软件强制更新)将数据更新到相应的 SRAM 空间。& j$ n7 s! g4 a4 n. j7 f

- e2 Y- @) y; |& r0x40000000~0x5FFFFFFFF:芯片内部的外设空间,属性为 device,这一区域是外设寄存器所处的位置,对其读写的过程中不会经过 cache。
- @% B% g6 l  i7 z
) J$ z# \  q9 ^8 u& D7 _) K2.4 CMSIS 函数
( u( d. c: {- p1 X+ B/ c& ?2 z3 l前面说了那么多,我自己都有点晕了。。。对于用户来说,如何正确使用 Cache 才是关键!
" h: s: k9 n7 W7 @0 B1 ^7 G( X* ]- f3 k1 k7 h
下面这张图是在文档 PM0253 中截取的,Cache 相关操作的函数在 cmsis/include/core_cm7.h 头文件中声明。从函数名中可以知道,包括四种 cache 操作:enable、disable、clean 和 invalidate。
# K: a% u6 v: d' z8 q2 d& A% G& i( x5 Z% {' Q+ P6 g
c864476b5c7f0a5a537f7154eabde8e9.png
& y) S# X  [2 N" L- I. d& B

  o) }) v1 Y! n! k' Y4 K% n2 D( O3 r查看源代码发现,除了表中的8个函数,还有以下3个函数(都是以 _by_Addr 结尾):
' R/ b6 D6 \( G4 j3 u3 @5 O
% q. @3 P) h- ]
  1. void SCB_InvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
    ; ]3 [4 _7 R3 W+ [' {& k: f

  2. 1 t/ ?5 a0 G5 ^) a
  3. void SCB_CleanDCache_by_Addr(uint32_t *addr, int32_t dsize);
    9 ?; i3 I/ g1 ~" T5 w6 M

  4. " l, x3 N% M# U' U2 S# X0 b3 W8 U
  5. void SCB_CleanInvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
复制代码
; {7 F/ n3 X7 {' I3 z  o
好,那下面我们一一来了解这些函数吧。
& z1 X- p4 w8 K% \) j; c& a2 M' j& H5 {( a8 ?
SCB_EnableICache() 和 SCB_EnableDCache()
; i0 g) z' O) @# U5 u" w5 _4 k# j9 u& ]4 `0 O+ r! e
使能 I-cache 或 D-cache。( i+ c( \* z4 t: K: x( c3 ]
0 k2 `" z& R- p: b/ H5 c
SCB_DisableICache() 和 SCB_DisableDCache()9 \8 G/ O0 r- c3 }* G6 S$ Y
3 ~# w# m" _6 p4 m; V: m! \3 H
禁用 I-cache 或 D-cache。  y8 t7 p: s# m& {+ P

: k( q0 Z+ |% Q; b2 i2 C  m) g, ASCB_InvalidateICache()
' r2 M/ Z: o  m! p, x- }) H" u; ^& h0 S
使 I-cache 无效,I-cache 被 invalidate 之后,当读取指令时,会忽略相应的 cache-line 中的内容(因为被 validate 了),而从真实的物理地址中去获取相应的指令。
- m; ^5 U0 s3 O) a& U: O! e: C% X
! m3 x$ w( X9 P4 a! ~0 b# rSCB_InvalidateDCache()) ], z: U3 P) V  N5 x
使 D-cache 无效,D-cache 被 invalidate 之后,当有 Host(如 core,DMA 等)读取数据时,会忽略相应的 cache-line 中的内容( 因为被 validate 了),从真实的物理地址中去获取相应的数据。
5 b% p$ L" t8 a: Z! K/ ^' c/ ?3 F# w5 U1 `: a6 L
SCB_InvalidateDCache_by_Addr()
3 ~# f  D" P4 q" \
根据地址信息无效其对应的 cache-line。6 i/ x: z3 X7 l  [" F5 F. W2 z
4 t# u2 y+ ]% `6 H* X
SCB_CleanDCache()
% r. E$ ?1 u6 zClean 所有的 cache-line,即将 dirty 的 cache-line 全部写到 cache line 对应的真实的物理地址中所谓的 drity 属性,即写操作时, 更新了相应的 cache-line,但是没有更新到真实的物理地址,而这个 clean 的动作, 就是将 cache 中的内容更新到真实的物理地址中。: H9 v6 u  l/ {6 R9 K

* x3 O6 k2 w( [$ }( A' q; ESCB_CleanDCache_by_Addr()

) D! k* e# I/ W; F- M$ l+ [0 ]! v根据地址信息 clean 其对应的 cache-line。* R! i  b+ x9 G1 H- `
& z. l# C8 ?: n/ K0 `' R6 a
SCB_CleanInvalidateDCache_by_Addr()- |) h, R6 q0 p( f* o8 x4 i8 a
根据地址信息 clean 并 invalidate 其对应的 cache-line。0 W4 M% ]) V0 [. J

/ c1 S& `/ {/ h" H" A  U  D+ Y" v5 M, s% z
收藏 评论0 发布时间:2021-12-13 23:15

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版