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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 23:15
2. STM32F7 新特性——高速缓存8 Y% f8 ^0 B- o- w4 e. K' Y
2.1 STM32F7 的存储系统4 w% ~4 G3 F9 l8 _" ~/ J1 A% h  H
STM32F7 系列微控制器作为高性能微控制器,为我们带来了很多让人眼前一亮的新特性,其中之一就是独立的指令和数据高速缓冲存储器,也就是所谓的 L1-cache,包括 I-Cache 和 D-Cache。Cache 的大小根据不同型号有所差别,有 4Kbytes、8Kbytes 和 16Kbytes 几种容量。; d$ f; G  {; H% M( M, x

$ s5 y. `* ~3 E9 E; A! e' [1 p+ ~实际上,这个 Cache 是放在 Cortex 内核里面的,半导体厂商(比如 ST)购买 IP 核的时候可以选择要多大的 cache,之后这款 MCU 的 cache 就已经固定了。这有点像我们去 4S 店买车,根据自身的需求和资金情况选择不同的配置。显然,cache 的容量越大,价格也就越高。本文所使用的 STM32F769I-DISCO 包含 16Kbytes 的 I-Cache 和 D-Cache。
  u3 s4 Q6 A7 F3 y. v
9 i6 }3 O, i4 Q
eb0701445eb8d7c38eeb8965dd31d08e.png

; r% T: G8 j2 v* R1 c6 i- S
- V8 e, m. @/ X& Y6 f7 H上图是 STM32F7 系列微控制器的系统架构框图,我们可以看到在 Cortex-M7 内核里面有一个 I-Cache 和一个 D-Cache,它们是实实在在的高速存储器。而 DTCM 和 ITCM 则是两个接口,对应 Data TCM 和 Instruction TCM,它们有利于数据和指令的快速读取,可实现内嵌 Flash 的零时延数据读取。但是要注意 TCM 接口是不经过缓存的!
3 U1 q  w. a" x) F6 f8 Y  h+ g2 t7 j: r1 G
上图的 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 D2 F, s2 |7 K( X) |
9 K+ J' {  B% ?. t
这几个 SRAM 的关系,我们来看下面这个图就比较明白了。5 e  }. W* }8 K! D/ _& Y7 \

8 R5 M4 S1 B, c* K8 H* J
51117c3f8c93425ecb5b5402d2115060.png
# s* d" O* ?+ o  [) W% r( j" d) |4 Z! J
/ y  t$ O8 g% {4 h# z: n
可以看到,DTCM RAM、SRAM1 和 SRAM2 在地址映射上是连续的,比如从 0x20000000 到 0x2007FFFF。9 F+ x* l! D$ ?  Y% b

( j( S6 o! O4 Z  u8 x* ~我们还可以看到内嵌的 Flash 有两种接口,分别是 AXIM 和 ITCM 接口,对应于地址 0x08000000 和 0x00200000。那怎么通过不同的接口操作 Flash 呢?——只要操作对应的地址即可。
/ I" C5 \$ o  J" p# i5 [  v8 c0 P$ a
2.2 Cache 的组织4 T2 x* C7 E, [; K% v
在前面我们说过,绝大多数控制器的 Cache 都是采用组关联(set-associative)的映射方式,STM32F7 当然也不例外。那么,F7 的 Cache 是如何组织的呢?! C) G7 Y; E. v4 o4 {1 j( K0 o

( a- K/ K9 X" t( K8 s通过文档 AN4839,我们可以了解到:
& \  O3 j0 D! n# l% A
( b1 c/ R0 o& }7 C( S// 第5页% r; @% Q* q4 u5 X6 M% z/ M0 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.( G; D6 a  ]" b7 T8 E
9 n5 C8 A* f- X
// 第6页1 x% S& L! L6 a3 L% R" u/ Y4 m
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.* p( f# ?1 N, _

' q- h* A* s" b6 o也就是说,D-Cache 和 I-Cache 的块大小(cache line)为 32 bytes,采用组关联映射方式。对于 D-Cache,每组(set)包含 4 个缓冲行(line);对于 I-Cache,每组(set)包含 2 个缓冲行(line)。" T3 W0 j$ I4 }0 L

- d' W+ `  X9 A/ i7 e5 I以 16 KBytes 的 D-Cache 来计算,一共 512 个缓冲行(lines),128 个组(sets),每组包含 4 个 line,每个 line 包含 8 个字,也就是 32 个字节。
  D) f8 D4 J) d+ l% }0 |' Z0 r0 x& X6 L& o1 a! h; M! n
2.3 存储器默认映射和属性
$ w0 c0 b. V  w) g' K# @3 Q% NSTM32F7 系列微控制器的存储器的默认映射和属性如下图所示。  V# x$ W3 H- t9 i% H1 s

$ H! t. Z" f  d5 C2 p$ l
0598619c8a77aa253c5335c651dd7dc4.png
. d. ]  h/ s& z9 I
7 d8 ]# s, _, d! g9 c
“默认”的意思就是如果没有启动 MPU,并且没有对某些特殊寄存器进行配置,那么存储器的映射地址及其属性就如上图所示。. N" L! H* F6 {0 `! c0 Y8 p

* l# F" x9 f: s8 b其中,WT 表示 Write-through(透写),WB 表示 Write-back(回写),WA 表示 Write-allocate(写分配),没有明确标注 WA 的就是 RA(读分配)。XN 的意思是 Execute-Never, 其含义为如果相应的地址空间是 XN,是绝不允许执行代码的。7 b6 G# W$ `: c$ l! z% {/ e! u

9 i& [3 Q% M! z3 l$ d4 m/ A' m存储器类型为 Normal 的才能使用 cache,并且 TCM 接口是 not cacheable 的。
3 ?( \. q- c! ~% G+ ?6 Z8 ~9 ?' h* f! ]5 E4 H, w8 ]- M
当然,这只是默认值,部分存储器地址映射和属性是可以通过 MPU 来配置的。
( u1 _5 N" j& L4 t5 {
  ?0 l& \$ z: A) K4 K/ [$ m选取几个有特点的区域稍微讲解一下吧:
5 R" e: D. H! ]- B9 e9 K  L3 p; D0 N) n9 u6 ]
0x00000000~0x1FFFFFFF:flash 空间, 属性为 normal, cache 的属性为 Write-through, 即更新 cache 的同时,将数据同时写入相应的物理地址空间。& @! ~! a+ d3 A" @
; [! X" A, E1 D! {; p
0x20000000~0x3FFFFFFF:SRAM 空间, 属性为 normal, cache 的属性为 write-back, 即仅更新 cache, 在合适的时候(由 cache 策略决定或者软件强制更新)将数据更新到相应的 SRAM 空间。
; E0 v+ _" h7 R( H/ }
6 P( ]4 n$ @8 U* r! e. \4 d4 r5 U. y# o- s0x40000000~0x5FFFFFFFF:芯片内部的外设空间,属性为 device,这一区域是外设寄存器所处的位置,对其读写的过程中不会经过 cache。7 e3 n/ }! n$ x2 d7 X

; [& d$ h) N* }2.4 CMSIS 函数6 n9 u  q' A. E- S$ L
前面说了那么多,我自己都有点晕了。。。对于用户来说,如何正确使用 Cache 才是关键!/ V* `0 l6 Z7 ?  t& g3 Q* F* v4 X4 |
& G: `" h1 |2 y; e
下面这张图是在文档 PM0253 中截取的,Cache 相关操作的函数在 cmsis/include/core_cm7.h 头文件中声明。从函数名中可以知道,包括四种 cache 操作:enable、disable、clean 和 invalidate。. X2 c( _2 a* g! h' h

& Z# X# O9 e" }1 ]0 s% l1 q
c864476b5c7f0a5a537f7154eabde8e9.png
! m1 f' S% ?' n( C" J# |
0 E8 K" J4 _9 D" `
查看源代码发现,除了表中的8个函数,还有以下3个函数(都是以 _by_Addr 结尾):
* z9 c/ @0 R9 {1 u7 ]0 V, S! y
0 w8 M3 Z0 T- K" ]
  1. void SCB_InvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
    6 v" p2 c, W: \6 F
  2. 2 D% l/ }1 p8 [$ j7 B0 d
  3. void SCB_CleanDCache_by_Addr(uint32_t *addr, int32_t dsize);. l' V# y0 ^* w% H" f( R1 Z! t

  4. $ f: F, d" x6 M$ y) [+ l
  5. void SCB_CleanInvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
复制代码
8 o3 [- {0 g8 j1 Y1 h+ U
好,那下面我们一一来了解这些函数吧。# s& s/ h; L1 Q) i% p" @' U) b& _

/ y: X  s) I; h  R5 x( fSCB_EnableICache() 和 SCB_EnableDCache()
& C3 E' b7 K) X2 q4 ]' ]7 T8 O7 {: ~0 g% J# I1 [9 `
使能 I-cache 或 D-cache。
( T( C) v7 f5 v# c- s' [1 q
; }  a1 d4 a3 ySCB_DisableICache() 和 SCB_DisableDCache()/ W" B: A+ g9 Q* E$ T6 _/ e2 w, n
, y: x3 X( L. h  m2 j
禁用 I-cache 或 D-cache。
# K% Y. R( p' \% f0 ~
7 u) f" v. R( F* @# |( MSCB_InvalidateICache()4 r! T+ f) H2 A' P& l

, {- ^3 D+ f3 ~" u使 I-cache 无效,I-cache 被 invalidate 之后,当读取指令时,会忽略相应的 cache-line 中的内容(因为被 validate 了),而从真实的物理地址中去获取相应的指令。
5 o- x# b/ p% i9 f3 ]* @
6 I: ?* m- u8 P5 ]' qSCB_InvalidateDCache()% U, M0 M- }! j, t5 n& w0 }, V
使 D-cache 无效,D-cache 被 invalidate 之后,当有 Host(如 core,DMA 等)读取数据时,会忽略相应的 cache-line 中的内容( 因为被 validate 了),从真实的物理地址中去获取相应的数据。
. y, t5 }. _$ U8 |  A4 P6 }7 `! X% z9 {3 _: O8 [
SCB_InvalidateDCache_by_Addr()

' |+ x5 N- @# o根据地址信息无效其对应的 cache-line。8 |$ t; K: g" c& B# _8 n0 c3 W
- F3 E2 ]8 Y0 z4 s# F
SCB_CleanDCache()! f" z/ Z! z% J3 y1 s. t
Clean 所有的 cache-line,即将 dirty 的 cache-line 全部写到 cache line 对应的真实的物理地址中所谓的 drity 属性,即写操作时, 更新了相应的 cache-line,但是没有更新到真实的物理地址,而这个 clean 的动作, 就是将 cache 中的内容更新到真实的物理地址中。2 }9 ?$ w/ g) y: G% w; T! m0 C
8 j% B! h, @, K( K# [5 ]
SCB_CleanDCache_by_Addr()

2 J& v) `9 {/ W1 ~0 b$ [根据地址信息 clean 其对应的 cache-line。& ?1 n; r* N& F! K- J. j

2 t2 q7 R& j; U: @9 cSCB_CleanInvalidateDCache_by_Addr()% h/ i( m- F* n- T) Q
根据地址信息 clean 并 invalidate 其对应的 cache-line。
5 D8 W' G1 ]+ S0 w
# N" r" n1 A" X# J$ o2 W- k1 V5 w  x
收藏 评论0 发布时间:2021-12-13 23:15

举报

0个回答

所属标签

相似技术帖

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