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

言简意赅介绍M7内核Cache工作流程, 摸爬滚打半年的经验总结

[复制链接]
baiyongbin2009 发布时间:2018-11-6 01:01
本帖最后由 baiyongbin2009 于 2018-11-6 01:01 编辑
. q* n# u' F! n; }" j. J0 G/ p4 k* T7 k% n
说明:! D7 @) B: P; @$ g$ K9 M# O
    初学M7的Cache时,经常是ARM的手册和ST的手册看了一遍又一遍,虽然每次看,每次都有收获,但是一直无法形成系统的认识,说到某一个知识点也明白,但是具体到读写操作的时候是怎么个流程,就懵逼了,也是心里烦躁,最近脑子开窍了些,特此分享下经验。
* |1 y% m7 V4 t! l1 K, A
/ _: L  R; `8 l当前的认识能力有限,有不对的地方,欢迎批评指正。
/ Z) x3 Y& m1 `# U# q/ p' z5 V2 Q
一、引出问题:  ?8 u% m; `- P7 V% q0 v5 a% ~
    当前芯片厂商出的M7内核芯片基本都做了一级Cache支持,Cache又分数据缓存D-Cache和指令缓冲I-Cache,对于指令缓冲,用户不用管,这里主要说的是数据缓存D-Cache。以STM32H7为例,主频是400MHz,除了TCM和Cache以400MHz工作,其它AXI SRAM,SRAM1,SRAM2等都是以200MHz工作。数据缓存D-Cache就是解决CPU加速访问SRAM。
: b( y) Q6 r! A5 }/ l: P3 O* X# Q9 ]+ {3 f
    如果每次CPU要读写SRAM区的数据,都能够在Cache里面进行,自然是最好的,实现了200MHz到400MHz的飞跃,实际是做不到的,因为数据Cache只有16KB大小,总有用完的时候。
* o, C: W% I; Z
' D- e9 T9 k3 [) g) ~3 }# F! P( v对于使能了Cache的SRAM区,要分读写两种情况考虑。4 T* S7 H% g. X  f: `  y" x2 u
读操作:$ m6 Y) |( E2 B3 S' x
如果CPU要读取的SRAM区数据在Cache中已经加载好,这就叫读命中(Cache hit),如果Cache里面没有怎么办,这就是所谓的读Cache Miss。# F5 r6 ?7 @  H) y5 Z, J' [, m& K
# c& {- U) m" t5 g+ x
写操作:8 _) B  n( Y0 A3 W% r9 j7 A/ L6 X
如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域(专业词汇叫Cache Line,以32字节为单位),这就叫写命中(Cache hit),如果Cache里面没有开辟对应的区域怎么办,这就是所谓的写Cache Miss。6 X  v9 M. |/ K, l! [8 P
1 B4 y7 a! Z( A
8 |" D5 r! T; D

& ?* p( q! L8 @6 J, q# Y7 i5 V
9 }+ e$ d8 @7 s+ U1 @: d- |) ]二、支持的Cache配置:
. ]5 [0 T" f% \! s7 kCache的配置是通过MPU来设置的,通常只用到下几种方式。
  O- L' V( B# Q. O2 r * G% H; S, |+ M/ A' M8 G
% F& M/ @; k8 c5 Z( q. \0 P- V
其中的TEX是用来设置Cache策略的,C是Cache,B是缓冲用来配合Cache设置的,而S是共享,用来解决多总线或者多核访问时的同步问题。MPU配置的时候,最主要的也是配置这几个参数。( [- t1 E) H" w$ A, B

3 j# T! m- L1 zCache支持的策略有如下四种:0 [5 X5 `' J4 C- C
9 v+ S2 x% v$ F( u) h% x

& S: `* f; F4 `; A% ?' }有了这四种方式,就可以在正式进入本帖的主题,Cache的读写操作是如何工作的,下面分这四种情况做一 一介绍。
5 G  Y5 A! e  ]7 T% Y, q9 g$ P$ S4 X. F
三、四种Cache(MPU)配置的读写操作流程说明- c+ }! o: V6 T. K. Q! {* d6 W% l
1、 Non-cacheable
4 h* N9 _: T& M& ]这个最好理解,就是正常的读写操作,无Cache。. r* u9 c% k4 Y- f; {7 U# D
# f# l$ c% q9 A5 b# t- a# ~& X
(1)对应四种MPU配置如下:6 h5 Q0 L7 L& J, t
TEX = 000 C=0 B=0  S=忽略此位,强制为共享5 {  R5 l- X" h. J' ^) X0 ~
TEX = 000 C=0 B=1  S=忽略此位,强制为共享. s( O6 Y1 T/ l- f" v, q8 s
TEX = 001 C=0 B=0  S=0
9 g' Z/ o& e4 j1 I9 F/ A  qTEX = 001 C=0 B=0  S=1! l5 e2 i' e9 a0 F  m! D

0 v2 f" k; Q0 l' o7 v2、Write through, read allocate,no write allocate) }& C4 ~7 `# D, i8 \
注意,M7内核只要开启了Cache,read allocate就是开启的。
/ f* q2 w8 L" ]; [* r$ L. }- \) I5 y! U0 b" c* W8 A4 x3 a& R
(1)使能了此配置的SRAM缓冲区写操作2 v  x& M- E1 h( S
    如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域,那么会同时写到Cache里面和SRAM里面;如果没有,就用到配置no write allocate了,意思就是CPU会直接往SRAM里面写数据,而不再需要在Cache里面开辟空间了。, r, L# U" K; B% U( U. r
6 l; ^! |" g) u% b
    在写Cache命中的情况下,这个方式的优点是Cache和SRAM的数据同步更新了,没有多总线访问造成的数据一致性问题。缺点也明显,Cache在写操作上无法有效发挥性能。
  N6 [1 Z0 V0 O* W* r* P5 r1 J2 L/ V1 B5 [2 @9 a1 G% ?4 J
(2)使能了此配置的SRAM缓冲区读操作0 W: |4 h% A  u& v3 U
    如果CPU要读取的SRAM区数据在Cache中已经加载好,就可以直接从Cache里面读取。如果没有,就用到配置read allocate了,意思就是在Cache里面开辟区域,将SRAM区数据加载进来,后续的操作,CPU可以直接从Cache里面读取,从而时间加速。8 h/ m  A1 @" ?+ ~- c! G9 ]9 S
$ v# b7 y- g9 P+ u- n/ T' Z
    安全隐患,如果Cache命中的情况下,DMA写操作也更新了SRAM区的数据,CPU直接从Cache里面读取的数据就是错误的。) f8 X  T  d! u, b( K+ c$ a
& f4 A. t0 B* G! N* N  O
(3)对应两种MPU配置如下:( q5 B, W/ A- K5 p. E! H
TEX = 000 C=1 B=0  S=1" Y; }3 _/ K% o, z5 w
TEX = 000 C=1 B=0  S=0
; w- E& x$ H$ v4 X  E, ^; B) r$ K$ [
/ ?' P6 Z, p7 I  R3、Write back, read allocate,no write allocate# {# s5 h# R$ q. I3 ^- L
注意,M7内核只要开启了Cache,read allocate就是开启的。
$ l$ D& `, e+ X) P% R5 b1 N, I# _; p: \
(1)使能了此配置的SRAM缓冲区写操作
8 {- |. k4 m; Z    如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域,那么会写到Cache里面,而不会立即更新SRAM;如果没有,就用到配置no write allocate了,意思就是CPU会直接往SRAM里面写数据,而不再需要在Cache里面开辟空间了。
: @0 H: G/ A  `
5 b3 u( f& E6 C4 G& G/ g# O    安全隐患,如果Cache命中的情况下,此时仅Cache更新了,而SRAM没有更新,那么DMA直接从SRAM里面读出来的就是错误的。
9 M9 ]  y6 ]# I) B8 p1 T% C  I' t4 j; f6 \9 N0 I
(2)使能了此配置的SRAM缓冲区读操作
! a, ]7 G. l% J4 h! A1 r" b8 \: K   如果CPU要读取的SRAM区数据在Cache中已经加载好,就可以直接从Cache里面读取。如果没有,就用到配置read allocate了,意思就是在Cache里面开辟区域,将SRAM区数据加载进来,后续的操作,CPU可以直接从Cache里面读取,从而时间加速。+ w: H5 d" H9 Z$ v5 C3 b
* O, e. E# x1 w1 d. u* U
    安全隐患,如果Cache命中的情况下,DMA写操作也更新了SRAM区的数据,CPU直接从Cache里面读取的数据就是错误的。5 M+ E% C. L- n' Z) d0 @* u% v! g
: {7 Y" v: ~. N- L
(3)对应两种MPU配置如下:
! k% c, l: {( A- \  i6 t3 bTEX = 000 C=1 B=1  S=18 L* ^8 R" O/ e5 C6 k5 P$ f
TEX = 000 C=1 B=1  S=0% D& k* v, d0 K& ^5 P4 ]

7 K* a) b7 ~5 i: A/ E% l7 |4、Write back, read allocate,write allocate
7 a1 n+ z" r; v9 y. E注意,M7内核只要开启了Cache,read allocate就是开启的。
: u! ~# u) O# k* [  p
/ D6 a- J+ J  E, u# S( E/ a- d& N(1)使能了此配置的SRAM缓冲区写操作9 v6 L3 `+ e4 i% D7 d, {% E
    如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域,那么会写到Cache里面,而不会立即更新SRAM;如果没有,就用到配置write allocate了,意思就是CPU写到往SRAM里面的数据,会同步在Cache里面开辟一个空间将SRAM中写入的数据加载进来,如果此时立即读此SRAM区,那么就会有很大的速度优势。
, }: o5 Z4 Y# v" N5 @: s3 W6 p7 W& W" h% ?4 ?8 U! O. |
    安全隐患,如果Cache命中的情况下,此时仅Cache更新了,而SRAM没有更新,那么DMA直接从SRAM里面读出来的就是错误的。9 `$ L, f5 E# g( q, T# L* z- ^
5 Y3 r0 Y' O1 ^4 {6 U  h( i( O
(2)使能了此配置的SRAM缓冲区读操作( I$ L! ]# t3 X/ w% j" l; ]: u
    如果CPU要读取的SRAM区数据在Cache中已经加载好,就可以直接从Cache里面读取。如果没有,就用到配置read allocate了,意思就是在Cache里面开辟区域,将SRAM区数据加载进来,后续的操作,CPU可以直接从Cache里面读取,从而时间加速。. e- g, O$ m- }; g
  w* A( ?' d" W4 J0 W" \+ ]7 c5 a
    安全隐患,如果Cache命中的情况下,DMA写操作也更新了SRAM区的数据,CPU直接从Cache里面读取的数据就是错误的。
6 R( l6 c, S1 \+ f" W
+ S" D7 V1 @! ]0 H& r9 O    这个配置被誉可以最大程度发挥Cache性能,不过具体应用仍需具体分析。
. u+ w( n9 }% E+ \) N, W5 G9 }8 }, R1 U
(3)对应两种MPU配置如下:
; o" Z; B. f3 P& ^+ b  `2 d" H* OTEX = 001 C=1 B=1  S=1
1 i4 O# G! M) ]TEX = 001 C=1 B=1  S=0
7 p% Y# r# {  m% n
+ X9 s& B7 V+ |* v  F5、共享配置是个隐形的大坑  P- R) D* ?% B
这里以STM32H7为例进行说明,STM32H7编程手册对其的描述是多核共享。
- R0 V- E2 k& E5 |8 b* p) X
8 ?/ z/ j  S- C5 N3 e7 J# {; s, Q) o2 l5 h* g  R# J6 P1 w8 A: Z3 f  l
而H7的应用笔记对齐的描述是开启共享基本等同于关闭Cache。/ g- p7 x' M. e# S" }' o2 I
3 `5 f3 N( |& v1 V% ?

! T2 b8 F1 r$ J( W$ x4 W实际测试下面四种开Cache的情况,开关共享对缓冲区的大批量数据的读操作影响很大,基本差出两倍,而写操作基本没有影响,也许这就是所谓的多总线同步读造成的。% {& r" f' N* K0 b& ?8 Y9 B
另外共享开关仅对开启了Cache的情况下有影响,而对于关闭了Cache的情况是没有影响的,开不开没关系。
* i2 U# ^1 x, j0 E
5 p* ?2 s6 c# l$ o6 N* C1 x) ?6、总结这几种方式的几个关键知识点
  p, u5 ?1 P3 J+ }( X(1)Cortex-M7内核的L1 Cache由多行内存区组成,每行有32字节,每行都配有一个地址标签。数据缓冲DCache是每4行为一组,称为4-way set associative。而指令缓冲区ICache是2行为一组,这样节省地址标签,不用每个行都标记一个地址。
3 S+ Q. I: Q! D: A4 U0 z
$ ]( r: y9 U  _, O: o(2)对于读操作,只有在第1次访问指定地址时才会加载到Cache,而写操作的话,可以直接写到内存中(write-through模式)或者放到Cache里面,后面再写入(write-back模式)。2 Z  Y! ]* L* ~
/ h$ e+ I6 _/ Y: Q1 ]( q& s: {
(3)如果采用的是Write back,Cache line会被标为dirty,等到此行被evicted时,才会执行实际的写操作,将Cache Line里面的数据写入到相应的存储区。% \5 a1 ?8 y$ C3 ?& Z$ H
' C8 P* j: a/ f# c/ V
(4)Cache命中是访问的地址落在了给定的Cache Line里面,所以硬件需要做少量的地址比较工作,以检查此地址是否被缓存。如果命中了,将用于缓存读操作或者写操作。如果没有命中,则分配和标记新行,填充新的读写操作。如果所有行都分配完毕了,Cache控制器将支持eviction操作。根据Cache Line替换算法,一行将被清除Clean,无效化Invalid或者重新配置。数据缓存和指令缓存是采用的伪随机替换算法。* p. @' p9 U; A9 v0 \+ D

# t) }! t' k6 K(5)Cache支持的4种基本操作,使能,禁止,清空和无效化。Clean清空操作是将Cache Line中标记为dirty的数据写入到内存里面,而无效化Invalid是将Cache Line标记为无效,即删除操作。  e* @3 v2 u7 x/ s- R6 P4 f

* i6 h$ G( y7 b1 ~- h6 ^. @- x8 Q$ P* K5 N
四、面对这种繁冗复杂的Cache配置,推荐方式和安全隐患解决如下(以H7为例):" p2 w( T! o8 Z  H: I
(1)推荐使用128KB的TCM作为主RAM区,其它的专门用于大缓冲和DMA操作等。
. L' b7 S0 N) L(2)Cache问题主要是CPU和DMA都操作这个缓冲区时容易出现,使用时要注意。
7 S. t$ l1 N3 }(3)Cache配置的选择,优先考虑的是WB,然后是WT和关闭Cache,其中WB和WT的使用中可以配合ARM提供的如下几个函数解决上面说到的隐患问题。但不是万能的,在不起作用的时候,直接暴力选择函数SCB_CleanInvlaidateDCache解决。关于这个问题,在分别配置以太网MAC的描述符缓冲区,发送缓冲区和接收缓冲区时尤其突出。$ ]3 Z. @/ Q5 W/ R8 [3 `( t
' F' y& X: u- }- ]+ d$ p: p

1 S' H$ U7 M; y( p, y$ @0 Z& Z4 h
赞 收藏 6 评论8 发布时间:2018-11-6 01:01

举报

8个回答
myccl 回答时间:2018-11-6 08:55:28
总结的很好,通俗易懂,但是中间有一段重复了
西点钟灵毓秀 回答时间:2018-11-6 09:03:16
非常不错,好好学习
baobo 回答时间:2018-11-6 09:52:25
好资料,学习了,谢谢。
baiyongbin2009 回答时间:2018-11-6 11:48:51
myccl 发表于 2018-11-6 08:55! [  C  x1 R' s- U7 X7 z% G* W
总结的很好,通俗易懂,但是中间有一段重复了

& R; j' ]8 R9 `5 @; n: J! _2,3,4的读是一样的
baiyongbin2009 回答时间:2018-11-7 11:25:04
zts329547875 发表于 2018-11-6 09:03
9 V3 w* X" H6 T2 W4 Q非常不错,好好学习

, F7 b, s: I. a2 Y, A5 x
3111272 回答时间:2019-3-5 17:08:39
学习了
lwg8458 回答时间:2019-3-6 09:39:06
学习
jinling 回答时间:2022-12-15 11:05:07
您好,看不到图片,有点不好理解。能重新上传下图片吗。8 j4 u) W* G$ M. |

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