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

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

[复制链接]
baiyongbin2009 发布时间:2018-11-6 01:01
本帖最后由 baiyongbin2009 于 2018-11-6 01:01 编辑
1 Y3 U( Q7 I9 Z1 \, _1 q8 j, Q" p; \
说明:
. K9 s3 Q# ?1 H9 M7 N    初学M7的Cache时,经常是ARM的手册和ST的手册看了一遍又一遍,虽然每次看,每次都有收获,但是一直无法形成系统的认识,说到某一个知识点也明白,但是具体到读写操作的时候是怎么个流程,就懵逼了,也是心里烦躁,最近脑子开窍了些,特此分享下经验。
0 e6 w3 W; T& f! @- p& q- U! }
) n' v# h  _4 g' U- a* k5 H% l" ~当前的认识能力有限,有不对的地方,欢迎批评指正。
6 j  \! W& h) y5 A' k$ b. I0 c% i9 O: Q5 q; W. u. @& v
一、引出问题:; r& ?0 _' e* A" C4 N# r7 a8 W
    当前芯片厂商出的M7内核芯片基本都做了一级Cache支持,Cache又分数据缓存D-Cache和指令缓冲I-Cache,对于指令缓冲,用户不用管,这里主要说的是数据缓存D-Cache。以STM32H7为例,主频是400MHz,除了TCM和Cache以400MHz工作,其它AXI SRAM,SRAM1,SRAM2等都是以200MHz工作。数据缓存D-Cache就是解决CPU加速访问SRAM。) ?0 k' m4 J$ D7 V' C

4 q' ]2 {1 B  L& k! @    如果每次CPU要读写SRAM区的数据,都能够在Cache里面进行,自然是最好的,实现了200MHz到400MHz的飞跃,实际是做不到的,因为数据Cache只有16KB大小,总有用完的时候。
; v5 d, P$ S8 z( e6 I; a3 t( w% \6 W9 K- |+ d4 q* t+ T' _
对于使能了Cache的SRAM区,要分读写两种情况考虑。: p9 X, ^: c" k0 i9 G: b# {
读操作:
8 T( G7 [( N5 G! _如果CPU要读取的SRAM区数据在Cache中已经加载好,这就叫读命中(Cache hit),如果Cache里面没有怎么办,这就是所谓的读Cache Miss。: P* R8 n" ]! O& m

' F* m8 F; {% ?写操作:
; [, K3 a, E$ ~1 B# M% z如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域(专业词汇叫Cache Line,以32字节为单位),这就叫写命中(Cache hit),如果Cache里面没有开辟对应的区域怎么办,这就是所谓的写Cache Miss。* j) ~: m8 A8 f
9 D9 C6 @6 E9 s3 r; i
& S) g- Q7 ^8 b3 P* a
& y" R# I$ j( M+ D1 b( E
! ^- F! u# V2 n: G& Z
二、支持的Cache配置:
; ~% D: ~6 f) z. l" w7 TCache的配置是通过MPU来设置的,通常只用到下几种方式。
- M6 V0 q1 s( n) g3 g$ h# {4 |5 M% u& N / C$ x/ H. n, \6 V9 f
4 b; Q, @) A' `- z. G
其中的TEX是用来设置Cache策略的,C是Cache,B是缓冲用来配合Cache设置的,而S是共享,用来解决多总线或者多核访问时的同步问题。MPU配置的时候,最主要的也是配置这几个参数。
1 u5 t( x7 X! q/ r' d) M6 Q
$ L7 y2 F# ?! XCache支持的策略有如下四种:
% [! C2 b7 C+ L' M( k 5 V$ ]/ {8 ]$ s& Q

& R! K+ p, K. j6 G有了这四种方式,就可以在正式进入本帖的主题,Cache的读写操作是如何工作的,下面分这四种情况做一 一介绍。
2 f/ P6 h& R; R! g$ c& Z  T9 _- f/ m- K
三、四种Cache(MPU)配置的读写操作流程说明
6 g2 o/ U. s7 c+ F+ `* r1、 Non-cacheable
. ~; N" G  e" u1 d' l) h这个最好理解,就是正常的读写操作,无Cache。
+ n# ?. p6 s8 ~& \2 n3 O0 m6 P& m) z  f( B" _$ K% z
(1)对应四种MPU配置如下:$ H% U( @; j% @
TEX = 000 C=0 B=0  S=忽略此位,强制为共享
# q6 O' |! K" w- nTEX = 000 C=0 B=1  S=忽略此位,强制为共享5 K- X5 [9 f3 O
TEX = 001 C=0 B=0  S=0
- l; ]4 ?; [+ ?7 pTEX = 001 C=0 B=0  S=1
# q4 q1 a" L: M3 j+ C9 A2 p! g$ l5 A" J8 ]6 X5 |3 A6 s
2、Write through, read allocate,no write allocate' A( |! n' ^8 r/ g! t2 Y
注意,M7内核只要开启了Cache,read allocate就是开启的。7 E, f) g& ~2 D$ Q0 {# D5 G, o, a7 h
  l( [4 o7 B4 {5 W  {' X# P
(1)使能了此配置的SRAM缓冲区写操作
! Q) v  b* f  r. J. N- B- U3 P    如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域,那么会同时写到Cache里面和SRAM里面;如果没有,就用到配置no write allocate了,意思就是CPU会直接往SRAM里面写数据,而不再需要在Cache里面开辟空间了。) l, a# w8 n, g  D' A6 j

8 l, g% G2 l- Y# x    在写Cache命中的情况下,这个方式的优点是Cache和SRAM的数据同步更新了,没有多总线访问造成的数据一致性问题。缺点也明显,Cache在写操作上无法有效发挥性能。
( H# Z% u" i/ p" \1 l* @2 x0 X! Q( ~7 P# r5 }' ]1 C, i  H+ s+ G
(2)使能了此配置的SRAM缓冲区读操作
7 H8 C8 j% I; r, k    如果CPU要读取的SRAM区数据在Cache中已经加载好,就可以直接从Cache里面读取。如果没有,就用到配置read allocate了,意思就是在Cache里面开辟区域,将SRAM区数据加载进来,后续的操作,CPU可以直接从Cache里面读取,从而时间加速。
! t$ a- W: S  U+ I+ E6 D! S7 y
9 I$ p- f9 @8 I$ ^( N: F8 r% N    安全隐患,如果Cache命中的情况下,DMA写操作也更新了SRAM区的数据,CPU直接从Cache里面读取的数据就是错误的。4 y( }0 r8 \- g( S" M3 W

6 ~. g' I, u7 k(3)对应两种MPU配置如下:$ n) c) N; W2 |! i) q: z
TEX = 000 C=1 B=0  S=1
5 N5 [* ]! y( b+ s; ?TEX = 000 C=1 B=0  S=0" v8 X* t  G- P( X! }5 n

5 N' E  g. o, I# ?% o/ u3、Write back, read allocate,no write allocate6 q  F( O# g% Z# z
注意,M7内核只要开启了Cache,read allocate就是开启的。, `7 G, A/ l8 U, B2 f' K% M9 d
/ \2 Q+ d- s- ^. ]+ N$ B- l
(1)使能了此配置的SRAM缓冲区写操作2 Q: h* A9 ~( K( ?) E
    如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域,那么会写到Cache里面,而不会立即更新SRAM;如果没有,就用到配置no write allocate了,意思就是CPU会直接往SRAM里面写数据,而不再需要在Cache里面开辟空间了。/ e6 q1 |2 M/ [5 j; I
: C7 I  s* I; A! l( z
    安全隐患,如果Cache命中的情况下,此时仅Cache更新了,而SRAM没有更新,那么DMA直接从SRAM里面读出来的就是错误的。
0 Z3 g0 ?1 ~2 Z% Q# x# e
( @2 j0 E: K& X2 ~# i; l+ q(2)使能了此配置的SRAM缓冲区读操作$ |2 Y5 G! l; a) Q4 J& X/ ~0 _+ Y3 E
   如果CPU要读取的SRAM区数据在Cache中已经加载好,就可以直接从Cache里面读取。如果没有,就用到配置read allocate了,意思就是在Cache里面开辟区域,将SRAM区数据加载进来,后续的操作,CPU可以直接从Cache里面读取,从而时间加速。
  f# D- ~3 A, L$ L+ T1 B/ D- l2 x1 J, w7 l2 w/ a
    安全隐患,如果Cache命中的情况下,DMA写操作也更新了SRAM区的数据,CPU直接从Cache里面读取的数据就是错误的。8 x7 m; g3 M2 N
. R$ U3 f1 b4 A2 `1 y) J
(3)对应两种MPU配置如下:$ d$ K* W) e8 h; `8 P3 q* w3 m
TEX = 000 C=1 B=1  S=1
5 @1 b- L# o- J2 x9 t" |6 CTEX = 000 C=1 B=1  S=0
; z# y- `; e3 B6 ~/ F3 N! Y2 z  ^
4 x# |: d' s+ Z2 L" Y3 ?2 I6 n5 W4、Write back, read allocate,write allocate7 w. ?8 Z* j- [9 }# V. p: C
注意,M7内核只要开启了Cache,read allocate就是开启的。
+ t7 M; J: K% A& J# ?5 |6 @1 h
1 H  F" I$ F5 }# i(1)使能了此配置的SRAM缓冲区写操作! ?# V- C  o  }. J
    如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域,那么会写到Cache里面,而不会立即更新SRAM;如果没有,就用到配置write allocate了,意思就是CPU写到往SRAM里面的数据,会同步在Cache里面开辟一个空间将SRAM中写入的数据加载进来,如果此时立即读此SRAM区,那么就会有很大的速度优势。
3 K* ~# w3 }# I9 _, j) i6 x5 h1 E
    安全隐患,如果Cache命中的情况下,此时仅Cache更新了,而SRAM没有更新,那么DMA直接从SRAM里面读出来的就是错误的。# C, P1 ^* ]  V3 n% \
3 j4 |: t+ o3 P6 H. n- j  e! \* f
(2)使能了此配置的SRAM缓冲区读操作# D2 A3 M2 ^0 z4 \. U: J# b1 i
    如果CPU要读取的SRAM区数据在Cache中已经加载好,就可以直接从Cache里面读取。如果没有,就用到配置read allocate了,意思就是在Cache里面开辟区域,将SRAM区数据加载进来,后续的操作,CPU可以直接从Cache里面读取,从而时间加速。
& u- x0 j- d( z, c
1 V1 `* \8 F  A' k    安全隐患,如果Cache命中的情况下,DMA写操作也更新了SRAM区的数据,CPU直接从Cache里面读取的数据就是错误的。
& n$ @/ `& \" l' [! r  I- J2 Z* N; a6 s% T1 z% ~
    这个配置被誉可以最大程度发挥Cache性能,不过具体应用仍需具体分析。3 e/ f  M0 j6 W/ d! o
( y( k" g& }" y( P; C9 n5 W8 N* C
(3)对应两种MPU配置如下:- j2 U' Q) Q7 c% l  h
TEX = 001 C=1 B=1  S=1
/ G+ S6 w+ G4 f% e) D/ JTEX = 001 C=1 B=1  S=0. G( I5 F3 n, z0 i7 _' Q4 s6 o, E

. X/ K/ X( c6 D9 P* c9 _5、共享配置是个隐形的大坑
3 \* B5 X. r$ \3 }这里以STM32H7为例进行说明,STM32H7编程手册对其的描述是多核共享。
8 w+ \3 y  u3 `' c6 P1 u0 U ! K+ V3 @1 w0 \7 r9 K

. ]' F% {6 M5 [  u! l8 f6 |而H7的应用笔记对齐的描述是开启共享基本等同于关闭Cache。* j3 V9 p6 L  ~& F; f8 }

/ n+ b, `7 h& o* \& B5 l8 Z) [
/ ?; u* u% c$ F, P实际测试下面四种开Cache的情况,开关共享对缓冲区的大批量数据的读操作影响很大,基本差出两倍,而写操作基本没有影响,也许这就是所谓的多总线同步读造成的。* n; ]2 n. v) [" X, w4 p+ Q! J
另外共享开关仅对开启了Cache的情况下有影响,而对于关闭了Cache的情况是没有影响的,开不开没关系。% x6 L, B! w9 ~& J6 I

+ B2 R7 v7 L! i% m' q* S6、总结这几种方式的几个关键知识点* }& l& E+ q& j. ?
(1)Cortex-M7内核的L1 Cache由多行内存区组成,每行有32字节,每行都配有一个地址标签。数据缓冲DCache是每4行为一组,称为4-way set associative。而指令缓冲区ICache是2行为一组,这样节省地址标签,不用每个行都标记一个地址。# [; }  x+ B0 O& v% k
4 q0 b0 y! l* h; A
(2)对于读操作,只有在第1次访问指定地址时才会加载到Cache,而写操作的话,可以直接写到内存中(write-through模式)或者放到Cache里面,后面再写入(write-back模式)。
1 b' T8 @( ~" |$ ^+ ?9 B
! D7 K% r! s, f0 i6 T6 r% L1 j8 ~7 @0 C6 @(3)如果采用的是Write back,Cache line会被标为dirty,等到此行被evicted时,才会执行实际的写操作,将Cache Line里面的数据写入到相应的存储区。2 y# [7 Q9 I/ I

) ?* A. z3 ^2 _% ]/ _' o- \3 x* Q8 {(4)Cache命中是访问的地址落在了给定的Cache Line里面,所以硬件需要做少量的地址比较工作,以检查此地址是否被缓存。如果命中了,将用于缓存读操作或者写操作。如果没有命中,则分配和标记新行,填充新的读写操作。如果所有行都分配完毕了,Cache控制器将支持eviction操作。根据Cache Line替换算法,一行将被清除Clean,无效化Invalid或者重新配置。数据缓存和指令缓存是采用的伪随机替换算法。
2 i8 a% Z9 {$ [! d# }; \5 h
7 }. P  @& M# X4 }) Z(5)Cache支持的4种基本操作,使能,禁止,清空和无效化。Clean清空操作是将Cache Line中标记为dirty的数据写入到内存里面,而无效化Invalid是将Cache Line标记为无效,即删除操作。
( g0 C7 q* I1 }. t: v0 E" B0 `7 ]0 b. s4 K

$ z8 [! F2 A8 h& b2 Y四、面对这种繁冗复杂的Cache配置,推荐方式和安全隐患解决如下(以H7为例):5 ?. ^9 U; L9 i$ x: ~2 W
(1)推荐使用128KB的TCM作为主RAM区,其它的专门用于大缓冲和DMA操作等。
) r  j* i) y1 o# Z(2)Cache问题主要是CPU和DMA都操作这个缓冲区时容易出现,使用时要注意。
- w+ r1 R' w8 ~" v7 K(3)Cache配置的选择,优先考虑的是WB,然后是WT和关闭Cache,其中WB和WT的使用中可以配合ARM提供的如下几个函数解决上面说到的隐患问题。但不是万能的,在不起作用的时候,直接暴力选择函数SCB_CleanInvlaidateDCache解决。关于这个问题,在分别配置以太网MAC的描述符缓冲区,发送缓冲区和接收缓冲区时尤其突出。
! [' n+ d4 W/ V  h
, N6 ^, R; Z- D, c& Q8 Z2 ^* b
+ ^: n: w! v1 t7 ?0 z% I2 y+ w
赞 收藏 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, [- z% ?+ |% G( h8 w' J& v
总结的很好,通俗易懂,但是中间有一段重复了

# M2 i8 c7 T; A  Q7 k5 E8 c+ L2,3,4的读是一样的
baiyongbin2009 回答时间:2018-11-7 11:25:04
zts329547875 发表于 2018-11-6 09:03
. F6 s# Q' V9 C非常不错,好好学习
* _) ?5 A- d: v8 O% B0 g
3111272 回答时间:2019-3-5 17:08:39
学习了
lwg8458 回答时间:2019-3-6 09:39:06
学习
jinling 回答时间:2022-12-15 11:05:07
您好,看不到图片,有点不好理解。能重新上传下图片吗。  e: W6 S. m7 ]0 Y. f0 v6 g, ^
' Z$ o3 g: z9 d& C" T0 ^
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版