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

例说STM32F7高速缓存——Cache一致性问题(二)

[复制链接]
aimejia 发布时间:2018-5-30 11:05
本帖最后由 aimejia 于 2018-5-30 14:48 编辑
$ _3 ~5 }- h  N# m- D- W7 h- D0 Q6 ^" A5 Y7 ~% w/ Q; }4 ~
例说STM32F7高速缓存——Cache一致性问题(一)4 T! U, v2 [% T* x4 a
例说STM32F7高速缓存——Cache一致性问题(二)' J* T; s$ B7 ?2 {4 _
例说STM32F7 高速缓存——Cache一致性问题(三)+ l: N+ p# D) S- d

9 y. Y$ H2 i8 A  u2. STM32F7 新特性——高速缓存
* D* p7 t  w$ d8 D

% l: I; ~& ]) L+ V2.1 STM32F7 的存储系统 
% y- B8 m9 H. M1 }STM32F7 系列微控制器作为高性能微控制器,为我们带来了很多让人眼前一亮的新特性,其中之一就是独立的指令和数据高速缓冲存储器,也就是所谓的 L1-cache,包括 I-Cache 和 D-Cache。Cache 的大小根据不同型号有所差别,有 4Kbytes、8Kbytes 和 16Kbytes 几种容量。
, u2 k; I+ [" D0 f+ ?" y4 K+ r' n7 l6 {' `# O
实际上,这个 Cache 是放在 Cortex 内核里面的,半导体厂商(比如 ST)购买 IP 核的时候可以选择要多大的 cache,之后这款 MCU 的 cache 就已经固定了。这有点像我们去 4S 店买车,根据自身的需求和资金情况选择不同的配置。显然,cache 的容量越大,价格也就越高。本文所使用的 STM32F769I-DISCO 包含 16Kbytes 的 I-Cache 和 D-Cache。8 i8 g9 B: B' _8 W/ j
9 i8 x' J: Z  V0 d! x( r2 T6 T) R
1.png

1 X& g/ T  }8 L2 `上图是 STM32F7 系列微控制器的系统架构框图,我们可以看到在 Cortex-M7 内核里面有一个 I-Cache 和一个 D-Cache,它们是实实在在的高速存储器。而 DTCM 和 ITCM 则是两个接口,对应 Data TCM 和 Instruction TCM,它们有利于数据和指令的快速读取,可实现内嵌 Flash 的零时延数据读取。但是要注意 TCM 接口是不经过缓存的! * t! J% N) |9 x( K) s

9 O8 [4 u9 r' i7 U" V1 p8 o上图的 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 并不包含在内。 2 A- C' q+ Y- X0 e, J/ ]& g

* g3 \) x* F3 v( Q. w这几个 SRAM 的关系,我们来看下面这个图就比较明白了。
. g# {% r* [4 u" C: p# `
& h' R5 K& H6 R7 T' e5 Q% d/ }" h
2.png

- O0 p) o0 p: s/ |( L9 q2 _可以看到,DTCM RAM、SRAM1 和 SRAM2 在地址映射上是连续的,比如从 0x20000000 到 0x2007FFFF。
/ [( O7 e0 k4 E5 T
  V$ Q6 I8 d( ^+ Q, v# w$ B我们还可以看到内嵌的 Flash 有两种接口,分别是 AXIM 和 ITCM 接口,对应于地址 0x08000000 和 0x00200000。那怎么通过不同的接口操作 Flash 呢?——只要操作对应的地址即可。
9 X1 G( m" S, @! `( q( k( b0 e, w* B0 ^& h$ G, l1 `
2.2 Cache 的组织
8 N& h3 e- P& ]: M% ]在《例说STM32F7高速缓存——Cache一致性问题(一)》中我们说过,绝大多数控制器的 Cache 都是采用组关联(set-associative)的映射方式,STM32F7 当然也不例外。那么,F7 的 Cache 是如何组织的呢?
* o8 O) s$ s5 |9 f/ u" m, v( u9 t2 ^
D-Cache 和 I-Cache 的块大小(cache line)为 32 bytes,采用组关联映射方式。对于 D-Cache,每组(set)包含 4 个缓冲行(line);对于 I-Cache,每组(set)包含 2 个缓冲行(line)。
' i8 @+ c+ I3 n  U8 \# ~' y4 K" Z7 ?
以 16 KBytes 的 D-Cache 来计算,一共 512 个缓冲行(lines),128 个组(sets),每组包含 4 个 line,每个 line 包含 8 个字,也就是 32 个字节。" k- w: n, p) a
! f/ K5 e, n$ c: p5 Z
2.3 存储器默认映射和属性- J9 Z: P: x/ n0 M( t
STM32F7 系列微控制器的存储器的默认映射和属性如下图所示。
! R, @1 x8 m& B6 |7 \5 z
8 x' U  \  }+ f  j$ P* _1 c6 I
3.png
2 q& R* T, u( ?2 m( i
“默认”的意思就是如果没有启动 MPU,并且没有对某些特殊寄存器进行配置,那么存储器的映射地址及其属性就如上图所示。
  b( e3 ^3 @: N" H: {" a$ e* k3 k" O, [2 E! ?
其中,WT 表示 Write-through(透写),WB 表示 Write-back(回写),WA 表示 Write-allocate(写分配),没有明确标注 WA 的就是 RA(读分配)。XN 的意思是 Execute-Never, 其含义为如果相应的地址空间是 XN,是绝不允许执行代码的。 . x- X* I) b! z. ]- Q# [

7 h# K- ?4 M- r8 |# o2 H存储器类型为 Normal 的才能使用 cache,并且 TCM 接口是 not cacheable 的。
% s$ q3 U0 H+ h& l8 S+ J4 D* c& |* {
当然,这只是默认值,部分存储器地址映射和属性是可以通过 MPU 来配置的。 % J# F6 e9 A4 W' K8 U) l
+ J( H& z7 ~& q& S
选取几个有特点的区域稍微讲解一下吧: , k3 D/ x5 N. J  G5 S  f2 m

" u2 q, \2 Q- m6 `& Y0x00000000~0x1FFFFFFF:flash 空间, 属性为 normal, cache 的属性为 Write-through, 即更新 cache 的同时,将数据同时写入相应的物理地址空间。
7 S- U/ E: u: P5 L4 y: `  `" b& e" R2 r! J/ F: B; G
0x20000000~0x3FFFFFFF:SRAM 空间, 属性为 normal, cache 的属性为 write-back, 即仅更新 cache, 在合适的时候(由 cache 策略决定或者软件强制更新)将数据更新到相应的 SRAM 空间。
7 D9 t# w2 K  o4 I5 `9 E
9 c. y! x; @: C& p$ F/ T0x40000000~0x5FFFFFFFF:芯片内部的外设空间,属性为 device,这一区域是外设寄存器所处的位置,对其读写的过程中不会经过 cache。9 b8 W% i+ \9 Q' f2 ^

* f- F) p8 L* w' v, y2.4 CMSIS 函数7 T" M- h. m  q3 p
前面说了那么多,我自己都有点晕了。。。对于用户来说,如何正确使用 Cache 才是关键! + N7 T; [/ [5 a

& V, w6 M" D. x9 }0 e下面这张图是在文档 PM0253 中截取的,Cache 相关操作的函数在 cmsis/include/core_cm7.h 头文件中声明。从函数名中可以知道,包括四种 cache 操作:enable、disable、clean 和 invalidate。( |" l7 G. J- |" j; r/ S6 G
/ q0 n% \. U3 {2 S: I+ w" _1 n; [; Y2 r
4.png
: o2 _1 c! P5 J- |
查看源代码发现,除了表中的8个函数,还有以下3个函数(都是以 _by_Addr 结尾):
) |$ O4 S& N, d5 c. L0 ?
  1. void SCB_InvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);# t0 \8 b( k+ Q' g8 |4 n
  2. 0 o8 V) ?& A, f. y) i& b! D  ^
  3. void SCB_CleanDCache_by_Addr(uint32_t *addr, int32_t dsize);& @! e% z' g7 n! L. c% J7 A

  4. 7 x, z) e/ p* D! r4 ^
  5. void SCB_CleanInvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
复制代码

' J# K% K* G+ t! ?好,那下面我们一一来了解这些函数吧。% n5 p: v+ K' K( S5 _* C2 l. f  L
, l; z4 J( U5 c, `: i' @. v
SCB_EnableICache() 和 SCB_EnableDCache()' K, E3 Z1 M) `; ~5 t8 |) o( V9 q
  R, _# `8 s5 ^9 V% ]$ U: a* ?
使能 I-cache 或 D-cache。; @" ~' O  z9 W
# H' e1 k" K5 z* s0 I9 _
SCB_DisableICache() 和 SCB_DisableDCache()
% I/ h% B! f1 x/ \# x: @3 p( E7 t$ q7 @+ \9 _' O& Y
禁用 I-cache 或 D-cache。9 z3 l, x. T, a4 W$ g  t. `# \

: s2 a9 V: P( K/ Z0 ^SCB_InvalidateICache()! p3 J0 K: V' y( y

5 o9 g, }0 u/ K- p" ^  _使 I-cache 无效,I-cache 被 invalidate 之后,当读取指令时,会忽略相应的 cache-line 中的内容(因为被 validate 了),而从真实的物理地址中去获取相应的指令。. e& g5 m) }. \- y) A% q
8 V0 h& C/ }$ _. a; F9 K! f) ?
SCB_InvalidateDCache()
. y" u! C9 g9 ]
1 H: y3 e7 l' t  L7 q  L& I使 D-cache 无效,D-cache 被 invalidate 之后,当有 Host(如 core,DMA 等)读取数据时,会忽略相应的 cache-line 中的内容( 因为被 validate 了),从真实的物理地址中去获取相应的数据。1 T4 g* s7 r, t8 n* s( m) m

5 |  u# }- ^( W/ z# S+ U4 f& QSCB_InvalidateDCache_by_Addr()2 Y: D  m& {8 ?2 U
3 {: L) ?  l* K8 w; C/ T- c! J
根据地址信息无效其对应的 cache-line。
, L# h9 s# T( Z9 k$ }; j6 a: x5 S5 J( X( p
SCB_CleanDCache()5 h% c2 C4 ?2 r1 A2 l; Q2 o1 ]
0 h& ^- \: C, T/ }  \  X1 t3 W
Clean 所有的 cache-line,即将 dirty 的 cache-line 全部写到 cache line 对应的真实的物理地址中所谓的 drity 属性,即写操作时, 更新了相应的 cache-line,但是没有更新到真实的物理地址,而这个 clean 的动作, 就是将 cache 中的内容更新到真实的物理地址中。
* t" G$ m6 n. L5 o
5 s3 b+ {9 v* [! V' c' s/ \SCB_CleanDCache_by_Addr()9 p& I  c: @/ D/ o0 K- b1 {
/ w: @0 X9 w5 _# Q
根据地址信息 clean 其对应的 cache-line。
* @* Y& p4 t6 l! R$ E% P4 X5 D6 k+ F$ ?
SCB_CleanInvalidateDCache_by_Addr()
+ ^* w+ m2 ]2 x1 C$ u) g5 x4 f- Y3 k# p" K
根据地址信息 clean 并 invalidate 其对应的 cache-line。$ z3 c1 o! V/ ~2 O6 m. Y3 n

6 |0 @' d, ~) I7 `7 m& W: Y
, z  J5 _7 F# m8 j5 @# v6 E- c9 N. C3 J2 M

3 r- f' h( d4 t9 C& `9 @- s7 m0 S4 F
转载自阿基米东
6 |3 \* p7 q6 d0 Q( S7 v: G' p. f

; |) h( |6 B% O( `; h+ U6 `
收藏 评论0 发布时间:2018-5-30 11:05

举报

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