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

【经验分享】STM32H7的Cache与Buffer

[复制链接]
STMCU小助手 发布时间:2021-12-26 17:22
STM32H7的Cache与Buffer& g5 D4 |, e( r* J7 D' r2 [2 F
TCM和Cache的区别
1 a& J# p' f% v' b' G
…使用lwip用到了mpu,对于内存管理产生了很多的疑问,需要统一解决一下,不然用起来总有些不安。$ n& V' T8 @1 I$ Z+ v
7 Q2 ]% @/ C0 a4 r3 h" c
STM32H7使用的内存不是连续的,而是被划分为多段。5 r/ j2 m8 w: Y& y$ x7 Q
/ Y2 E8 Y: v9 ^  J3 Y# Y: ^( K1 X7 f, s
  1. MEMORY
    / N; r  u3 I( e- `5 T9 s
  2. {
    / D$ g& A' U2 m6 T6 Q2 J) R) [8 }
  3.         DTCMRAM (xrw)     : ORIGIN = 0x20000000, LENGTH = 128K //高速段,cpu独享1 U8 h: Z+ t& W7 l7 C" N
  4.         RAM_D1 (xrw)      : ORIGIN = 0x24000000, LENGTH = 512K
    : l: b+ r  D: H" A2 C0 s. n
  5.         RAM_D2 (xrw)      : ORIGIN = 0x30000000, LENGTH = 288K9 H0 ]( Q/ o, m7 t/ h4 c- J
  6.         RAM_D3 (xrw)      : ORIGIN = 0x38000000, LENGTH = 64K
      P  }" M% @6 ]+ \) E- N! J
  7.         ITCMRAM (xrw)     : ORIGIN = 0x00000000, LENGTH = 64K //高速段,cpu独享
    - i4 z; f' i. }- z
  8.         FLASH (rx)        : ORIGIN = 0x8000000, LENGTH = 128K( f" y  d8 k5 R  G. b: {! k  q
  9. }
复制代码
9 Z3 h* o8 r: j  X6 {# Z
TCM内存段是和CPU同频率的,不需要也不能用Cache。用好TCM的优先级应该排在用好Cache的前面。& ]; j. G3 j- z& W& p& Y( z
Cache处于核心里面,作为低速内存加速器使用,获得增益最大的是位于AXI总线上的比如内部Flash、内部SRAM、通过FMC或者QSPI控制器连接的外部sram。Cache使得低速Sram获取与高速TCM差不多的速度。使用Cache加速很有意义,不然400M的cpu变200M,相当于H7变F4,选择H7的cpu将变得没有意义。3 R( T% `1 w& O, e) o

/ e# m. e: w) V! z8 X
20201019190212727.png

8 k. F3 Z) y# j9 x  X; `/ ?3 W
' X  k# @; H* ]" |内存类型
8 ]+ \) v+ _3 Y, X2 M内存类型分为Normal以及Device和Strongly-ordered,
/ r! B/ g" n( p' C, J9 R& [
I5LW_ZQ_SY3W%I@][7RY56T.png

1 R0 G) R8 E' k6 O! t# R  T6 ]8 P) ], s+ P" A) L1 u
20201019190230823.png
( ~3 g$ A; a7 _- u" T! U
& L* B3 l; b! [3 y. n# t
- u+ f1 y- B- }! y5 ^
Write-buffer是什么?: [8 |9 ]' u4 z3 g! t$ Y
Device和Strongly-Ordered类型时候提到了write-buffer,它属于cpu核心,cache经常与write-buffer一起使用,使用writer-buffer的目的是将处理器和cache从较慢的对主存的写操作中脱离出来。, A3 W& ?! b6 n
Write buffer可以缓存8个word的数据和4个独立的地址,可以enable或者disable使用ARM核心控制寄存器 W的bit3。同时还要受到内存管理页表的一个bit控制,所以使用Write-Buffer,MMU必须已经使能(控制寄存器的bit0)。MMU-Memory Management Unit& a/ U0 A: o% a# F+ I3 x* `* l
通常情况下的配置都是主内存允许bufferable,但是I/O 空间 unbufferable
! k4 B& J8 E' V  e; W; I当CPU执行一个写操作时,根据配置情况执行写入操作。6 F. V7 Q- O& i' h" {& U7 f5 _
+ u7 Z4 |' @0 M; Q/ W( C) w

# H6 k! |7 S1 v( e& X) n& s, Y7 j4 Z# u- E) C
20201019190300772.png
$ ?. _2 s$ o3 K+ |) p

, h8 V) @$ q: W! q+ S如果程序中使用DMB and DSB,处理器会等到write-buffer内指令完成,再进行后续指令操作,如果过程中发生中断,中断返回后继续write-buffer清空等待。
$ _; _/ I, m: o+ s- z
, r; a3 I& G% u) k* ?+ cDMB或者DSB被称为 显式限制操作 explicit barrier。- v4 Q! }6 n, h' W
" K, S5 o+ R! W* w; J- x7 e2 P, Z
20201019190244953.png
5 [. d# F" @2 L. N* X
9 l+ r  E! p* G; U  _
Memory Attrabute8 W( W9 e/ }& T9 N& J/ n
Normal模式下可以设定的几种
& r# w! x9 P6 n! J% S2 V. C7 B8 G0 e" [1 o0 e
UXF0GF8D%6@3RQT%LAI76.png
  I4 _# P( N. I( `; M2 l

7 Z- t, E6 f# y4 U& F9 I3 aShareable属性
) P6 v6 [, e( v, f共享属性设计的意义在于,多个bus master读写情况下需要cache保持同步,对于CortexM7,只有L1-Cache,如果设置了Shared相当于non-cacheable。
( \, M0 z  q. G, B
. p. N% A' |& a: z. m3 e
20201019190314464.png

9 l9 x7 i' N8 A$ c7 d+ }" B! a3 s# t" t
内核操作函数  f/ w' q, O8 h6 v7 C" ?
内核操作函数包含以下几种,主要包含两种操作:clean和invalidate。
) d3 a0 G% L/ Xclean:将cache中的信息写到sram,相当于用cache信息覆盖sram;
# @+ N: ~" U9 Y& C0 m$ xinvalidate:使cache失效,相当于用sram信息覆盖cache;
6 F6 B. d- t5 X- u8 D/ {% V二者为相反的操作。
' C3 K# m; r! V4 v$ P1 {1 M
" t5 K. Y4 l& s0 v" ?
2020101919032876.png

7 X; ~( [% z1 @) h$ W3 W; i7 a. F8 p4 }- f9 T" t
20201019190336970.png

( ~/ d5 @- Y3 I7 b
$ G7 Z* B; n7 n4 K" P$ r2 v' z4 }; M7 g% k- P' R, S
内存对齐问题
' G/ C, ^) q! s& l使用cache时,dma的buffer必须32byte对齐,不然可能会出现问题。比如下面的情况:
1 m0 J1 J# U" v* l- s
+ o6 ]: a' h9 t- `% ~+ K
  1. typedef struct
    + z/ A2 g) q- s( h' q7 N' c! z
  2. {% Z; J# M8 g1 C& i* A. u. B, _5 q
  3.     __attribute__ ((aligned (32))) uint8_t rx_buffer[BUFFER_SIZE];//用于buffer
    9 L& `% s6 b# a: Y
  4.     bool rx_xfer_done;                                     //用于记录dma已经被正确传输
    7 A% W, M8 U, K4 o
  5. }st_dma_xfer
    % e1 Q# }& l. l

  6. 1 g5 K( u. p, y1 H! g
  7. void XDMAC_Handler(void)+ f) n; J, r& s1 e9 R  l
  8. {
    3 U) a7 D; W  i( F
  9.     uint32_t dma_status;( ?. k5 q1 R6 E) c" S! S
  10.     dma_status = xdmac_channel_get_interrupt_status(XDMAC, XDMA_CH_RX);; [, I# n& A7 b& }
  11.     if (dma_status & XDMAC_CIS_BIS)- M: i) z. N( {$ Y2 W
  12.     {" U6 @% @: h5 U: \7 m
  13.       g_st_dma_xfer.rx_xfer_done = true;7 b9 H5 [6 \' V$ e9 C% m
  14.       SCB_InvalidateDCache_by_Addr((uint32_t*)g_st_dma_xfer.rx_buffer, DMA_TRANSFER_SIZE);
    8 Q' _' q  z6 H! p+ I
  15.     }' |6 p# v7 [3 o
  16. }
复制代码

# z4 Y; j; d! Q8 x4 B( F- U0 W
% w2 p& K( p8 n$ A& E如果DMA的buffer只有16字节,DMA读取操作后,DMA控制器将接收到的数据写到了sram里面,然后进入DMA接收中断函数,cpu把成功读取的标识bool变量写为true,实际上写操作只是写在D-Cache里面,暂时没有写到sram。
& n& B0 N0 }( E4 j9 r  \: A' _" O  v7 m, }. S+ [5 _- N5 `( o
20201019190359602.png
. d% o5 S3 [/ N

( C/ v  [' b0 i4 \( f3 H8 D如果此时cpu需要读取dma内容,需要对Dcache进行invalid操作,32个字节将一起更新,bool变量旧值0将覆盖新值1。cpu读不到中断函数写的bool变量信息。
9 a3 c9 r' D& L, d1 Z+ z4 }( v7 q5 J5 B2 v* Z
20201019190409891.png
3 {5 T- _0 l! @0 E+ I

' J4 n( A; L3 T* u可见:
7 L( J7 w( |; f4 eclean操作或者Invalidate操作都可能丢东西,使用上需要注意。经验是如果一段内存用来写dma外设,就不要读它,保证随时都可以clean;同样如果一段内存用来接收DMA外设传入信息,就不要用cpu写它,保证随时都可以invalidate。
+ u( @1 l* m2 j- V/ {/ d- F  D
2 r. j$ E! l6 K
2020101919042042.png
- G9 C. M0 a. W9 s; ~( x
, r( x: w: @. r
9 N2 [2 d: P, f2 E% q: G
收藏 评论0 发布时间:2021-12-26 17:22

举报

0个回答

所属标签

相似分享

官网相关资源

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