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

例说STM32F7高速缓存——Cache一致性问题(二)

[复制链接]
aimejia 发布时间:2018-5-30 11:05
本帖最后由 aimejia 于 2018-5-30 14:48 编辑
7 W& P) ]4 i1 V% K/ y0 y/ O
9 W6 `  T' Q) o: Y例说STM32F7高速缓存——Cache一致性问题(一)$ v! C3 H# z7 H$ L% `
例说STM32F7高速缓存——Cache一致性问题(二)
8 j+ A7 [2 O6 S7 w9 g5 ^6 d2 Z例说STM32F7 高速缓存——Cache一致性问题(三)
" x% o8 D" t2 g. a& _1 E1 f0 k- W
4 k& \8 F9 Y( t/ }, D- w& I2. STM32F7 新特性——高速缓存

/ M" P0 M- C+ A8 ?9 S/ c
  m, R% M; N" k2.1 STM32F7 的存储系统 3 c# B3 q2 b& b. v6 Z( P
STM32F7 系列微控制器作为高性能微控制器,为我们带来了很多让人眼前一亮的新特性,其中之一就是独立的指令和数据高速缓冲存储器,也就是所谓的 L1-cache,包括 I-Cache 和 D-Cache。Cache 的大小根据不同型号有所差别,有 4Kbytes、8Kbytes 和 16Kbytes 几种容量。 1 W4 r' ^4 K8 l3 S& m

2 ?8 y0 h1 B% s" ?, e实际上,这个 Cache 是放在 Cortex 内核里面的,半导体厂商(比如 ST)购买 IP 核的时候可以选择要多大的 cache,之后这款 MCU 的 cache 就已经固定了。这有点像我们去 4S 店买车,根据自身的需求和资金情况选择不同的配置。显然,cache 的容量越大,价格也就越高。本文所使用的 STM32F769I-DISCO 包含 16Kbytes 的 I-Cache 和 D-Cache。5 C' Y4 D. v/ U4 w! D/ m: ]/ Y

( m1 [" y! ?: l1 _4 |1 ^
1.png
$ t; \1 d/ P, c8 [4 e" k
上图是 STM32F7 系列微控制器的系统架构框图,我们可以看到在 Cortex-M7 内核里面有一个 I-Cache 和一个 D-Cache,它们是实实在在的高速存储器。而 DTCM 和 ITCM 则是两个接口,对应 Data TCM 和 Instruction TCM,它们有利于数据和指令的快速读取,可实现内嵌 Flash 的零时延数据读取。但是要注意 TCM 接口是不经过缓存的!
3 X: r7 @0 I4 I' b- F& N8 |
* L# |; Q  D9 t' k0 D& S9 y上图的 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 并不包含在内。 5 m1 X( x6 a2 A% }. w. p3 O0 N! F

) o4 C2 ]4 I7 [6 _8 p( Y这几个 SRAM 的关系,我们来看下面这个图就比较明白了。, I$ i: ~/ X& \; }! n5 _* Q+ L
4 e. t( w3 q0 G" U$ T
2.png
! P2 A$ x( T+ s% }) i( I, y8 n
可以看到,DTCM RAM、SRAM1 和 SRAM2 在地址映射上是连续的,比如从 0x20000000 到 0x2007FFFF。
( w* V0 Z4 {# L$ k: i# |
* r7 k$ Q3 B; O- U1 |我们还可以看到内嵌的 Flash 有两种接口,分别是 AXIM 和 ITCM 接口,对应于地址 0x08000000 和 0x00200000。那怎么通过不同的接口操作 Flash 呢?——只要操作对应的地址即可。; U8 A, |3 T; D0 f/ `
/ L( c; M+ M" Q) b# G
2.2 Cache 的组织
  I( H; T" v3 x" U在《例说STM32F7高速缓存——Cache一致性问题(一)》中我们说过,绝大多数控制器的 Cache 都是采用组关联(set-associative)的映射方式,STM32F7 当然也不例外。那么,F7 的 Cache 是如何组织的呢? $ ?, @2 \8 @/ F4 Q# }$ C* i

) t. b" t9 ^3 @" }1 P/ Y0 ?D-Cache 和 I-Cache 的块大小(cache line)为 32 bytes,采用组关联映射方式。对于 D-Cache,每组(set)包含 4 个缓冲行(line);对于 I-Cache,每组(set)包含 2 个缓冲行(line)。 # a. [  r1 c- y) c4 o
5 Z0 K6 ]5 g5 ~+ _5 H$ M$ c
以 16 KBytes 的 D-Cache 来计算,一共 512 个缓冲行(lines),128 个组(sets),每组包含 4 个 line,每个 line 包含 8 个字,也就是 32 个字节。  @- V$ T6 e% |) k

6 @& |% [8 P' A0 R1 F6 |2.3 存储器默认映射和属性
% N8 Y' l! R9 |STM32F7 系列微控制器的存储器的默认映射和属性如下图所示。
! t1 d9 ?: i" \7 W4 y# ~. T" r0 N$ r: R& e' j
3.png
# I$ x5 N9 L1 g4 A
“默认”的意思就是如果没有启动 MPU,并且没有对某些特殊寄存器进行配置,那么存储器的映射地址及其属性就如上图所示。 6 ]/ {4 y2 C$ g& c# i

" ^1 d1 V/ I+ ?0 ]* l其中,WT 表示 Write-through(透写),WB 表示 Write-back(回写),WA 表示 Write-allocate(写分配),没有明确标注 WA 的就是 RA(读分配)。XN 的意思是 Execute-Never, 其含义为如果相应的地址空间是 XN,是绝不允许执行代码的。 % m, X* u& z" }- c0 M: U' C
( u; ^( e+ i' G$ @6 ^- w. [
存储器类型为 Normal 的才能使用 cache,并且 TCM 接口是 not cacheable 的。 7 s6 ^: w# S6 r2 R( n
; ^+ ]8 k$ s# G4 Y4 E4 ^, ~
当然,这只是默认值,部分存储器地址映射和属性是可以通过 MPU 来配置的。 * b3 [0 I1 k" F+ C+ G% k6 m7 |8 M
4 M+ q2 c5 ^6 Z  g$ s
选取几个有特点的区域稍微讲解一下吧: 6 a9 z* G, ?* E

! m: t) r1 @$ S6 W5 b0x00000000~0x1FFFFFFF:flash 空间, 属性为 normal, cache 的属性为 Write-through, 即更新 cache 的同时,将数据同时写入相应的物理地址空间。
- z6 j5 e; f, ]/ ]( f, O( L; D5 L: K3 v( k8 S2 A
0x20000000~0x3FFFFFFF:SRAM 空间, 属性为 normal, cache 的属性为 write-back, 即仅更新 cache, 在合适的时候(由 cache 策略决定或者软件强制更新)将数据更新到相应的 SRAM 空间。 - e, g' T3 G, p6 y

$ J7 C4 g+ z& e! E. p8 Z# n! q; p0x40000000~0x5FFFFFFFF:芯片内部的外设空间,属性为 device,这一区域是外设寄存器所处的位置,对其读写的过程中不会经过 cache。
" l& D- O4 A- g8 f8 p- `/ @
' N9 Y; |0 y; g) d2.4 CMSIS 函数
) j3 P, }( R4 ?1 A! i( F前面说了那么多,我自己都有点晕了。。。对于用户来说,如何正确使用 Cache 才是关键! 2 F" {; L. n7 e) x" A  j  t

( b+ A& L2 q. W# k  k; ~, V4 K下面这张图是在文档 PM0253 中截取的,Cache 相关操作的函数在 cmsis/include/core_cm7.h 头文件中声明。从函数名中可以知道,包括四种 cache 操作:enable、disable、clean 和 invalidate。5 g2 A/ g. s# ?" w
. o4 d9 s& |" ]+ \
4.png

! _# [7 O% B0 O; r8 A6 e查看源代码发现,除了表中的8个函数,还有以下3个函数(都是以 _by_Addr 结尾):
2 f8 h- ^3 X$ o  t1 A
  1. void SCB_InvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
    - R2 b4 ?0 P& m& \! w' U6 ]# L

  2. 7 B# C6 t: Z3 u
  3. void SCB_CleanDCache_by_Addr(uint32_t *addr, int32_t dsize);: g: S- H; j* x  \7 G0 Y

  4.   g: \* k& }6 R9 `! }' N8 B( v
  5. void SCB_CleanInvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
复制代码

8 q3 R, V2 _- d1 c: B好,那下面我们一一来了解这些函数吧。
; ]. J; [% |7 R" t" v2 {2 p2 n' p9 s' d  O: ?7 m
SCB_EnableICache() 和 SCB_EnableDCache()5 L; N% B3 v$ t7 s9 d! h: X8 w8 }+ R

$ z" x% M; E" f$ B) [/ q使能 I-cache 或 D-cache。' T7 V# {# p' q
4 u5 k( o- x/ x
SCB_DisableICache() 和 SCB_DisableDCache()
: }- ?( {  `$ z3 f) m( y
) O* u/ N% t/ x- W2 d# u/ y禁用 I-cache 或 D-cache。7 a1 c9 L" }. d7 o) g

& ^3 U: d$ L' T# _1 I, p  ~  P- Z- NSCB_InvalidateICache()$ I5 [- ^  N) @+ ]

" _9 n1 ?: B  R1 x, X; {  @8 z3 Z使 I-cache 无效,I-cache 被 invalidate 之后,当读取指令时,会忽略相应的 cache-line 中的内容(因为被 validate 了),而从真实的物理地址中去获取相应的指令。
0 {& A* |. `3 E2 h( C) y9 ^1 q1 C) e. a5 J, O% F
SCB_InvalidateDCache()
  ~9 ^8 g! E8 D) |+ X6 R3 D$ G0 ~, N! y( h$ p$ y" c( }
使 D-cache 无效,D-cache 被 invalidate 之后,当有 Host(如 core,DMA 等)读取数据时,会忽略相应的 cache-line 中的内容( 因为被 validate 了),从真实的物理地址中去获取相应的数据。7 T( W1 k9 K- J' }% d, ?" q
" q# T% f4 O' H. c6 D3 w5 |
SCB_InvalidateDCache_by_Addr()
! K! G  }. F7 s( a8 {, Q! J3 \2 }. f; L, U. ~
根据地址信息无效其对应的 cache-line。- J' A6 Q8 ~0 s
% J, a* V/ T- _# Y* A, p6 Z
SCB_CleanDCache()& N# @9 Z  r9 j% [# @3 C5 S
4 t: v4 T& Z; A7 O, {
Clean 所有的 cache-line,即将 dirty 的 cache-line 全部写到 cache line 对应的真实的物理地址中所谓的 drity 属性,即写操作时, 更新了相应的 cache-line,但是没有更新到真实的物理地址,而这个 clean 的动作, 就是将 cache 中的内容更新到真实的物理地址中。9 X$ c! N+ z: ^) D

( U; V, U% a; wSCB_CleanDCache_by_Addr()6 g' J; q' y3 v" l8 R' v
+ \! y% S; N4 J4 w( h! @
根据地址信息 clean 其对应的 cache-line。
; B  m/ y- U7 @: V/ _/ q5 g, y6 c+ ^. b; a& w! X" O
SCB_CleanInvalidateDCache_by_Addr()# a5 O! K: c) ?

8 V. [0 t" _7 K# ?" Q3 p根据地址信息 clean 并 invalidate 其对应的 cache-line。/ S& C; t1 R1 Q) D# X7 a; Z" q

, g5 X% T# b1 n3 ]9 D  H' S! B. ?* l1 S  {# x& A8 g% v( K, x

& F1 F  i% E  K: [- R& c0 z; Y5 \3 R6 a
6 f; Y9 z' W6 Y3 _
转载自阿基米东6 N. p- Z$ }' w$ y$ |
, H) R5 J; ]9 f

; u. f! a4 P# \
赞 收藏 评论0 发布时间:2018-5-30 11:05

举报

0个回答

所属标签

相似技术帖

官网相关资源

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