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

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

[复制链接]
aimejia 发布时间:2018-5-30 11:05
本帖最后由 aimejia 于 2018-5-30 14:48 编辑   D% t: W. T+ H3 Q
) s) B: R' u8 `# A: K
例说STM32F7高速缓存——Cache一致性问题(一)! m- S  P- K) [" A+ |' n# G* n5 L
例说STM32F7高速缓存——Cache一致性问题(二)" A( T& P" U8 F
例说STM32F7 高速缓存——Cache一致性问题(三)  C, [+ P& c: _. D0 H( d& K
0 ?, e* R, _. O1 z3 b
2. STM32F7 新特性——高速缓存
$ s; O& n$ X( m  r1 A: n" v

1 E  L1 y& C. ]* ?5 S% _1 P$ V2.1 STM32F7 的存储系统 
9 H( r( \6 {2 MSTM32F7 系列微控制器作为高性能微控制器,为我们带来了很多让人眼前一亮的新特性,其中之一就是独立的指令和数据高速缓冲存储器,也就是所谓的 L1-cache,包括 I-Cache 和 D-Cache。Cache 的大小根据不同型号有所差别,有 4Kbytes、8Kbytes 和 16Kbytes 几种容量。
+ u7 A. x( w" T. f5 B; K- s# d4 H8 F) i0 H& C! |
实际上,这个 Cache 是放在 Cortex 内核里面的,半导体厂商(比如 ST)购买 IP 核的时候可以选择要多大的 cache,之后这款 MCU 的 cache 就已经固定了。这有点像我们去 4S 店买车,根据自身的需求和资金情况选择不同的配置。显然,cache 的容量越大,价格也就越高。本文所使用的 STM32F769I-DISCO 包含 16Kbytes 的 I-Cache 和 D-Cache。/ C3 w8 \5 `: v* N0 t  n
* ?: h  D6 i/ e( V
1.png
2 _/ q5 Z; p& K! Z# w. H7 i; R
上图是 STM32F7 系列微控制器的系统架构框图,我们可以看到在 Cortex-M7 内核里面有一个 I-Cache 和一个 D-Cache,它们是实实在在的高速存储器。而 DTCM 和 ITCM 则是两个接口,对应 Data TCM 和 Instruction TCM,它们有利于数据和指令的快速读取,可实现内嵌 Flash 的零时延数据读取。但是要注意 TCM 接口是不经过缓存的! ' `2 ~; |) ?7 ^: u% m8 H1 D

! k+ {' k/ S( }, k上图的 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 并不包含在内。 1 `3 h1 S+ G7 i' Z! L
) R& @8 p" }6 z# h  f
这几个 SRAM 的关系,我们来看下面这个图就比较明白了。- W7 J) ^( C. I; r- ^: H
4 p  x1 Y! r, X" }6 Z, r% O
2.png

2 q1 f; l8 _) q7 q可以看到,DTCM RAM、SRAM1 和 SRAM2 在地址映射上是连续的,比如从 0x20000000 到 0x2007FFFF。 $ i( k/ G5 a. M. t( S0 T2 ~

$ F+ C9 W% g+ l* [1 @1 ?( Q我们还可以看到内嵌的 Flash 有两种接口,分别是 AXIM 和 ITCM 接口,对应于地址 0x08000000 和 0x00200000。那怎么通过不同的接口操作 Flash 呢?——只要操作对应的地址即可。
% y4 Z! z0 z: O& @  s1 a; S5 ~: K3 ^9 X/ o! n+ w7 G" F
2.2 Cache 的组织* A' l# W5 i- |. u7 n
在《例说STM32F7高速缓存——Cache一致性问题(一)》中我们说过,绝大多数控制器的 Cache 都是采用组关联(set-associative)的映射方式,STM32F7 当然也不例外。那么,F7 的 Cache 是如何组织的呢?   c5 P/ F% O  b- n- E; T& Y. Z& q: ]

3 t9 R7 n6 ?0 B% J4 yD-Cache 和 I-Cache 的块大小(cache line)为 32 bytes,采用组关联映射方式。对于 D-Cache,每组(set)包含 4 个缓冲行(line);对于 I-Cache,每组(set)包含 2 个缓冲行(line)。
+ w. Q) a0 G" E: M; `, V5 i% ?; B4 X) N% j2 x# k) y. z, ^
以 16 KBytes 的 D-Cache 来计算,一共 512 个缓冲行(lines),128 个组(sets),每组包含 4 个 line,每个 line 包含 8 个字,也就是 32 个字节。
; ?% ^5 @, {1 s/ n2 v" }! ?0 Z  Y2 Z
2.3 存储器默认映射和属性
+ r) ^: {- G8 s: o, s; w' A* OSTM32F7 系列微控制器的存储器的默认映射和属性如下图所示。7 |. u/ l$ h: m0 k2 @, J! O

! E3 H( |5 d- i
3.png

- |# V" a- r0 x# f) \" w' i# @" O“默认”的意思就是如果没有启动 MPU,并且没有对某些特殊寄存器进行配置,那么存储器的映射地址及其属性就如上图所示。
5 N0 X8 a0 e' X  i9 c0 I5 \! i0 t
, ~0 J( g: R" r# n2 b& j/ m% V其中,WT 表示 Write-through(透写),WB 表示 Write-back(回写),WA 表示 Write-allocate(写分配),没有明确标注 WA 的就是 RA(读分配)。XN 的意思是 Execute-Never, 其含义为如果相应的地址空间是 XN,是绝不允许执行代码的。 ; D6 t  w; u8 J8 D; y$ H( z
  W6 C2 D2 _3 @: D4 ]( @
存储器类型为 Normal 的才能使用 cache,并且 TCM 接口是 not cacheable 的。 1 ~6 J) v9 h$ H4 }, p

- N: r0 K% s2 }! Z5 w当然,这只是默认值,部分存储器地址映射和属性是可以通过 MPU 来配置的。 . M1 W3 i1 }2 t, R
6 P0 H' J0 {2 k3 m, k0 i. e& n
选取几个有特点的区域稍微讲解一下吧: 5 n) k; b1 j- ^7 P# v( N% C, W9 ]

' D4 L; z) a4 V6 R; ]& w$ g, e) E0x00000000~0x1FFFFFFF:flash 空间, 属性为 normal, cache 的属性为 Write-through, 即更新 cache 的同时,将数据同时写入相应的物理地址空间。
% Q9 h) A8 n3 g3 P" l: U' c. x8 P
" @' `9 N) ^1 V0x20000000~0x3FFFFFFF:SRAM 空间, 属性为 normal, cache 的属性为 write-back, 即仅更新 cache, 在合适的时候(由 cache 策略决定或者软件强制更新)将数据更新到相应的 SRAM 空间。 0 F( r1 M3 P! \* C- Z
  M$ e& p& L" h7 W' n7 _0 o
0x40000000~0x5FFFFFFFF:芯片内部的外设空间,属性为 device,这一区域是外设寄存器所处的位置,对其读写的过程中不会经过 cache。3 n/ r7 J1 I- r1 E, R- f4 z
" Y$ C7 g6 \0 X( e! ~# R* P  ~  G
2.4 CMSIS 函数
) E+ ]9 Q' E& V2 n. J/ ^前面说了那么多,我自己都有点晕了。。。对于用户来说,如何正确使用 Cache 才是关键! 5 N1 u1 N3 i" m, M0 e4 e% y

0 |# K) g5 T7 }1 }3 A' n% j下面这张图是在文档 PM0253 中截取的,Cache 相关操作的函数在 cmsis/include/core_cm7.h 头文件中声明。从函数名中可以知道,包括四种 cache 操作:enable、disable、clean 和 invalidate。
5 c+ F( L7 V# V' s9 ^; f( F6 k$ H
6 o$ O  [7 y$ D6 o+ v
4.png
+ C% V& Z% C' s7 N
查看源代码发现,除了表中的8个函数,还有以下3个函数(都是以 _by_Addr 结尾):) y5 B* h7 W2 E! @
  1. void SCB_InvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
    4 Z% p, g1 \( o  a
  2. # P! m8 A/ t0 X% W! P: E' i
  3. void SCB_CleanDCache_by_Addr(uint32_t *addr, int32_t dsize);+ t6 P5 [+ ?% j/ T9 x

  4. ; @1 ?. ^' i/ |% A* g6 ^- E( n
  5. void SCB_CleanInvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
复制代码

& E' ^5 q8 L' q6 {1 u+ @好,那下面我们一一来了解这些函数吧。2 @! z& e& [, P, h( X* |

( N+ j, n0 z, K# O$ f+ `SCB_EnableICache() 和 SCB_EnableDCache()
0 i+ {! Y( O' E  y, [5 N; R2 o1 |1 U9 h, S0 F9 w2 H
使能 I-cache 或 D-cache。) \' E6 p; L/ V8 R- ^/ D1 e; O' m. [
7 [* Z3 I, ^  T( f) L/ L
SCB_DisableICache() 和 SCB_DisableDCache()
# U  k- ]) S3 V: z9 b
& @7 h  a  C% A1 `7 o禁用 I-cache 或 D-cache。* {6 ~( ]0 [9 w: t; m
+ E6 {7 J, G6 ~( j' i7 N. ^
SCB_InvalidateICache()
0 c2 U& n( Z# ?  K5 p
, ^# ?& P* J) s0 g  A4 r使 I-cache 无效,I-cache 被 invalidate 之后,当读取指令时,会忽略相应的 cache-line 中的内容(因为被 validate 了),而从真实的物理地址中去获取相应的指令。: t' h: Y* }5 h( _* K8 r9 q
# V; b3 Q& W) P) J" }, c' {  a
SCB_InvalidateDCache()1 A- d3 c. {8 |. F. ]8 |

( `: X  ^  P  S1 @使 D-cache 无效,D-cache 被 invalidate 之后,当有 Host(如 core,DMA 等)读取数据时,会忽略相应的 cache-line 中的内容( 因为被 validate 了),从真实的物理地址中去获取相应的数据。; b: f1 y) A( G
/ Q  u) Q2 _! H* e
SCB_InvalidateDCache_by_Addr()
' o- D8 i4 H2 u% }$ }- E9 b/ O- ^# {- X
根据地址信息无效其对应的 cache-line。0 G: u; X. u' ^4 u4 v3 l
4 g, j) ?9 }1 L! ^) M. T
SCB_CleanDCache()! i1 T. P: k' U: K& a0 D

$ Y# m9 C! D$ V# F* C. g+ e7 Y2 x1 P: AClean 所有的 cache-line,即将 dirty 的 cache-line 全部写到 cache line 对应的真实的物理地址中所谓的 drity 属性,即写操作时, 更新了相应的 cache-line,但是没有更新到真实的物理地址,而这个 clean 的动作, 就是将 cache 中的内容更新到真实的物理地址中。
% E# q/ T- L2 Y# |/ w  X. B$ H9 n2 V
SCB_CleanDCache_by_Addr()* h" ~+ g% n. h5 w; K7 p/ V
9 U4 a! W* ?2 v$ d* n
根据地址信息 clean 其对应的 cache-line。
' F4 D0 {7 D& F2 O, I2 J8 u2 ?
( F& l, D2 A7 aSCB_CleanInvalidateDCache_by_Addr()
6 D0 M; O! t9 @7 `2 U6 K! {$ W6 o& }) C6 j% V' g) `" Y
根据地址信息 clean 并 invalidate 其对应的 cache-line。
  J3 E2 s6 z5 W- J8 f) H/ ]5 L; r) R/ i) c) z" S

% Q* Z/ C5 U* F
; e( D5 i: O* Q
% y& q; @! B: w& a) Y7 o% X  u! |# z( }& m9 p% @/ o; V, e
转载自阿基米东+ v& w0 X4 `6 X0 B

$ B1 i; Z" ^* i( o0 l3 ^* F( G& W! X2 {$ I
收藏 评论0 发布时间:2018-5-30 11:05

举报

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