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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 23:15
2. STM32F7 新特性——高速缓存
* w8 g' r7 i/ V0 q2.1 STM32F7 的存储系统# X- @4 w) U7 X  Y6 ^
STM32F7 系列微控制器作为高性能微控制器,为我们带来了很多让人眼前一亮的新特性,其中之一就是独立的指令和数据高速缓冲存储器,也就是所谓的 L1-cache,包括 I-Cache 和 D-Cache。Cache 的大小根据不同型号有所差别,有 4Kbytes、8Kbytes 和 16Kbytes 几种容量。3 M) f2 ~  I1 w/ u9 I1 X

, |& R" g0 }$ B! r实际上,这个 Cache 是放在 Cortex 内核里面的,半导体厂商(比如 ST)购买 IP 核的时候可以选择要多大的 cache,之后这款 MCU 的 cache 就已经固定了。这有点像我们去 4S 店买车,根据自身的需求和资金情况选择不同的配置。显然,cache 的容量越大,价格也就越高。本文所使用的 STM32F769I-DISCO 包含 16Kbytes 的 I-Cache 和 D-Cache。
9 F) n3 O) I4 _. E8 i3 l1 K* r9 L
1 g* y$ |8 p: U3 c1 I+ a5 U
eb0701445eb8d7c38eeb8965dd31d08e.png

+ E  L4 V7 G2 c7 M" T6 V; k- r" t4 k- o
上图是 STM32F7 系列微控制器的系统架构框图,我们可以看到在 Cortex-M7 内核里面有一个 I-Cache 和一个 D-Cache,它们是实实在在的高速存储器。而 DTCM 和 ITCM 则是两个接口,对应 Data TCM 和 Instruction TCM,它们有利于数据和指令的快速读取,可实现内嵌 Flash 的零时延数据读取。但是要注意 TCM 接口是不经过缓存的!8 w" V" P0 O" L  P/ o; g8 F4 T

* E  k; Z! Y1 t( q. X2 [7 ^上图的 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 并不包含在内。9 h$ ^+ ?8 \; s! t0 b+ ~
; a' r: d- B- A
这几个 SRAM 的关系,我们来看下面这个图就比较明白了。6 P' P6 Z) y& L! {5 m

, Z. C! x) g) X( B# G
51117c3f8c93425ecb5b5402d2115060.png

- m% K/ h0 `# w* x2 C- q" Y3 R
1 S; q4 f" R  I可以看到,DTCM RAM、SRAM1 和 SRAM2 在地址映射上是连续的,比如从 0x20000000 到 0x2007FFFF。1 E- h1 Z8 [1 }2 W/ F
  e/ Z' l3 c" v+ W& d0 z
我们还可以看到内嵌的 Flash 有两种接口,分别是 AXIM 和 ITCM 接口,对应于地址 0x08000000 和 0x00200000。那怎么通过不同的接口操作 Flash 呢?——只要操作对应的地址即可。3 M# ^; T) `! {* f1 J1 a1 }( F" d
2 |& \, Y3 B& L0 M8 Y
2.2 Cache 的组织6 W1 n( I  s" Z. g; o/ W6 y  [
在前面我们说过,绝大多数控制器的 Cache 都是采用组关联(set-associative)的映射方式,STM32F7 当然也不例外。那么,F7 的 Cache 是如何组织的呢?2 _) S; J: b: J! H( m! b; n

2 m$ \& r$ r8 [# j通过文档 AN4839,我们可以了解到:
+ G- Y& o9 C) y6 x
2 F3 G+ G2 B, e  }; g# [6 v0 W// 第5页
% }9 H1 [8 t0 m6 u9 ~! QA 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 f* M7 s  g- E

/ T0 g" Z( u  b7 {3 e// 第6页1 h" s2 \, V+ C* ~, P4 Y: ~; E
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.
' ?: p; N9 w+ P3 f/ v9 g- S7 M
也就是说,D-Cache 和 I-Cache 的块大小(cache line)为 32 bytes,采用组关联映射方式。对于 D-Cache,每组(set)包含 4 个缓冲行(line);对于 I-Cache,每组(set)包含 2 个缓冲行(line)。  M, P4 F) I7 _1 a

1 y# c! j" ~3 `" c以 16 KBytes 的 D-Cache 来计算,一共 512 个缓冲行(lines),128 个组(sets),每组包含 4 个 line,每个 line 包含 8 个字,也就是 32 个字节。
, R" X$ d, _& f- l9 o
& W+ D3 S5 F* J: o: Q! U) F8 D6 Z; o2.3 存储器默认映射和属性5 A* Q- l/ y  e$ m1 X" E
STM32F7 系列微控制器的存储器的默认映射和属性如下图所示。+ T4 @+ E+ W- y/ v' V

1 N( V% ]" z7 R5 q0 O% |
0598619c8a77aa253c5335c651dd7dc4.png

$ l; ~! A: z" {7 f; _" o! s
+ Z7 @$ O' c& j“默认”的意思就是如果没有启动 MPU,并且没有对某些特殊寄存器进行配置,那么存储器的映射地址及其属性就如上图所示。
5 [/ m( ?+ o8 A9 f6 ]- n" l3 a7 W) W7 t7 G7 G( b+ O
其中,WT 表示 Write-through(透写),WB 表示 Write-back(回写),WA 表示 Write-allocate(写分配),没有明确标注 WA 的就是 RA(读分配)。XN 的意思是 Execute-Never, 其含义为如果相应的地址空间是 XN,是绝不允许执行代码的。  u5 Q0 o  k* x& ^! r3 f, k

0 @4 \, O+ w: ?; p: x9 d存储器类型为 Normal 的才能使用 cache,并且 TCM 接口是 not cacheable 的。, J, }: n' T* m6 t  z

/ [& F$ r& i4 Y& C8 J当然,这只是默认值,部分存储器地址映射和属性是可以通过 MPU 来配置的。
& R, L7 A  ^- a9 v
9 d, P9 O; V; q! ~4 U选取几个有特点的区域稍微讲解一下吧:; R! `# q8 o' r3 f; a' v

/ a" o- e0 G+ K) @7 c+ c# b0x00000000~0x1FFFFFFF:flash 空间, 属性为 normal, cache 的属性为 Write-through, 即更新 cache 的同时,将数据同时写入相应的物理地址空间。
2 F" F4 m  M; V3 w5 M0 e! W6 d8 \8 y: R
0x20000000~0x3FFFFFFF:SRAM 空间, 属性为 normal, cache 的属性为 write-back, 即仅更新 cache, 在合适的时候(由 cache 策略决定或者软件强制更新)将数据更新到相应的 SRAM 空间。
0 M; ~  c5 S# H- x) z9 W3 l1 j3 o9 r/ i% j) a% G
0x40000000~0x5FFFFFFFF:芯片内部的外设空间,属性为 device,这一区域是外设寄存器所处的位置,对其读写的过程中不会经过 cache。8 B& `: f6 L* o- m
0 M: Q! u" O* m
2.4 CMSIS 函数
1 T  B4 s% ^$ `前面说了那么多,我自己都有点晕了。。。对于用户来说,如何正确使用 Cache 才是关键!; f; V( i; `5 _% f$ ]
& A1 a, n" O/ L! \. [* b9 f. b
下面这张图是在文档 PM0253 中截取的,Cache 相关操作的函数在 cmsis/include/core_cm7.h 头文件中声明。从函数名中可以知道,包括四种 cache 操作:enable、disable、clean 和 invalidate。
; t) }& o) m3 S# L( [  c, w5 F) l, M7 H- W6 B$ o. o
c864476b5c7f0a5a537f7154eabde8e9.png

5 N4 r" E9 Q5 ~5 l& I' |
4 S2 a6 {5 T9 a# r# n- c3 m查看源代码发现,除了表中的8个函数,还有以下3个函数(都是以 _by_Addr 结尾):" [* J. a8 C9 ]" y8 ~
) T& n2 L- r) U$ m+ w' @. _6 h6 ~
  1. void SCB_InvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
    # t& f; X7 m8 B7 i  ?/ ?! }/ \
  2. & O; X! |3 X+ k8 G9 W4 I7 `  \
  3. void SCB_CleanDCache_by_Addr(uint32_t *addr, int32_t dsize);
    - i; U- h% Q/ w/ Y

  4. ) ]5 R# F9 U+ U  J0 `' [
  5. void SCB_CleanInvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
复制代码
0 o' b6 _, o7 A
好,那下面我们一一来了解这些函数吧。* r; g% u, j, i2 K, b, Z" h( t
& D+ w% a4 V8 F+ g7 |
SCB_EnableICache() 和 SCB_EnableDCache()- [# A5 j1 ]3 d. C3 g

: s8 C# H5 P0 s( y. l, c使能 I-cache 或 D-cache。: E; b" ?& [9 z0 f) l

+ i" i+ m% x/ v/ bSCB_DisableICache() 和 SCB_DisableDCache()
& f1 x7 r& B7 E0 ^0 R4 K  [$ {* N6 Z
; w; T, L- v' D& K1 W* x, u禁用 I-cache 或 D-cache。# d0 A6 O1 p' k5 s+ l

* {/ g6 @! `$ d6 oSCB_InvalidateICache()
* D4 ]% x% W  R! ^2 i" e9 m: d8 ]% [" j7 C5 ?
使 I-cache 无效,I-cache 被 invalidate 之后,当读取指令时,会忽略相应的 cache-line 中的内容(因为被 validate 了),而从真实的物理地址中去获取相应的指令。+ O( F* Q3 H+ y7 d8 T

* h3 _' f/ O! s# cSCB_InvalidateDCache(). G+ q! [9 j" p( J$ m# {: U; L
使 D-cache 无效,D-cache 被 invalidate 之后,当有 Host(如 core,DMA 等)读取数据时,会忽略相应的 cache-line 中的内容( 因为被 validate 了),从真实的物理地址中去获取相应的数据。
  J# |1 w9 A! @! {3 _, G7 ^
6 m$ @) @/ e! h, s5 cSCB_InvalidateDCache_by_Addr()
0 ^) _, h* ]8 w9 s- g) S2 K8 R! J% R
根据地址信息无效其对应的 cache-line。9 q4 \) [7 l( ?3 ^+ g; Z
- Z3 _! u' C0 \
SCB_CleanDCache()
$ ?6 _1 f4 s9 ]3 P+ n) WClean 所有的 cache-line,即将 dirty 的 cache-line 全部写到 cache line 对应的真实的物理地址中所谓的 drity 属性,即写操作时, 更新了相应的 cache-line,但是没有更新到真实的物理地址,而这个 clean 的动作, 就是将 cache 中的内容更新到真实的物理地址中。3 |; x: f  {; h- [7 _

. X& u9 e2 a: C" LSCB_CleanDCache_by_Addr()
3 \+ u+ p& W8 ?1 d( G2 K
根据地址信息 clean 其对应的 cache-line。
9 H+ K$ y8 D  M5 u* z5 r0 p" c7 q( O( S  t3 ?1 b
SCB_CleanInvalidateDCache_by_Addr()
# z! W) F8 p, }! v% F根据地址信息 clean 并 invalidate 其对应的 cache-line。/ ?, z. V! {' ^

0 Y+ e8 u1 a( S2 Y" b
7 `0 V9 v- z2 |& W) Z
收藏 评论0 发布时间:2021-12-13 23:15

举报

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