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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 23:15
2. STM32F7 新特性——高速缓存
* D- W# L! E8 H  t2.1 STM32F7 的存储系统, Y2 m1 `1 E$ Y4 d+ ]
STM32F7 系列微控制器作为高性能微控制器,为我们带来了很多让人眼前一亮的新特性,其中之一就是独立的指令和数据高速缓冲存储器,也就是所谓的 L1-cache,包括 I-Cache 和 D-Cache。Cache 的大小根据不同型号有所差别,有 4Kbytes、8Kbytes 和 16Kbytes 几种容量。
! R% |7 k5 t9 \- g1 f  v6 Z0 ^, U* l5 ]" I
实际上,这个 Cache 是放在 Cortex 内核里面的,半导体厂商(比如 ST)购买 IP 核的时候可以选择要多大的 cache,之后这款 MCU 的 cache 就已经固定了。这有点像我们去 4S 店买车,根据自身的需求和资金情况选择不同的配置。显然,cache 的容量越大,价格也就越高。本文所使用的 STM32F769I-DISCO 包含 16Kbytes 的 I-Cache 和 D-Cache。5 b0 s% _+ }; z

3 ~2 z' ?( D$ ~) j
eb0701445eb8d7c38eeb8965dd31d08e.png
/ [3 _8 d- m; P4 l# S2 J" G; n

- d7 L* c+ S9 n9 y- u. \; f5 Y上图是 STM32F7 系列微控制器的系统架构框图,我们可以看到在 Cortex-M7 内核里面有一个 I-Cache 和一个 D-Cache,它们是实实在在的高速存储器。而 DTCM 和 ITCM 则是两个接口,对应 Data TCM 和 Instruction TCM,它们有利于数据和指令的快速读取,可实现内嵌 Flash 的零时延数据读取。但是要注意 TCM 接口是不经过缓存的!( X, d5 G0 g9 }' n* {. R4 G

+ H. S- X$ \! S7 H; y上图的 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 并不包含在内。
' u1 T0 w! F/ K9 w! v; S
1 D7 d+ E" g2 r) Q6 M9 ?这几个 SRAM 的关系,我们来看下面这个图就比较明白了。
) P; t$ J0 ^$ `' O, z- v5 u5 u, S; Q5 K2 l  [5 Y
51117c3f8c93425ecb5b5402d2115060.png
$ D1 b8 G- [5 E
' Y0 Q8 M' g2 z9 d+ p8 j
可以看到,DTCM RAM、SRAM1 和 SRAM2 在地址映射上是连续的,比如从 0x20000000 到 0x2007FFFF。
' z5 T* Y, a7 r- Z2 _$ ^' x% P$ d1 Z5 g# |2 y) F9 p" N- t1 R
我们还可以看到内嵌的 Flash 有两种接口,分别是 AXIM 和 ITCM 接口,对应于地址 0x08000000 和 0x00200000。那怎么通过不同的接口操作 Flash 呢?——只要操作对应的地址即可。
# ^, x+ @1 s: N& i3 C* a) u
8 V* i6 X; U, I! a* Y: ~6 e+ d2.2 Cache 的组织
& b; W$ Z- m6 X5 l# }在前面我们说过,绝大多数控制器的 Cache 都是采用组关联(set-associative)的映射方式,STM32F7 当然也不例外。那么,F7 的 Cache 是如何组织的呢?6 l) [5 M+ p* x  Z/ x+ `0 g+ i) u
( D( Q; @7 K( u* U0 s5 q) x& n
通过文档 AN4839,我们可以了解到:
2 M7 R6 {) W. f. D+ Y& N; b# L# G* y3 ]+ [( n1 u( j) \) g
// 第5页
/ Q* ?+ T  E' }2 jA 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.4 T0 G! J: \6 {# }

  a4 l8 T0 i1 i4 B8 h" o; E7 F// 第6页
8 n3 Y6 S! j7 H, @* k+ }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.8 i  g/ S) m* X9 M6 Z. c

3 ~4 N7 {: ~* b4 `. @也就是说,D-Cache 和 I-Cache 的块大小(cache line)为 32 bytes,采用组关联映射方式。对于 D-Cache,每组(set)包含 4 个缓冲行(line);对于 I-Cache,每组(set)包含 2 个缓冲行(line)。
4 e1 O" H+ W+ `5 l4 @: t4 l' [& {" h& I8 v( ~! j
以 16 KBytes 的 D-Cache 来计算,一共 512 个缓冲行(lines),128 个组(sets),每组包含 4 个 line,每个 line 包含 8 个字,也就是 32 个字节。' J8 H6 R6 p9 F6 u$ K( ~6 D
+ e0 l, Z  N% l( _' B
2.3 存储器默认映射和属性  c1 D# D4 y2 s! ^5 o; C+ z
STM32F7 系列微控制器的存储器的默认映射和属性如下图所示。4 h( Z) K: a  ?- n0 O$ T

/ v# |, ]2 a" q8 ^
0598619c8a77aa253c5335c651dd7dc4.png
  J  S4 [! J% W  Y: `! u6 X

: ?2 K+ J) y; h“默认”的意思就是如果没有启动 MPU,并且没有对某些特殊寄存器进行配置,那么存储器的映射地址及其属性就如上图所示。6 e# A/ X. g7 _9 S2 l/ y

/ X* g% a. y2 e# j) d7 i& H! U其中,WT 表示 Write-through(透写),WB 表示 Write-back(回写),WA 表示 Write-allocate(写分配),没有明确标注 WA 的就是 RA(读分配)。XN 的意思是 Execute-Never, 其含义为如果相应的地址空间是 XN,是绝不允许执行代码的。$ A0 O6 h5 r3 w/ |
( k, F5 U, f% Y  Z5 e* q8 C
存储器类型为 Normal 的才能使用 cache,并且 TCM 接口是 not cacheable 的。
) ]+ [; F" V, g- \% e- h
1 J" m& h: S& i5 H当然,这只是默认值,部分存储器地址映射和属性是可以通过 MPU 来配置的。$ Y8 q+ B1 P" j- {& f

4 ~+ ^! g3 q8 ?+ [! k, T选取几个有特点的区域稍微讲解一下吧:4 ^' I* s4 O% M! ?) n" z

' w$ t6 o3 m8 }- Y& F  j* L( a0x00000000~0x1FFFFFFF:flash 空间, 属性为 normal, cache 的属性为 Write-through, 即更新 cache 的同时,将数据同时写入相应的物理地址空间。
1 B4 W9 f( m8 W4 p3 {, ^3 x# [1 K: ~; r
0x20000000~0x3FFFFFFF:SRAM 空间, 属性为 normal, cache 的属性为 write-back, 即仅更新 cache, 在合适的时候(由 cache 策略决定或者软件强制更新)将数据更新到相应的 SRAM 空间。5 ]7 W: j& C# @9 a0 C# V7 K: y: {6 z

$ `7 @, R# H" i( |( p3 r3 v0x40000000~0x5FFFFFFFF:芯片内部的外设空间,属性为 device,这一区域是外设寄存器所处的位置,对其读写的过程中不会经过 cache。
8 t, ?4 W4 D/ ^1 g" F
8 w) {4 s+ L, j# y2.4 CMSIS 函数
) r. t9 }. R- F$ X; P, O前面说了那么多,我自己都有点晕了。。。对于用户来说,如何正确使用 Cache 才是关键!
6 q3 z1 U4 h4 @( u+ T5 K5 k5 t! y$ Q" R' I- Z- f
下面这张图是在文档 PM0253 中截取的,Cache 相关操作的函数在 cmsis/include/core_cm7.h 头文件中声明。从函数名中可以知道,包括四种 cache 操作:enable、disable、clean 和 invalidate。
4 n9 O* p6 [$ W
; B2 L/ ]0 t+ Z; x& [# E
c864476b5c7f0a5a537f7154eabde8e9.png
, D. B$ F/ f  }! o, T; u
; }* l3 a& [2 O, m5 e/ h
查看源代码发现,除了表中的8个函数,还有以下3个函数(都是以 _by_Addr 结尾):+ N2 M$ J( J( n% o  G! B6 G* V/ b1 Y* F3 f

$ y4 Y( q% d/ W3 c
  1. void SCB_InvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);0 @4 m& \( C9 ?  F; k7 k

  2. ( o6 d: X# ^7 a9 J5 [5 N! Z
  3. void SCB_CleanDCache_by_Addr(uint32_t *addr, int32_t dsize);3 g3 x* y' A( d
  4. + c+ P, _7 G9 K( z9 x! L5 z
  5. void SCB_CleanInvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
复制代码
; i8 i; @* i4 C) ]/ s1 D
好,那下面我们一一来了解这些函数吧。* _& ~( J: k/ `9 ?8 D% n- z6 P3 t$ G

8 U9 J1 V" C/ iSCB_EnableICache() 和 SCB_EnableDCache()7 R; `- E7 |) _0 v* P  @

* V4 j; G! r4 _& {! O" `使能 I-cache 或 D-cache。" ^1 |, n! E- m; [

! i$ i* B. N% u+ sSCB_DisableICache() 和 SCB_DisableDCache()
; n1 ?7 k7 O' K1 I- x
: C! s8 G0 o. e+ N) g1 i6 A! q禁用 I-cache 或 D-cache。+ `( y2 O1 s( P$ Z4 H/ E

+ P1 B' S- l* q5 ^SCB_InvalidateICache()% _6 E- F- M- [0 ?- q) i( B
0 U- h% ]$ b4 f6 R) H' a' p4 R9 \
使 I-cache 无效,I-cache 被 invalidate 之后,当读取指令时,会忽略相应的 cache-line 中的内容(因为被 validate 了),而从真实的物理地址中去获取相应的指令。
! d" R6 |, H! _  m8 ^' N0 {5 {4 p
; @+ }7 ?1 `  ?/ o2 I- F  x7 ESCB_InvalidateDCache()
- e4 @1 _6 U0 m6 O* p+ X使 D-cache 无效,D-cache 被 invalidate 之后,当有 Host(如 core,DMA 等)读取数据时,会忽略相应的 cache-line 中的内容( 因为被 validate 了),从真实的物理地址中去获取相应的数据。
# y# ~7 y4 `" f3 L
( v  P/ g7 `0 T6 x" d. T8 I5 X8 Z% JSCB_InvalidateDCache_by_Addr()

6 ?# q3 o& N) b0 ]根据地址信息无效其对应的 cache-line。" J, Q# L7 }1 G, Y: J: F
1 ?' H1 X) s) K1 R. f
SCB_CleanDCache()' H* b8 C' F- s
Clean 所有的 cache-line,即将 dirty 的 cache-line 全部写到 cache line 对应的真实的物理地址中所谓的 drity 属性,即写操作时, 更新了相应的 cache-line,但是没有更新到真实的物理地址,而这个 clean 的动作, 就是将 cache 中的内容更新到真实的物理地址中。
6 j' M9 B! {+ H8 [4 m& Q
4 k) W3 k$ i" B7 ^SCB_CleanDCache_by_Addr()

2 O  \9 t: m+ V( k根据地址信息 clean 其对应的 cache-line。
& [: n7 V. \1 n  ^$ }0 O
1 o" j' R& q/ GSCB_CleanInvalidateDCache_by_Addr()
& \' S1 U$ w8 I. p4 \- g9 l. J/ Y& g根据地址信息 clean 并 invalidate 其对应的 cache-line。, k, F$ O" D' g/ `6 V

- e& C# n) }6 Z, |9 S4 P2 t' p
2 o1 ~* S. G: X1 ?' W4 P6 j! i
收藏 评论0 发布时间:2021-12-13 23:15

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版