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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 23:15
2. STM32F7 新特性——高速缓存$ ^& h1 _3 r6 b' K
2.1 STM32F7 的存储系统
" F$ c5 {+ m3 X% I; DSTM32F7 系列微控制器作为高性能微控制器,为我们带来了很多让人眼前一亮的新特性,其中之一就是独立的指令和数据高速缓冲存储器,也就是所谓的 L1-cache,包括 I-Cache 和 D-Cache。Cache 的大小根据不同型号有所差别,有 4Kbytes、8Kbytes 和 16Kbytes 几种容量。
" X2 L/ `, \# n: d+ r. |3 n3 u9 t4 i5 Q+ i' ^: i
实际上,这个 Cache 是放在 Cortex 内核里面的,半导体厂商(比如 ST)购买 IP 核的时候可以选择要多大的 cache,之后这款 MCU 的 cache 就已经固定了。这有点像我们去 4S 店买车,根据自身的需求和资金情况选择不同的配置。显然,cache 的容量越大,价格也就越高。本文所使用的 STM32F769I-DISCO 包含 16Kbytes 的 I-Cache 和 D-Cache。
. h) G' X- G* D( D, W! _/ |- l7 w5 T; G6 w
eb0701445eb8d7c38eeb8965dd31d08e.png

) a# Y9 D; T, F9 I4 \, w
# x! Y/ A5 K- `上图是 STM32F7 系列微控制器的系统架构框图,我们可以看到在 Cortex-M7 内核里面有一个 I-Cache 和一个 D-Cache,它们是实实在在的高速存储器。而 DTCM 和 ITCM 则是两个接口,对应 Data TCM 和 Instruction TCM,它们有利于数据和指令的快速读取,可实现内嵌 Flash 的零时延数据读取。但是要注意 TCM 接口是不经过缓存的!
) c8 R1 Y2 O( G
. E  D& ~1 |4 @! R6 C- W上图的 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 并不包含在内。
, ~4 e6 A! `- `8 U  @4 s4 f
. b) j, F9 g- L7 x7 ~5 T/ v. l这几个 SRAM 的关系,我们来看下面这个图就比较明白了。
# x1 q. L4 v; h0 `# n# @. b; _9 b! I7 ?, p
51117c3f8c93425ecb5b5402d2115060.png

% \: M$ a# J; O! g
! g1 N' U. g% _/ ]- n! `1 D可以看到,DTCM RAM、SRAM1 和 SRAM2 在地址映射上是连续的,比如从 0x20000000 到 0x2007FFFF。% {4 @: N0 b7 h

4 t2 m4 @/ ^' r3 `我们还可以看到内嵌的 Flash 有两种接口,分别是 AXIM 和 ITCM 接口,对应于地址 0x08000000 和 0x00200000。那怎么通过不同的接口操作 Flash 呢?——只要操作对应的地址即可。0 v$ W) T. {5 _0 _9 [4 s% y9 B0 j6 u

9 g. b$ @. T* b# _+ }2.2 Cache 的组织6 b" k$ N, Y1 f: o- p2 R; n
在前面我们说过,绝大多数控制器的 Cache 都是采用组关联(set-associative)的映射方式,STM32F7 当然也不例外。那么,F7 的 Cache 是如何组织的呢?! p4 }& J+ J& q) s( a1 n
4 `' S7 e6 d' ~! O- H
通过文档 AN4839,我们可以了解到:" l" _$ s5 e9 N; `

" w* ~% a* B( u// 第5页
( U7 s+ |) z+ g3 SA 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.1 i$ M6 i+ _2 ^5 W) B' Y1 ?! H

0 L7 s4 b4 L1 k, m// 第6页
0 }% \: i9 R. c1 u. B' lThe 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.: K7 h( [0 n0 T; u8 h4 ]

: o$ W2 w3 b+ z/ B( w5 ?$ ~; g也就是说,D-Cache 和 I-Cache 的块大小(cache line)为 32 bytes,采用组关联映射方式。对于 D-Cache,每组(set)包含 4 个缓冲行(line);对于 I-Cache,每组(set)包含 2 个缓冲行(line)。+ M0 ^3 C7 z7 B% u3 z
" Y" y8 |: ^. r2 e& d; O% x7 ]" e
以 16 KBytes 的 D-Cache 来计算,一共 512 个缓冲行(lines),128 个组(sets),每组包含 4 个 line,每个 line 包含 8 个字,也就是 32 个字节。
1 p) w1 P5 V( f3 b9 ~( y; b. ]
* V4 G, L4 N' S5 K2.3 存储器默认映射和属性1 F& ^9 M/ [7 J2 M2 ]' Y: m
STM32F7 系列微控制器的存储器的默认映射和属性如下图所示。$ q) }' N1 ^3 E. L) w+ [# G
$ a# C/ I$ s3 q+ j! b$ c' A& d
0598619c8a77aa253c5335c651dd7dc4.png
6 ^( [+ k" x' D# g: \; v
6 s3 I1 U6 v1 A6 t! |
“默认”的意思就是如果没有启动 MPU,并且没有对某些特殊寄存器进行配置,那么存储器的映射地址及其属性就如上图所示。
* g' q9 _& l7 ?6 m/ _* g% m! P6 ]9 k; ]/ S" t
其中,WT 表示 Write-through(透写),WB 表示 Write-back(回写),WA 表示 Write-allocate(写分配),没有明确标注 WA 的就是 RA(读分配)。XN 的意思是 Execute-Never, 其含义为如果相应的地址空间是 XN,是绝不允许执行代码的。
. o: h  O, A6 H3 J, C& e; q6 {9 v: Y# |
存储器类型为 Normal 的才能使用 cache,并且 TCM 接口是 not cacheable 的。3 n# {: x) z0 Y' ^% I' l
( |; W8 H, `! [
当然,这只是默认值,部分存储器地址映射和属性是可以通过 MPU 来配置的。
3 ?5 Q: e) [& p, _3 h1 r& }" `0 r8 d1 C  M) R
选取几个有特点的区域稍微讲解一下吧:8 n; A$ z; K  R  s$ A- B; @

+ A8 T+ Z  X/ R: O7 c$ d0x00000000~0x1FFFFFFF:flash 空间, 属性为 normal, cache 的属性为 Write-through, 即更新 cache 的同时,将数据同时写入相应的物理地址空间。& X; G  k6 u0 K; V2 \
8 k% E1 X0 P& X
0x20000000~0x3FFFFFFF:SRAM 空间, 属性为 normal, cache 的属性为 write-back, 即仅更新 cache, 在合适的时候(由 cache 策略决定或者软件强制更新)将数据更新到相应的 SRAM 空间。
! O" B3 @) I9 [" w! ~0 n9 S" x2 b, Q% u* d- V
0x40000000~0x5FFFFFFFF:芯片内部的外设空间,属性为 device,这一区域是外设寄存器所处的位置,对其读写的过程中不会经过 cache。
- j; v# F  `" V' i% w5 A# }. g: {9 C! H; H: E; _9 P$ q, l+ l
2.4 CMSIS 函数4 u6 b& d* J2 z' V6 O- F
前面说了那么多,我自己都有点晕了。。。对于用户来说,如何正确使用 Cache 才是关键!/ z5 |& u8 p% ~) y: o! e3 y  S
2 E' }) {+ Z  N+ c4 k0 T" Q: {
下面这张图是在文档 PM0253 中截取的,Cache 相关操作的函数在 cmsis/include/core_cm7.h 头文件中声明。从函数名中可以知道,包括四种 cache 操作:enable、disable、clean 和 invalidate。" V6 m, C( H! X. y3 E- t. [

; e+ |/ x' A9 b
c864476b5c7f0a5a537f7154eabde8e9.png

! a) m3 J& f, H8 ^5 g9 g1 p8 [! p
7 K6 O# V; U: a查看源代码发现,除了表中的8个函数,还有以下3个函数(都是以 _by_Addr 结尾):. ~  q& s0 A- W+ O; g

7 I% T$ f$ ]' p# ^4 x3 w
  1. void SCB_InvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);6 X3 C, D3 \: M4 }5 n3 H2 q  w

  2. 8 m( X6 f2 ]3 K; R0 [
  3. void SCB_CleanDCache_by_Addr(uint32_t *addr, int32_t dsize);
    2 y$ r1 u1 Y2 ^1 _- ]: ^

  4. 2 g& l' n  }9 `; O' }( }; Y. H
  5. void SCB_CleanInvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
复制代码
6 Q+ L3 B, ~  f
好,那下面我们一一来了解这些函数吧。
# p6 n8 [1 @, ]! ~: k* q4 O' |5 I4 b: p/ j
SCB_EnableICache() 和 SCB_EnableDCache()
  d. _; w1 ]1 m. u
# i4 x+ c) s, ]2 w使能 I-cache 或 D-cache。- ]0 q& N; d1 v/ I
" Q3 s' }- l- ^  Q/ e4 z9 V/ ?
SCB_DisableICache() 和 SCB_DisableDCache()
# a% T. I8 q0 m; o( }: @; h; A$ y
禁用 I-cache 或 D-cache。1 B* B/ N2 m3 T7 F: z$ q2 |
0 T" ~& T( R& I; s* ?. ~& a
SCB_InvalidateICache()
- I' O( m  P8 M! l( g" m5 o" f( V  r8 J! H# T" G/ s! m0 }
使 I-cache 无效,I-cache 被 invalidate 之后,当读取指令时,会忽略相应的 cache-line 中的内容(因为被 validate 了),而从真实的物理地址中去获取相应的指令。
0 d9 c3 @$ g+ B7 j2 q2 t& w2 w" m8 ^, a0 |# t; L; |
SCB_InvalidateDCache()9 u8 M/ ?# R# @8 |0 r
使 D-cache 无效,D-cache 被 invalidate 之后,当有 Host(如 core,DMA 等)读取数据时,会忽略相应的 cache-line 中的内容( 因为被 validate 了),从真实的物理地址中去获取相应的数据。
7 k& z5 h3 u2 L# o9 I/ |% v5 G+ P0 o; H( p0 z0 A
SCB_InvalidateDCache_by_Addr()

$ @) |5 i) j6 c" |, n4 G& S  m/ u  Q根据地址信息无效其对应的 cache-line。
3 c! D1 r) z8 q) A1 R0 B3 ]
# I( I8 z* \/ b& u) Q+ B( xSCB_CleanDCache()
7 {/ h0 |  Q. e: zClean 所有的 cache-line,即将 dirty 的 cache-line 全部写到 cache line 对应的真实的物理地址中所谓的 drity 属性,即写操作时, 更新了相应的 cache-line,但是没有更新到真实的物理地址,而这个 clean 的动作, 就是将 cache 中的内容更新到真实的物理地址中。
$ h& `; l* ]) x! {; |6 m0 ?' A" l  p% W# G/ X& ^2 g
SCB_CleanDCache_by_Addr()

8 S9 O& n  [8 V  L根据地址信息 clean 其对应的 cache-line。
8 \$ @9 j& @( A2 N+ w! y2 _2 {2 G& j1 \' T
SCB_CleanInvalidateDCache_by_Addr()2 ~6 `6 d% t' P$ u3 h+ h1 f
根据地址信息 clean 并 invalidate 其对应的 cache-line。! E4 m* J/ M) P5 n

, k! W. A. M& T' q7 T, Z$ V8 j  b  R3 _7 W6 J
赞 收藏 评论0 发布时间:2021-12-13 23:15

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版