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

【经验分享】STM32H7的Cache与Buffer

[复制链接]
STMCU小助手 发布时间:2021-12-26 17:22
STM32H7的Cache与Buffer
  d0 E/ c( q  {( j. ~  i6 v: qTCM和Cache的区别
& R  h- p0 v3 }! g3 X
…使用lwip用到了mpu,对于内存管理产生了很多的疑问,需要统一解决一下,不然用起来总有些不安。% p7 U9 k' s( v: K- Q

8 d0 k! j- ?$ b) o  g5 p+ iSTM32H7使用的内存不是连续的,而是被划分为多段。3 s9 \! {# r1 x( P
9 O. s9 z8 q% p: ?
  1. MEMORY4 _# U, w* ^% @1 a
  2. {$ O; b2 _: \, {  x
  3.         DTCMRAM (xrw)     : ORIGIN = 0x20000000, LENGTH = 128K //高速段,cpu独享
    / e) G5 @0 Y0 y" `. P
  4.         RAM_D1 (xrw)      : ORIGIN = 0x24000000, LENGTH = 512K+ ?& F# h1 f& k+ ^9 M$ `
  5.         RAM_D2 (xrw)      : ORIGIN = 0x30000000, LENGTH = 288K: J/ Z7 S5 `! t0 F
  6.         RAM_D3 (xrw)      : ORIGIN = 0x38000000, LENGTH = 64K, g$ ]' M0 L, [! B0 K& m
  7.         ITCMRAM (xrw)     : ORIGIN = 0x00000000, LENGTH = 64K //高速段,cpu独享
    $ ]  ~3 p' N4 f& a* C5 `  H0 Y; }
  8.         FLASH (rx)        : ORIGIN = 0x8000000, LENGTH = 128K4 c: q1 T" A' h- P8 T
  9. }
复制代码
$ h; Z* w6 [& `& g' e
TCM内存段是和CPU同频率的,不需要也不能用Cache。用好TCM的优先级应该排在用好Cache的前面。
8 j6 D& Q, O% ~- z0 k- C; {1 PCache处于核心里面,作为低速内存加速器使用,获得增益最大的是位于AXI总线上的比如内部Flash、内部SRAM、通过FMC或者QSPI控制器连接的外部sram。Cache使得低速Sram获取与高速TCM差不多的速度。使用Cache加速很有意义,不然400M的cpu变200M,相当于H7变F4,选择H7的cpu将变得没有意义。
: R+ o+ u6 y- q# q" ^) U* ?( f: o
5 ?7 N: a2 i9 m4 K
20201019190212727.png
  v$ o. p+ o& l( Y& d+ q
, N1 z' q$ H& u/ Y6 F+ J" x& W
内存类型( X# E6 i+ T) Z1 U% o
内存类型分为Normal以及Device和Strongly-ordered,
3 P0 R6 m9 L, m* c4 b6 ]
I5LW_ZQ_SY3W%I@][7RY56T.png

: n! h# P3 _! j0 L- I
: q1 t( J$ w2 H: d: w0 d/ i
20201019190230823.png
4 ^% a2 B% T, o% d# k4 y
: r4 V5 v4 a& ?; h" b

; H' E; D$ K& b) W7 D0 HWrite-buffer是什么?# X- ^1 U3 L; [
Device和Strongly-Ordered类型时候提到了write-buffer,它属于cpu核心,cache经常与write-buffer一起使用,使用writer-buffer的目的是将处理器和cache从较慢的对主存的写操作中脱离出来。% T: n, A& d- k9 H; F& M
Write buffer可以缓存8个word的数据和4个独立的地址,可以enable或者disable使用ARM核心控制寄存器 W的bit3。同时还要受到内存管理页表的一个bit控制,所以使用Write-Buffer,MMU必须已经使能(控制寄存器的bit0)。MMU-Memory Management Unit1 }# g; K* K1 }2 Q/ j! @( `/ n
通常情况下的配置都是主内存允许bufferable,但是I/O 空间 unbufferable
5 Y8 i3 M9 h# ]3 l当CPU执行一个写操作时,根据配置情况执行写入操作。
7 \3 `5 U5 J; O/ \- j" l
! B! Z& M1 v8 F2 b5 g+ A) W

  ]$ t- P& B  \4 S, \" z# n8 h
/ i( [! S2 Y  o4 x8 u; }
20201019190300772.png

9 u$ c+ I, x5 r% k+ t& |$ |  |9 ~, u4 Y- x
如果程序中使用DMB and DSB,处理器会等到write-buffer内指令完成,再进行后续指令操作,如果过程中发生中断,中断返回后继续write-buffer清空等待。
1 Z6 }8 n: o! w& W, A/ Y3 ?, a
0 ^- V6 s7 v# L3 w" kDMB或者DSB被称为 显式限制操作 explicit barrier。
* L$ s) L# q, m6 T
% Q, Q4 \4 o% R. q! k$ C2 _
20201019190244953.png

- v4 O0 L- E* ^3 d+ }; w" `) u7 l7 c) y$ X/ Y) ^& x. g
Memory Attrabute
+ T7 ]) |' t  u% QNormal模式下可以设定的几种6 F* }! F! i  A( ]0 T8 h8 h8 Y# n- A

8 c9 u6 h$ t. n- P$ j) k0 T
UXF0GF8D%6@3RQT%LAI76.png
; @( I. c/ Z4 b' D: I& z# k

! b1 }  s* d- c' WShareable属性: \+ V  ~5 n' |
共享属性设计的意义在于,多个bus master读写情况下需要cache保持同步,对于CortexM7,只有L1-Cache,如果设置了Shared相当于non-cacheable。
9 F# O. T8 {" F  l
. ~; D2 p, r$ m
20201019190314464.png
. |, N0 S$ N  o+ ~0 \
# b  l- b, X9 S0 {3 X
内核操作函数
8 W) h1 e$ T. k* X$ k2 m7 x内核操作函数包含以下几种,主要包含两种操作:clean和invalidate。
* W# g* B6 @: F1 w% Hclean:将cache中的信息写到sram,相当于用cache信息覆盖sram;& J- ?. }; ?$ o' r
invalidate:使cache失效,相当于用sram信息覆盖cache;8 K6 G* w% v% r  }
二者为相反的操作。
' N& L: K+ y" P0 z; q* k  V  B; m% A$ i+ w* [
2020101919032876.png

4 A  L  r% A2 ]6 i/ h$ x+ q6 K( M7 `% o' B, A
20201019190336970.png
; |+ l& B- u+ L1 X$ s5 n
" D8 P  m( G5 @; V, m

4 q5 v. A; C% E% ]- c: s% b( p, a7 W内存对齐问题, K$ A/ b' [, ^  F0 |0 T1 X
使用cache时,dma的buffer必须32byte对齐,不然可能会出现问题。比如下面的情况:
6 j* s$ V. d1 J, F$ B
7 Z+ x3 `  Q2 D5 {0 k8 [/ }: i4 p* L
  1. typedef struct
    4 R( K: B1 o2 U& ?- J
  2. {. n1 |3 o8 o6 u) q/ F4 [: c$ S
  3.     __attribute__ ((aligned (32))) uint8_t rx_buffer[BUFFER_SIZE];//用于buffer; E- i6 X" `' X( o4 n$ g, N; F
  4.     bool rx_xfer_done;                                     //用于记录dma已经被正确传输
    % k% G6 u+ O& a! i  m% m
  5. }st_dma_xfer% H2 A/ @7 |4 e0 D6 F; s  v  H

  6. ; V# K8 r4 h- X2 M
  7. void XDMAC_Handler(void)3 N, E, P6 x' ?8 D- J, }
  8. {3 R4 m; R. Z" `' ~/ P; \
  9.     uint32_t dma_status;6 L# L: U& H' }  R# J) C, ]
  10.     dma_status = xdmac_channel_get_interrupt_status(XDMAC, XDMA_CH_RX);) z* W$ N# k6 l2 G  |
  11.     if (dma_status & XDMAC_CIS_BIS). }7 O% u$ O% g, i) k- U$ V/ n9 z
  12.     {5 R# s2 J% `1 H) I1 g
  13.       g_st_dma_xfer.rx_xfer_done = true;5 h) S& i; y* [' t  V
  14.       SCB_InvalidateDCache_by_Addr((uint32_t*)g_st_dma_xfer.rx_buffer, DMA_TRANSFER_SIZE);4 _. e( L. \# k* [! H% S  Q
  15.     }- @5 d* [6 V/ Y7 c3 E' j+ l6 J
  16. }
复制代码

' W4 x3 i6 O2 g+ Q  e$ A6 ^- _: [% n. F# P; u  V1 _2 x2 d  J  G% |
如果DMA的buffer只有16字节,DMA读取操作后,DMA控制器将接收到的数据写到了sram里面,然后进入DMA接收中断函数,cpu把成功读取的标识bool变量写为true,实际上写操作只是写在D-Cache里面,暂时没有写到sram。4 J% }, w3 ]3 t1 E/ Y

  Z5 k6 u6 e$ \) C
20201019190359602.png
/ w: a) Z) ~& T9 K' _1 J: ^4 I

$ N6 V; M6 G$ `9 S0 x如果此时cpu需要读取dma内容,需要对Dcache进行invalid操作,32个字节将一起更新,bool变量旧值0将覆盖新值1。cpu读不到中断函数写的bool变量信息。1 w  ]: n& q) y7 i7 X) c7 c+ d
% P: L4 D2 S; ^! G$ b. V) B
20201019190409891.png
+ @9 q7 }: {' Z
- j( T3 m) W3 v7 t. e+ j& V, e; I
可见:, k) a5 v( R: U2 @3 j1 {$ `1 ]
clean操作或者Invalidate操作都可能丢东西,使用上需要注意。经验是如果一段内存用来写dma外设,就不要读它,保证随时都可以clean;同样如果一段内存用来接收DMA外设传入信息,就不要用cpu写它,保证随时都可以invalidate。$ K3 P: _3 j( p& G* H; N/ _

, ]* R; O- ]. i: Q; l4 d  e* u2 |% e
2020101919042042.png

2 U8 o, o" \- l9 L( C% x
8 o# q1 {6 {. h3 X; t- s+ \- n* d
, R( f! z: X" ^. Z7 A* u! b0 t1 M, o
收藏 评论0 发布时间:2021-12-26 17:22

举报

0个回答

所属标签

相似分享

官网相关资源

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