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

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

[复制链接]
aimejia 发布时间:2018-5-30 11:05
本帖最后由 aimejia 于 2018-5-30 14:48 编辑
, M1 S& q. H6 g  a; {9 D4 c
7 J: p3 i1 E1 o( z$ D, Y例说STM32F7高速缓存——Cache一致性问题(一)
, l9 E3 Q6 w& X; Z7 I" ]" B例说STM32F7高速缓存——Cache一致性问题(二)
5 y4 S9 Q* d2 @# F4 B' x例说STM32F7 高速缓存——Cache一致性问题(三)
6 i% P; s! }! E5 H+ ~
0 B+ d% t0 @4 d2. STM32F7 新特性——高速缓存
5 h  L' A4 q( W- m

$ N$ X+ x' l- a) [2 F0 D( q2.1 STM32F7 的存储系统 
" @, z8 K1 ?6 Q% B. z3 aSTM32F7 系列微控制器作为高性能微控制器,为我们带来了很多让人眼前一亮的新特性,其中之一就是独立的指令和数据高速缓冲存储器,也就是所谓的 L1-cache,包括 I-Cache 和 D-Cache。Cache 的大小根据不同型号有所差别,有 4Kbytes、8Kbytes 和 16Kbytes 几种容量。 . I# K) z8 c( w! O8 f2 O1 k

% H, Q+ D4 U( ~9 ]* a+ D4 h实际上,这个 Cache 是放在 Cortex 内核里面的,半导体厂商(比如 ST)购买 IP 核的时候可以选择要多大的 cache,之后这款 MCU 的 cache 就已经固定了。这有点像我们去 4S 店买车,根据自身的需求和资金情况选择不同的配置。显然,cache 的容量越大,价格也就越高。本文所使用的 STM32F769I-DISCO 包含 16Kbytes 的 I-Cache 和 D-Cache。* t2 Z0 _8 {, n( E) w

0 c8 U6 \+ Y9 y, t8 _) S- ^7 A. o
1.png

7 j9 p1 U9 u5 G4 _上图是 STM32F7 系列微控制器的系统架构框图,我们可以看到在 Cortex-M7 内核里面有一个 I-Cache 和一个 D-Cache,它们是实实在在的高速存储器。而 DTCM 和 ITCM 则是两个接口,对应 Data TCM 和 Instruction TCM,它们有利于数据和指令的快速读取,可实现内嵌 Flash 的零时延数据读取。但是要注意 TCM 接口是不经过缓存的!
6 p8 \# k: v* s+ r  A) ]5 B* m4 y$ I$ g# Z
上图的 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 并不包含在内。   |& y# _( G) r3 p4 D' J: E8 `+ L
! b' l4 `, c( |9 o6 X. g
这几个 SRAM 的关系,我们来看下面这个图就比较明白了。2 f% q: X* x5 o/ t- m: o$ p+ Q8 s
! J  s% m% B0 j$ Y8 b, L
2.png

) O2 d  R$ S, v1 d0 l, [( T可以看到,DTCM RAM、SRAM1 和 SRAM2 在地址映射上是连续的,比如从 0x20000000 到 0x2007FFFF。 * U% ^8 k4 c1 i: K, D

9 m4 p6 l) g2 @我们还可以看到内嵌的 Flash 有两种接口,分别是 AXIM 和 ITCM 接口,对应于地址 0x08000000 和 0x00200000。那怎么通过不同的接口操作 Flash 呢?——只要操作对应的地址即可。
! i4 M* O3 a6 ]4 @: {
! z0 [! L1 g% T4 T2.2 Cache 的组织
; R4 Q7 B3 k$ P+ X6 _在《例说STM32F7高速缓存——Cache一致性问题(一)》中我们说过,绝大多数控制器的 Cache 都是采用组关联(set-associative)的映射方式,STM32F7 当然也不例外。那么,F7 的 Cache 是如何组织的呢? ; G) L5 s( L2 P2 C$ D) l, X! \4 Z% V

9 V5 l0 `+ [: k" ZD-Cache 和 I-Cache 的块大小(cache line)为 32 bytes,采用组关联映射方式。对于 D-Cache,每组(set)包含 4 个缓冲行(line);对于 I-Cache,每组(set)包含 2 个缓冲行(line)。 - P  p* Y# C: I" _/ o
, B* O7 T/ W0 l. q" M7 _9 R5 u+ p
以 16 KBytes 的 D-Cache 来计算,一共 512 个缓冲行(lines),128 个组(sets),每组包含 4 个 line,每个 line 包含 8 个字,也就是 32 个字节。
3 x; N* Q9 j% E1 F
7 f; R* v+ J9 E. X/ j8 [& @2.3 存储器默认映射和属性% |; s8 u6 E) v3 u5 A3 ]
STM32F7 系列微控制器的存储器的默认映射和属性如下图所示。
! @8 o+ ^. M! {; j6 f! _2 W$ |+ R: c# M- _
3.png
8 b) G' [6 T& N1 F  e0 e4 ]
“默认”的意思就是如果没有启动 MPU,并且没有对某些特殊寄存器进行配置,那么存储器的映射地址及其属性就如上图所示。 * ~# ?2 z# T5 k/ x: s

0 i5 H- O  U+ z& y" r; _3 F) L其中,WT 表示 Write-through(透写),WB 表示 Write-back(回写),WA 表示 Write-allocate(写分配),没有明确标注 WA 的就是 RA(读分配)。XN 的意思是 Execute-Never, 其含义为如果相应的地址空间是 XN,是绝不允许执行代码的。
1 a) s# Y! O) l/ a) @; f
, C. k" R6 N7 h存储器类型为 Normal 的才能使用 cache,并且 TCM 接口是 not cacheable 的。
; q6 ?  V7 P$ H( ?4 J* H
/ w9 p, G1 P7 f$ o9 @6 S& }- r当然,这只是默认值,部分存储器地址映射和属性是可以通过 MPU 来配置的。
& d0 Q. D, N$ K6 |  F1 H, \- o( K9 u) ^( O
选取几个有特点的区域稍微讲解一下吧:
  W% A" C. h& ~: B% D# q& t1 J" n; `. R2 T1 A7 V1 ^+ ?) A" C
0x00000000~0x1FFFFFFF:flash 空间, 属性为 normal, cache 的属性为 Write-through, 即更新 cache 的同时,将数据同时写入相应的物理地址空间。 . w* ^; ?! X& r; g" b5 l9 V

" X; e# b5 p. n* p# i" ?( Q! w0x20000000~0x3FFFFFFF:SRAM 空间, 属性为 normal, cache 的属性为 write-back, 即仅更新 cache, 在合适的时候(由 cache 策略决定或者软件强制更新)将数据更新到相应的 SRAM 空间。 2 L1 Z4 \  S2 O' P
4 s2 `3 U+ g+ i+ ?
0x40000000~0x5FFFFFFFF:芯片内部的外设空间,属性为 device,这一区域是外设寄存器所处的位置,对其读写的过程中不会经过 cache。
+ U# |8 W& ^5 i* C; `
7 Y$ U4 N, T# L1 o2 C0 \2.4 CMSIS 函数
7 U) Z0 d& o1 x* U; R. _+ y前面说了那么多,我自己都有点晕了。。。对于用户来说,如何正确使用 Cache 才是关键!
9 h  r8 v, o$ e$ U6 k+ r( o! V2 \3 ~& T' |3 [
下面这张图是在文档 PM0253 中截取的,Cache 相关操作的函数在 cmsis/include/core_cm7.h 头文件中声明。从函数名中可以知道,包括四种 cache 操作:enable、disable、clean 和 invalidate。  Y% L7 l9 B  g
! u! o, M( e) g8 g0 j6 ^; z! o4 S4 |0 h
4.png
  m6 t/ @1 u" T4 Q' ?
查看源代码发现,除了表中的8个函数,还有以下3个函数(都是以 _by_Addr 结尾):
+ T1 m4 |$ H1 Q  q4 G1 e4 o
  1. void SCB_InvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);+ a# l1 y- S6 O8 Q( `

  2. 1 S- y& L* Q; \/ S. o
  3. void SCB_CleanDCache_by_Addr(uint32_t *addr, int32_t dsize);
    4 ?+ _' }7 k7 ^! V& d# C6 a
  4. 3 I5 H; V/ F+ I/ ~3 o
  5. void SCB_CleanInvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
复制代码

) X' F, K$ T# F- G好,那下面我们一一来了解这些函数吧。% R! ^5 t$ B. W- r( {# ]  }

3 z7 D2 \4 r) [SCB_EnableICache() 和 SCB_EnableDCache()
$ |9 ]7 M8 s& F, U; {7 I8 l4 m5 Z" i* F
使能 I-cache 或 D-cache。! }5 Q; L1 Q2 O* O* H
& f$ _% l+ D3 K8 d
SCB_DisableICache() 和 SCB_DisableDCache()
) U4 y' ~' G3 K, C! q2 t
9 U# V0 h6 O: A3 R% V! L禁用 I-cache 或 D-cache。
+ O0 t5 @7 N- F& K2 K9 w3 y$ P/ P& x% A0 Q+ ^: i( u
SCB_InvalidateICache()( K' Z6 H' T* L3 @- e$ o
7 S- \6 i1 F$ R& _
使 I-cache 无效,I-cache 被 invalidate 之后,当读取指令时,会忽略相应的 cache-line 中的内容(因为被 validate 了),而从真实的物理地址中去获取相应的指令。. \1 p. h* L$ J8 o- [( o
! D$ t2 p  p* S9 G  M- q/ p
SCB_InvalidateDCache()
- q' m0 T& N; D2 y
1 P) o  i- ~2 j7 d3 k( c3 i使 D-cache 无效,D-cache 被 invalidate 之后,当有 Host(如 core,DMA 等)读取数据时,会忽略相应的 cache-line 中的内容( 因为被 validate 了),从真实的物理地址中去获取相应的数据。
; A7 h3 t4 i9 N: R6 Y' ~8 J0 l5 i; \0 ~  Y' `/ W
SCB_InvalidateDCache_by_Addr()* |, ]. X- u" F9 m
' N6 S4 V7 F; J- c( o) l
根据地址信息无效其对应的 cache-line。; R$ o4 u$ e$ h( c  y
- [4 U& B! O% a5 K8 ~" k( \: C
SCB_CleanDCache()/ `9 q# X6 j" H& G7 \) ]/ C) E

* W7 I# G- G5 [9 e  ~Clean 所有的 cache-line,即将 dirty 的 cache-line 全部写到 cache line 对应的真实的物理地址中所谓的 drity 属性,即写操作时, 更新了相应的 cache-line,但是没有更新到真实的物理地址,而这个 clean 的动作, 就是将 cache 中的内容更新到真实的物理地址中。; \2 x8 I/ d, Q+ T) y; b! {
* V, H1 j2 J5 U( ?$ i5 I
SCB_CleanDCache_by_Addr()" X) r* m2 c4 z/ F: h* ^% t

, P  n; U7 u( m- G  |根据地址信息 clean 其对应的 cache-line。
) ^: s" U' o! ~* q/ }
4 r- `) A# g9 ]) Q# a- w3 mSCB_CleanInvalidateDCache_by_Addr()2 ?; D) e, o4 q# h- C. b

8 D) X: W- a, ?' z9 L根据地址信息 clean 并 invalidate 其对应的 cache-line。  C6 C* c, b- U
/ Y3 ^* {, P# E# _7 {0 g
2 X1 w* z' ]! K7 u, r: ^

& U" R) T/ ?  O: Z3 u
# f5 j, @+ K7 s" J3 c9 K; t/ s& A/ l% [$ k
转载自阿基米东' f' G2 u  ?& j+ h% u
0 t9 H# P! `6 K2 W! e, h

9 q: k7 h; c9 ^1 j" _
收藏 评论0 发布时间:2018-5-30 11:05

举报

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