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

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

[复制链接]
aimejia 发布时间:2018-5-30 11:05
本帖最后由 aimejia 于 2018-5-30 14:48 编辑
2 H% K4 E2 w: O9 o6 u8 k! H4 Y
2 e3 B& l4 O& P5 b5 R. t例说STM32F7高速缓存——Cache一致性问题(一)
) n% p5 J* _( u9 V2 B2 C5 C7 s例说STM32F7高速缓存——Cache一致性问题(二), b( r; |: p' {
例说STM32F7 高速缓存——Cache一致性问题(三)
5 c4 `$ g4 ?. u  U; z
' |* G6 Z5 u3 R5 j" F9 g2. STM32F7 新特性——高速缓存
2 D1 `# s& u7 R' b8 p* N' v& L

9 ?! a& s, y/ ]2.1 STM32F7 的存储系统 
7 x3 g; w" d  @* @. \STM32F7 系列微控制器作为高性能微控制器,为我们带来了很多让人眼前一亮的新特性,其中之一就是独立的指令和数据高速缓冲存储器,也就是所谓的 L1-cache,包括 I-Cache 和 D-Cache。Cache 的大小根据不同型号有所差别,有 4Kbytes、8Kbytes 和 16Kbytes 几种容量。
, @4 r) n) v# [2 @3 j: s! c& d! g
$ |, w. I  J. Q* }实际上,这个 Cache 是放在 Cortex 内核里面的,半导体厂商(比如 ST)购买 IP 核的时候可以选择要多大的 cache,之后这款 MCU 的 cache 就已经固定了。这有点像我们去 4S 店买车,根据自身的需求和资金情况选择不同的配置。显然,cache 的容量越大,价格也就越高。本文所使用的 STM32F769I-DISCO 包含 16Kbytes 的 I-Cache 和 D-Cache。
: D0 e$ N* q3 ]
6 r$ ?2 S# b( r
1.png

+ A% d8 S$ i$ ]3 Y5 X上图是 STM32F7 系列微控制器的系统架构框图,我们可以看到在 Cortex-M7 内核里面有一个 I-Cache 和一个 D-Cache,它们是实实在在的高速存储器。而 DTCM 和 ITCM 则是两个接口,对应 Data TCM 和 Instruction TCM,它们有利于数据和指令的快速读取,可实现内嵌 Flash 的零时延数据读取。但是要注意 TCM 接口是不经过缓存的!
3 a( P2 Y* Z9 O2 C6 o" h; K" m2 s" 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 并不包含在内。 1 m3 o0 X" j) o5 S8 S
9 y0 W1 p9 ^# Q# T- A. r$ l
这几个 SRAM 的关系,我们来看下面这个图就比较明白了。
) A3 Q( T& l+ K- v, ^, r* a* w3 e* W4 X: F/ z
2.png
) U. [' {! [  M& ~* E9 @7 j
可以看到,DTCM RAM、SRAM1 和 SRAM2 在地址映射上是连续的,比如从 0x20000000 到 0x2007FFFF。
9 F3 Q' L. i6 c9 ]: e2 b/ m$ z. h! f) V
我们还可以看到内嵌的 Flash 有两种接口,分别是 AXIM 和 ITCM 接口,对应于地址 0x08000000 和 0x00200000。那怎么通过不同的接口操作 Flash 呢?——只要操作对应的地址即可。- Y8 x% R: T7 Y0 V* ~# v

. }4 t6 [- H; |' V' P8 V3 ]2.2 Cache 的组织
* k. a. n+ Z/ z, g( l; c在《例说STM32F7高速缓存——Cache一致性问题(一)》中我们说过,绝大多数控制器的 Cache 都是采用组关联(set-associative)的映射方式,STM32F7 当然也不例外。那么,F7 的 Cache 是如何组织的呢? 7 g8 r7 f# U3 R, e

8 }1 z4 B, b' ]: h$ w" H" k* nD-Cache 和 I-Cache 的块大小(cache line)为 32 bytes,采用组关联映射方式。对于 D-Cache,每组(set)包含 4 个缓冲行(line);对于 I-Cache,每组(set)包含 2 个缓冲行(line)。 & n. F5 X; D. R' t9 v# M

7 N8 c5 X5 p8 `* A/ t  H5 W+ ?3 Y& s以 16 KBytes 的 D-Cache 来计算,一共 512 个缓冲行(lines),128 个组(sets),每组包含 4 个 line,每个 line 包含 8 个字,也就是 32 个字节。0 X! ?+ {$ |' h4 u' [

! }3 S2 _  D+ G& K8 v2.3 存储器默认映射和属性
( Z, j7 N( ?$ c* ~STM32F7 系列微控制器的存储器的默认映射和属性如下图所示。! T: K( _6 t/ g" T5 c; M

  p1 N) v# a: ?) L5 r; O% T" e' D
3.png

: n2 `* y7 A$ O" C“默认”的意思就是如果没有启动 MPU,并且没有对某些特殊寄存器进行配置,那么存储器的映射地址及其属性就如上图所示。
% r& @9 z7 c0 O7 S+ f+ [4 j& a5 P8 y! x0 k% f
其中,WT 表示 Write-through(透写),WB 表示 Write-back(回写),WA 表示 Write-allocate(写分配),没有明确标注 WA 的就是 RA(读分配)。XN 的意思是 Execute-Never, 其含义为如果相应的地址空间是 XN,是绝不允许执行代码的。 4 `: a, {: x7 j2 Y1 U* |

% d* W1 ^- C6 i' e1 z$ y存储器类型为 Normal 的才能使用 cache,并且 TCM 接口是 not cacheable 的。
1 a) }7 n  \/ O* h3 t2 x8 H
8 r: w# O' ?$ h% s+ S$ m% x+ }& w/ u/ m当然,这只是默认值,部分存储器地址映射和属性是可以通过 MPU 来配置的。 ' Y& {6 H# E* K! p; w/ R

, c, w. F5 t! _7 C选取几个有特点的区域稍微讲解一下吧: ' Z* u: k' F1 G3 K5 C9 f) r
5 N" d5 p  e1 |) T. _! N0 Y8 P
0x00000000~0x1FFFFFFF:flash 空间, 属性为 normal, cache 的属性为 Write-through, 即更新 cache 的同时,将数据同时写入相应的物理地址空间。 0 @( h# H* F7 M6 y

7 R0 h% v9 [" C" A* k0x20000000~0x3FFFFFFF:SRAM 空间, 属性为 normal, cache 的属性为 write-back, 即仅更新 cache, 在合适的时候(由 cache 策略决定或者软件强制更新)将数据更新到相应的 SRAM 空间。
4 T0 U( [$ }/ j* K
; H0 ^( R( s  f0 f0x40000000~0x5FFFFFFFF:芯片内部的外设空间,属性为 device,这一区域是外设寄存器所处的位置,对其读写的过程中不会经过 cache。( N6 F/ T* E# G% L$ ]# e# a1 `* r5 o1 G
+ E* `" ?% c! z2 J
2.4 CMSIS 函数
- l" y. z: h4 @$ {: h) a: U) {前面说了那么多,我自己都有点晕了。。。对于用户来说,如何正确使用 Cache 才是关键! 3 d: i' t; ~9 J$ o; D

; R. r; j+ {# n& c1 r下面这张图是在文档 PM0253 中截取的,Cache 相关操作的函数在 cmsis/include/core_cm7.h 头文件中声明。从函数名中可以知道,包括四种 cache 操作:enable、disable、clean 和 invalidate。7 T$ P7 A$ G9 v# z

* h% }7 {9 Z6 L' J( H
4.png

5 R9 b; w0 t6 [' ]6 P" f查看源代码发现,除了表中的8个函数,还有以下3个函数(都是以 _by_Addr 结尾):- b% a1 {$ _% z  P  z/ D
  1. void SCB_InvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
    9 F; l- ?, B3 c' v) `
  2. ' a" h. G) U0 j9 o3 Z7 ]1 l5 ^
  3. void SCB_CleanDCache_by_Addr(uint32_t *addr, int32_t dsize);
    $ S* _" j! L# i7 `# M2 n' {

  4. 4 I0 d: `6 R1 O$ C0 R1 Q" w: \
  5. void SCB_CleanInvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
复制代码
8 }) g) X+ C% G6 W& ^- Y
好,那下面我们一一来了解这些函数吧。
# z# H* U( e  K1 \9 {" [( |3 G7 Y* F
SCB_EnableICache() 和 SCB_EnableDCache()
) A6 X" I( V5 B. ~: P0 h
" |3 z" K( W! v' a# P9 Q8 \使能 I-cache 或 D-cache。, M( n- w5 t& }, ]; k( r6 o! \9 m

- q7 m# g& ]7 m) bSCB_DisableICache() 和 SCB_DisableDCache()1 q6 u0 K, U' @( H

0 e2 l1 e( Y3 }! y0 Y! E2 [; U禁用 I-cache 或 D-cache。3 [8 V& X$ n: c# f) v2 z7 P

2 w8 u/ X' f  p* j$ Q( ?& ]SCB_InvalidateICache()
4 q! T! g: [, d& E! k2 @7 a5 n1 a- n8 f2 C+ |
使 I-cache 无效,I-cache 被 invalidate 之后,当读取指令时,会忽略相应的 cache-line 中的内容(因为被 validate 了),而从真实的物理地址中去获取相应的指令。
6 M5 Z& X! @6 S0 b- q; v+ `
' o  Q4 r0 V* s1 SSCB_InvalidateDCache()
5 z* |6 p$ |' G& s7 S  p+ p% y- t+ G; \& [( h! C
使 D-cache 无效,D-cache 被 invalidate 之后,当有 Host(如 core,DMA 等)读取数据时,会忽略相应的 cache-line 中的内容( 因为被 validate 了),从真实的物理地址中去获取相应的数据。% [" a+ Z$ k- ]  G2 |

# B! [" b& i1 ^: `* N6 }SCB_InvalidateDCache_by_Addr()
. g0 g! _* F( |7 v$ x7 x, m3 {1 I
: Z# R9 f9 ~! f* R4 N: t根据地址信息无效其对应的 cache-line。
8 r0 D7 h1 g. _  \- R5 K
' v; Z. L& Q* a* mSCB_CleanDCache()
7 _' r/ Z! b" W$ p3 l3 z' w9 B$ _8 q2 W8 z2 A: N; }
Clean 所有的 cache-line,即将 dirty 的 cache-line 全部写到 cache line 对应的真实的物理地址中所谓的 drity 属性,即写操作时, 更新了相应的 cache-line,但是没有更新到真实的物理地址,而这个 clean 的动作, 就是将 cache 中的内容更新到真实的物理地址中。
9 K  N$ ^+ u. m3 o4 o! ^9 d- U  r  A( j/ j: m- d
SCB_CleanDCache_by_Addr()
0 c7 R/ ^2 J0 b; Q: h5 l9 F$ E7 F3 `# A1 L5 n( G& x/ T; k- U' j
根据地址信息 clean 其对应的 cache-line。: ~" j% F  J0 |2 t3 O

1 P. Z& ^8 l/ K' R2 r8 B# f; ]SCB_CleanInvalidateDCache_by_Addr()
4 O# v1 B/ r  _# _& a: }1 R0 |& `
根据地址信息 clean 并 invalidate 其对应的 cache-line。
* X/ B/ f- q$ ~+ w  ~2 {$ _3 R. [9 R7 X) w0 {: \" [! V5 M

- i1 I+ Y  s- ~5 X# {6 k2 i0 q. G2 \5 q8 ^4 a: j

6 G3 a  Z6 C2 S, ]9 Y: R2 |. ~0 R* d& b' a' R& a
转载自阿基米东
: Y0 k; V! \: `9 \9 V2 j7 V! r9 X3 I/ `" Y! b& B$ Z

, m4 f; @8 ?& W$ W' B
收藏 评论0 发布时间:2018-5-30 11:05

举报

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