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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 23:15
2. STM32F7 新特性——高速缓存
; X3 @; _! I" a! s6 N; Z2.1 STM32F7 的存储系统9 i1 |" S8 g" ?) @* M
STM32F7 系列微控制器作为高性能微控制器,为我们带来了很多让人眼前一亮的新特性,其中之一就是独立的指令和数据高速缓冲存储器,也就是所谓的 L1-cache,包括 I-Cache 和 D-Cache。Cache 的大小根据不同型号有所差别,有 4Kbytes、8Kbytes 和 16Kbytes 几种容量。
, `6 c! M8 P% m' t2 v+ u  r% \1 y( C& |( E
实际上,这个 Cache 是放在 Cortex 内核里面的,半导体厂商(比如 ST)购买 IP 核的时候可以选择要多大的 cache,之后这款 MCU 的 cache 就已经固定了。这有点像我们去 4S 店买车,根据自身的需求和资金情况选择不同的配置。显然,cache 的容量越大,价格也就越高。本文所使用的 STM32F769I-DISCO 包含 16Kbytes 的 I-Cache 和 D-Cache。( @8 K- t4 f/ I
5 h: e, @( x. y3 z
eb0701445eb8d7c38eeb8965dd31d08e.png
1 v! v7 M- x7 X8 \# q  |# p
0 @4 Q5 ~+ P: h7 P& _) j2 l
上图是 STM32F7 系列微控制器的系统架构框图,我们可以看到在 Cortex-M7 内核里面有一个 I-Cache 和一个 D-Cache,它们是实实在在的高速存储器。而 DTCM 和 ITCM 则是两个接口,对应 Data TCM 和 Instruction TCM,它们有利于数据和指令的快速读取,可实现内嵌 Flash 的零时延数据读取。但是要注意 TCM 接口是不经过缓存的!5 i( D, ?; T, Q" d1 D
4 K' U1 x8 o: 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 并不包含在内。
) }; u& o7 D, e
! u& J% s6 O- z9 z& e% e这几个 SRAM 的关系,我们来看下面这个图就比较明白了。2 w$ w/ T0 x2 p8 P

8 ^0 ~/ [: R0 x  @" m" f
51117c3f8c93425ecb5b5402d2115060.png

! b9 o- {* o0 I5 S! C7 ^0 G+ N5 ^6 H' }2 |8 Z
可以看到,DTCM RAM、SRAM1 和 SRAM2 在地址映射上是连续的,比如从 0x20000000 到 0x2007FFFF。
7 ^6 D. @) V0 K$ i8 ~4 F
! w( Y9 B% }2 l4 X% O: H+ \! D我们还可以看到内嵌的 Flash 有两种接口,分别是 AXIM 和 ITCM 接口,对应于地址 0x08000000 和 0x00200000。那怎么通过不同的接口操作 Flash 呢?——只要操作对应的地址即可。2 G+ G; H. ^: ]! E

4 I1 T- a% G$ B# T/ r: p2.2 Cache 的组织1 @! `1 K# u  A  [. @' c
在前面我们说过,绝大多数控制器的 Cache 都是采用组关联(set-associative)的映射方式,STM32F7 当然也不例外。那么,F7 的 Cache 是如何组织的呢?% ~; s& K( L) U7 I5 n! h

0 j9 V* G' `$ f, a通过文档 AN4839,我们可以了解到:* _: D) j: l) O

4 l: r3 A6 e: [2 ?, B// 第5页
. \$ J4 g9 r. H" G; r: C; 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.$ q4 r' ^7 w% l% w  v/ f

% X( A" _7 {% K5 {" l: P7 u+ `// 第6页2 @" g4 u5 b4 H( e( Y& o4 e; @+ ~
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.
$ z& I; d9 p/ B3 ?& x! h# [. v* @3 f
( X& H- T& E7 t7 Z也就是说,D-Cache 和 I-Cache 的块大小(cache line)为 32 bytes,采用组关联映射方式。对于 D-Cache,每组(set)包含 4 个缓冲行(line);对于 I-Cache,每组(set)包含 2 个缓冲行(line)。$ C0 F9 m7 n" `
7 I2 p7 C+ l6 n
以 16 KBytes 的 D-Cache 来计算,一共 512 个缓冲行(lines),128 个组(sets),每组包含 4 个 line,每个 line 包含 8 个字,也就是 32 个字节。
% ]* ]' x9 \- Y$ n' `$ I3 f7 n8 U2 N) [, @) p# Z' G8 B: A
2.3 存储器默认映射和属性" C: Q: g0 x8 k4 X# K# Y
STM32F7 系列微控制器的存储器的默认映射和属性如下图所示。
3 V9 t+ B2 U. ], ]" M
. H3 r4 m0 U- o( r
0598619c8a77aa253c5335c651dd7dc4.png
6 |3 u$ B0 t! W5 L" e' E" H
9 L0 V1 i5 g% E$ c( [, A/ ?, n
“默认”的意思就是如果没有启动 MPU,并且没有对某些特殊寄存器进行配置,那么存储器的映射地址及其属性就如上图所示。
3 ?: S7 ]3 d$ U$ P* g
& H3 \" E, k/ A2 r- \; ?3 u0 v. h其中,WT 表示 Write-through(透写),WB 表示 Write-back(回写),WA 表示 Write-allocate(写分配),没有明确标注 WA 的就是 RA(读分配)。XN 的意思是 Execute-Never, 其含义为如果相应的地址空间是 XN,是绝不允许执行代码的。
. o7 A8 M& k+ Q" I
/ t2 n7 g7 {; l; ?存储器类型为 Normal 的才能使用 cache,并且 TCM 接口是 not cacheable 的。
$ H9 L" E, _$ m
( ^7 t1 g5 o" b当然,这只是默认值,部分存储器地址映射和属性是可以通过 MPU 来配置的。, a- z2 q8 _0 W* u) c
( ^( H$ c1 d/ L
选取几个有特点的区域稍微讲解一下吧:+ E4 B- v8 l/ T8 b

- R  H. m6 }: C! @0x00000000~0x1FFFFFFF:flash 空间, 属性为 normal, cache 的属性为 Write-through, 即更新 cache 的同时,将数据同时写入相应的物理地址空间。! u3 w6 Y/ D, `1 G- p7 M
4 K3 I- t* j2 ~+ F
0x20000000~0x3FFFFFFF:SRAM 空间, 属性为 normal, cache 的属性为 write-back, 即仅更新 cache, 在合适的时候(由 cache 策略决定或者软件强制更新)将数据更新到相应的 SRAM 空间。
/ ~" X$ R( m' n! S& V
% D5 X: d; b# ]9 F0x40000000~0x5FFFFFFFF:芯片内部的外设空间,属性为 device,这一区域是外设寄存器所处的位置,对其读写的过程中不会经过 cache。' r& Y' j2 f" s

( s) Y9 U- t4 L& ?; F2.4 CMSIS 函数
5 e- y" S$ @. t: _前面说了那么多,我自己都有点晕了。。。对于用户来说,如何正确使用 Cache 才是关键!
$ @2 _' V3 l6 m! Z. b* }0 i1 j& R% l& h# g/ \: [, M' L
下面这张图是在文档 PM0253 中截取的,Cache 相关操作的函数在 cmsis/include/core_cm7.h 头文件中声明。从函数名中可以知道,包括四种 cache 操作:enable、disable、clean 和 invalidate。4 Q! d3 V1 c5 E: k3 r
& k& o  |1 R* F! @
c864476b5c7f0a5a537f7154eabde8e9.png
; `: K" C% n; m( R) N# S" q. @0 F2 o

" Z" D; E' N$ {) m查看源代码发现,除了表中的8个函数,还有以下3个函数(都是以 _by_Addr 结尾):* k6 H% m$ M, o+ t1 J" }
- s4 e8 W$ R% O, [2 B5 Y
  1. void SCB_InvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);; D. S) A1 |  v/ i) c: j' i- U# [

  2. % N9 ?: u5 a; a0 y+ _4 i0 ]1 p
  3. void SCB_CleanDCache_by_Addr(uint32_t *addr, int32_t dsize);
    % _# s# D* p+ J' K
  4. 6 i, c: C, W! |9 Q- l' k( u! G2 B
  5. void SCB_CleanInvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
复制代码
* M3 v, Q/ B5 F' u4 R* m% L( l
好,那下面我们一一来了解这些函数吧。
3 g) `9 N$ F! g6 U5 ?% L4 I& U5 O8 E  }. Q% [; T
SCB_EnableICache() 和 SCB_EnableDCache()  P4 v; w2 o0 i* d5 T3 Y

; {/ b$ j1 H: G- [, _) K. I使能 I-cache 或 D-cache。  _0 d; h' g8 _" \& g0 h+ @( l
! v! e' }% ~7 S9 B1 ^
SCB_DisableICache() 和 SCB_DisableDCache()) K* p4 O7 j( M! ]4 N; x

/ b' k0 d9 W9 R, h# n8 z禁用 I-cache 或 D-cache。
% Y" l4 u. e$ l+ l$ H( U9 P  d3 P
SCB_InvalidateICache()
- m; C6 g0 x! t- t$ S6 x' q" ]( s7 i" V0 w& N
使 I-cache 无效,I-cache 被 invalidate 之后,当读取指令时,会忽略相应的 cache-line 中的内容(因为被 validate 了),而从真实的物理地址中去获取相应的指令。
' Z6 R$ c& U0 V9 _4 j7 Z! f' h( l6 r
SCB_InvalidateDCache()
2 B1 r8 [  e( u# Z/ T使 D-cache 无效,D-cache 被 invalidate 之后,当有 Host(如 core,DMA 等)读取数据时,会忽略相应的 cache-line 中的内容( 因为被 validate 了),从真实的物理地址中去获取相应的数据。
0 ^1 }( A$ }( X/ h6 z7 m: O5 C5 G: ~  Q9 x9 a% r
SCB_InvalidateDCache_by_Addr()

' b5 T% r. K0 m7 r% R9 A- q" H根据地址信息无效其对应的 cache-line。
  Q1 w3 r9 V' n" E5 S- \4 \. |; d3 f, S& p; w% e  B
SCB_CleanDCache()5 }4 v" h$ Y5 [
Clean 所有的 cache-line,即将 dirty 的 cache-line 全部写到 cache line 对应的真实的物理地址中所谓的 drity 属性,即写操作时, 更新了相应的 cache-line,但是没有更新到真实的物理地址,而这个 clean 的动作, 就是将 cache 中的内容更新到真实的物理地址中。
. A( ?: c2 \7 L/ l( S5 V: B4 |/ d: H4 w9 l8 N3 A3 J
SCB_CleanDCache_by_Addr()
2 n) L9 r) `# a3 o; Z
根据地址信息 clean 其对应的 cache-line。. H) E" `* G! `% a/ j  Y8 }( |/ Z
+ F3 G& r; t% ^) F
SCB_CleanInvalidateDCache_by_Addr()7 `& {) C" E* Y4 {( k5 n" w/ N
根据地址信息 clean 并 invalidate 其对应的 cache-line。
) S8 l; B7 Y. X- G
! B' O3 j0 V6 ]7 n! U
: b, K$ a6 r( w/ _: L/ |4 c1 s
赞 收藏 评论0 发布时间:2021-12-13 23:15

举报

0个回答

所属标签

相似技术帖

官网相关资源

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