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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 23:15
2. STM32F7 新特性——高速缓存1 O5 ^1 A/ }& h( ^9 U# |: t+ u
2.1 STM32F7 的存储系统4 b6 }; h& \% B, b8 }
STM32F7 系列微控制器作为高性能微控制器,为我们带来了很多让人眼前一亮的新特性,其中之一就是独立的指令和数据高速缓冲存储器,也就是所谓的 L1-cache,包括 I-Cache 和 D-Cache。Cache 的大小根据不同型号有所差别,有 4Kbytes、8Kbytes 和 16Kbytes 几种容量。
  T3 `1 G+ {8 {; m9 p3 p+ Q
* |- ?+ F0 v9 H/ n实际上,这个 Cache 是放在 Cortex 内核里面的,半导体厂商(比如 ST)购买 IP 核的时候可以选择要多大的 cache,之后这款 MCU 的 cache 就已经固定了。这有点像我们去 4S 店买车,根据自身的需求和资金情况选择不同的配置。显然,cache 的容量越大,价格也就越高。本文所使用的 STM32F769I-DISCO 包含 16Kbytes 的 I-Cache 和 D-Cache。
2 i9 h4 h5 {5 b8 v( I/ s# o6 o( J, R- {9 q/ X* o
eb0701445eb8d7c38eeb8965dd31d08e.png

( O8 |6 Z8 r( t) a
+ y' [: u6 ]3 c. z/ m- L上图是 STM32F7 系列微控制器的系统架构框图,我们可以看到在 Cortex-M7 内核里面有一个 I-Cache 和一个 D-Cache,它们是实实在在的高速存储器。而 DTCM 和 ITCM 则是两个接口,对应 Data TCM 和 Instruction TCM,它们有利于数据和指令的快速读取,可实现内嵌 Flash 的零时延数据读取。但是要注意 TCM 接口是不经过缓存的!0 n9 U. L! H3 T: i# T: M
7 ~: w/ }/ [* w, W: `( R
上图的 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 并不包含在内。, ?" h: V3 c- ?; E/ a; ~

( r$ x* C. ^5 a* F! b* ?' c9 n) k" F# B这几个 SRAM 的关系,我们来看下面这个图就比较明白了。
& J/ w4 @! C! l2 [, g. [- b9 a
. t2 t% o$ ?2 ~8 A7 b
51117c3f8c93425ecb5b5402d2115060.png
: H( H! [( X% L- K6 b

- T2 M+ Z/ }" l' F+ b& f1 Y可以看到,DTCM RAM、SRAM1 和 SRAM2 在地址映射上是连续的,比如从 0x20000000 到 0x2007FFFF。
. _0 b2 S% ~+ \& ?7 [: R  b( O' b  G# g- i; |2 w4 E1 r3 u
我们还可以看到内嵌的 Flash 有两种接口,分别是 AXIM 和 ITCM 接口,对应于地址 0x08000000 和 0x00200000。那怎么通过不同的接口操作 Flash 呢?——只要操作对应的地址即可。8 T+ n4 d5 G1 g" s
) m8 b& |, `+ l/ t2 y; g
2.2 Cache 的组织. y$ S7 h" U: i1 [7 F
在前面我们说过,绝大多数控制器的 Cache 都是采用组关联(set-associative)的映射方式,STM32F7 当然也不例外。那么,F7 的 Cache 是如何组织的呢?6 Y- m0 M. r# p- H  Z1 d, H
+ b7 v. W( |1 a8 [0 I2 g! S
通过文档 AN4839,我们可以了解到:
" m8 N! v% E/ I: ^9 L0 C
) v3 k) L1 ~. y// 第5页3 M9 U' Y: ]0 ?+ _
A 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.
0 p+ y  e% p+ L2 h: j' m
' `1 }2 u/ c; t' r3 O  @5 [: t8 U// 第6页# e/ G2 l) Y: Q" [5 L( M. t
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.
" r; |1 J- o* f1 D9 O0 I. C) t7 W7 ]* D9 i# u  U# r; t1 N
也就是说,D-Cache 和 I-Cache 的块大小(cache line)为 32 bytes,采用组关联映射方式。对于 D-Cache,每组(set)包含 4 个缓冲行(line);对于 I-Cache,每组(set)包含 2 个缓冲行(line)。& R* u4 v& V  R

& Q# ~) M6 I8 Y/ ?& o& Z以 16 KBytes 的 D-Cache 来计算,一共 512 个缓冲行(lines),128 个组(sets),每组包含 4 个 line,每个 line 包含 8 个字,也就是 32 个字节。# t! I" z0 c! O1 d

* K+ K) `& W, M% J9 Y3 D' a3 J& v2.3 存储器默认映射和属性
, h) ]! R: F3 BSTM32F7 系列微控制器的存储器的默认映射和属性如下图所示。
! z8 h* U7 @( l5 c  j" q
2 E3 s# ~2 n6 \& G( q  b
0598619c8a77aa253c5335c651dd7dc4.png

6 I' a' e/ m* v& g2 c
* T, g- ]# v9 N“默认”的意思就是如果没有启动 MPU,并且没有对某些特殊寄存器进行配置,那么存储器的映射地址及其属性就如上图所示。/ z8 k: y! L) @2 T! _$ r! g
- O* k. M5 @7 F/ C: {4 x* ]
其中,WT 表示 Write-through(透写),WB 表示 Write-back(回写),WA 表示 Write-allocate(写分配),没有明确标注 WA 的就是 RA(读分配)。XN 的意思是 Execute-Never, 其含义为如果相应的地址空间是 XN,是绝不允许执行代码的。
1 |' C. Y' \/ P% b% y: c- z, `5 D' z* N; @8 `
存储器类型为 Normal 的才能使用 cache,并且 TCM 接口是 not cacheable 的。3 j' R: f$ e; o" X, w! @( w7 M; F9 h

3 ~+ g5 w. `$ `( b: b当然,这只是默认值,部分存储器地址映射和属性是可以通过 MPU 来配置的。2 R5 H8 D" \; l4 N

! ]. i# j  w& T- h1 o! V' ]) @选取几个有特点的区域稍微讲解一下吧:
4 _; Y2 j! Z6 g5 J0 y1 ]1 t: u- t8 O( R- s; }! O4 y- B
0x00000000~0x1FFFFFFF:flash 空间, 属性为 normal, cache 的属性为 Write-through, 即更新 cache 的同时,将数据同时写入相应的物理地址空间。- F" b3 `7 w! q8 u
1 K1 B4 `8 e# \% a2 H! ?5 k
0x20000000~0x3FFFFFFF:SRAM 空间, 属性为 normal, cache 的属性为 write-back, 即仅更新 cache, 在合适的时候(由 cache 策略决定或者软件强制更新)将数据更新到相应的 SRAM 空间。
' d, u8 b; a' a6 s, _2 ?4 D4 c) h1 B- a  p( n. ~' T
0x40000000~0x5FFFFFFFF:芯片内部的外设空间,属性为 device,这一区域是外设寄存器所处的位置,对其读写的过程中不会经过 cache。+ T6 Q& e6 ]1 ^8 K: d6 x  T

2 y1 _1 }6 P) k; `; d2.4 CMSIS 函数
% J! Y0 L: S8 X( w4 y前面说了那么多,我自己都有点晕了。。。对于用户来说,如何正确使用 Cache 才是关键!6 x6 u/ q- |2 ~! m* j" H9 h- K

4 ]+ [2 W, S: s8 r& r. c下面这张图是在文档 PM0253 中截取的,Cache 相关操作的函数在 cmsis/include/core_cm7.h 头文件中声明。从函数名中可以知道,包括四种 cache 操作:enable、disable、clean 和 invalidate。# J9 H* Y) o2 m% [  w" {
- `9 L/ ^3 `- u& k
c864476b5c7f0a5a537f7154eabde8e9.png
* H, L7 z. z$ _" [% s8 J0 h
4 J& J  {3 n  E& W4 H& W. J1 M
查看源代码发现,除了表中的8个函数,还有以下3个函数(都是以 _by_Addr 结尾):
" M0 _6 X* ?+ T4 a2 @9 l% q* r, k0 Y
6 \) K; Y9 j; [" S% `* a. W
  1. void SCB_InvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
    4 E8 I3 x. N6 X
  2. ) P5 y- W* _2 I9 U8 r" {
  3. void SCB_CleanDCache_by_Addr(uint32_t *addr, int32_t dsize);
    * ~& k( S7 x) S# @  }0 N; N8 @& g
  4. 1 e. x! E3 D) P( Q" h* X0 [
  5. void SCB_CleanInvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
复制代码
- V: r; C  T* o! _0 o  K& b" l
好,那下面我们一一来了解这些函数吧。! _* S" l8 S7 S( ?+ r. k, g
( s. _; d) K# `1 T( d& R0 `
SCB_EnableICache() 和 SCB_EnableDCache()
8 V0 `: u% z2 O8 w1 Y. I5 D: k3 R# ?- R0 w! w
使能 I-cache 或 D-cache。
4 c, @6 G8 H! E+ I
" G( I0 B" m& T: l: }SCB_DisableICache() 和 SCB_DisableDCache()3 p3 M5 F0 c- q9 p; y% b

. L% |  g- N1 v4 g9 k禁用 I-cache 或 D-cache。& ]+ k. m3 h; j9 K/ }
! Q) c3 ~, T& Z! Y
SCB_InvalidateICache()! K! [* [. Z# Z& F
# ]' q8 c8 O/ W- w# Z* o1 B$ n" B
使 I-cache 无效,I-cache 被 invalidate 之后,当读取指令时,会忽略相应的 cache-line 中的内容(因为被 validate 了),而从真实的物理地址中去获取相应的指令。$ L* E4 N2 g( s5 d; D7 U

6 V8 {6 J/ Z; a) iSCB_InvalidateDCache()
/ g; p* q; v" o6 ^. b1 X使 D-cache 无效,D-cache 被 invalidate 之后,当有 Host(如 core,DMA 等)读取数据时,会忽略相应的 cache-line 中的内容( 因为被 validate 了),从真实的物理地址中去获取相应的数据。+ A, a  z8 H2 l' ?' L3 X- y% {  c
8 ]7 D- ]$ ?- y7 R
SCB_InvalidateDCache_by_Addr()

! [/ C# ^8 S. S$ L5 i' N根据地址信息无效其对应的 cache-line。* l3 y& o7 }$ A% g8 ?. U: Y# [8 d; T4 v

8 G! f! l( i0 M) [$ p+ X8 ISCB_CleanDCache()! ]( Y3 h9 e$ e6 f" V; F
Clean 所有的 cache-line,即将 dirty 的 cache-line 全部写到 cache line 对应的真实的物理地址中所谓的 drity 属性,即写操作时, 更新了相应的 cache-line,但是没有更新到真实的物理地址,而这个 clean 的动作, 就是将 cache 中的内容更新到真实的物理地址中。
2 `& @. S" p! r% j5 z: u* K+ y; s6 i+ A+ ^6 h+ o8 v
SCB_CleanDCache_by_Addr()
% {( L! A1 q5 G+ J
根据地址信息 clean 其对应的 cache-line。9 }" Q; Q2 i( U6 i: h

+ O. @" E9 f, ]5 \" TSCB_CleanInvalidateDCache_by_Addr()
3 _9 p: W( C! U( ?/ C" Q6 ]根据地址信息 clean 并 invalidate 其对应的 cache-line。* J  Y6 W  ?8 Q. E1 n- G8 s/ K* Q+ r

4 W- C6 o7 s$ L# Z* T( I( b/ A
, o5 y1 z/ k2 M: M
收藏 评论0 发布时间:2021-12-13 23:15

举报

0个回答

所属标签

相似技术帖

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