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

【经验分享】STM32H7的Cache与Buffer

[复制链接]
STMCU小助手 发布时间:2021-12-26 17:22
STM32H7的Cache与Buffer
/ E9 z% {5 w2 n* ETCM和Cache的区别
: N) e* \. B. J
…使用lwip用到了mpu,对于内存管理产生了很多的疑问,需要统一解决一下,不然用起来总有些不安。
/ y- s* e; d6 n$ d9 K  m+ C& |8 Z4 x0 d4 c7 a# d) ]4 E  e; [
STM32H7使用的内存不是连续的,而是被划分为多段。0 a  ]! q! T- }6 s! B; O

! |. q$ u5 o: ^; P' A& b  O
  1. MEMORY
    % Z6 @- J* W5 B
  2. {; s0 m0 P* [9 Q+ l5 y
  3.         DTCMRAM (xrw)     : ORIGIN = 0x20000000, LENGTH = 128K //高速段,cpu独享2 \% p) n( f4 A% K
  4.         RAM_D1 (xrw)      : ORIGIN = 0x24000000, LENGTH = 512K7 m3 H# C9 I' p3 m1 ?
  5.         RAM_D2 (xrw)      : ORIGIN = 0x30000000, LENGTH = 288K5 _( T! Z& |7 Q
  6.         RAM_D3 (xrw)      : ORIGIN = 0x38000000, LENGTH = 64K* f+ q6 b, v! g6 |1 |) p
  7.         ITCMRAM (xrw)     : ORIGIN = 0x00000000, LENGTH = 64K //高速段,cpu独享
    ! q6 V9 }4 }7 s- K1 l  t) F
  8.         FLASH (rx)        : ORIGIN = 0x8000000, LENGTH = 128K+ b! ]" `: f+ ], A+ A0 |
  9. }
复制代码
2 B, s2 U/ p3 o* y! F( I
TCM内存段是和CPU同频率的,不需要也不能用Cache。用好TCM的优先级应该排在用好Cache的前面。
" C4 y7 }3 }0 c1 u9 z4 K" P2 k8 ~Cache处于核心里面,作为低速内存加速器使用,获得增益最大的是位于AXI总线上的比如内部Flash、内部SRAM、通过FMC或者QSPI控制器连接的外部sram。Cache使得低速Sram获取与高速TCM差不多的速度。使用Cache加速很有意义,不然400M的cpu变200M,相当于H7变F4,选择H7的cpu将变得没有意义。
2 K# P4 |- F6 u/ M9 Z' c* o( w  |: A' v. w; L
20201019190212727.png

7 Q$ i$ v  d0 K1 t( n2 a6 P* g( G  ]# w9 F5 `1 L; i( }
内存类型
/ v3 F4 }8 E1 X+ W" o* q1 _+ F. G8 x0 R内存类型分为Normal以及Device和Strongly-ordered,
- s9 z6 Y! [/ I" a  `0 Y4 _* H
I5LW_ZQ_SY3W%I@][7RY56T.png
0 M5 ^# U0 u; I% f4 c* l
# Q( Y& }- u+ L& [+ d  U
20201019190230823.png
9 {3 A4 ?$ W  d& i
  c! {' {2 V4 X7 Z6 S1 U
4 ]2 l/ I) q1 p# {5 V! `% p
Write-buffer是什么?$ D$ A8 n0 b$ e8 a! E3 _! u
Device和Strongly-Ordered类型时候提到了write-buffer,它属于cpu核心,cache经常与write-buffer一起使用,使用writer-buffer的目的是将处理器和cache从较慢的对主存的写操作中脱离出来。( j3 k/ p7 t- n2 U0 o$ b
Write buffer可以缓存8个word的数据和4个独立的地址,可以enable或者disable使用ARM核心控制寄存器 W的bit3。同时还要受到内存管理页表的一个bit控制,所以使用Write-Buffer,MMU必须已经使能(控制寄存器的bit0)。MMU-Memory Management Unit
4 P8 a$ G) A( _. T3 `$ w通常情况下的配置都是主内存允许bufferable,但是I/O 空间 unbufferable' ^+ i8 s$ a. L9 \' U
当CPU执行一个写操作时,根据配置情况执行写入操作。/ b9 l$ k- H8 N( n4 [6 t
( [- Q$ c( w5 I* I3 m8 W3 U

+ t* Y2 {$ b  f0 _
4 }* w  m# x2 g3 W: K
20201019190300772.png
) ]/ h. N, T* X9 |
3 R4 a- H4 W6 p% \* Z
如果程序中使用DMB and DSB,处理器会等到write-buffer内指令完成,再进行后续指令操作,如果过程中发生中断,中断返回后继续write-buffer清空等待。6 r6 K5 x: o7 R  \: v5 C
# g3 m' ?4 s3 a: G! i
DMB或者DSB被称为 显式限制操作 explicit barrier。# D* q# j. A1 F

5 L& y* J* c/ \/ x6 z
20201019190244953.png

. j0 T: S( C! K+ `& T2 \
1 p+ t; @$ ~  D8 qMemory Attrabute
. O0 O( @! V* h  ENormal模式下可以设定的几种
6 I$ p7 m0 E, h4 A: z$ C( P
. g0 `; n6 K0 n) k5 u; S1 [8 H5 c
UXF0GF8D%6@3RQT%LAI76.png

; _2 }- d$ Q7 U0 b$ Q* D
; m( L# A2 T9 Z% AShareable属性
( u* X. Z9 a& [5 ~3 s8 Q  n共享属性设计的意义在于,多个bus master读写情况下需要cache保持同步,对于CortexM7,只有L1-Cache,如果设置了Shared相当于non-cacheable。) J: }% J$ }" ]3 f* L# A+ c* |
. E, p7 h* d* `0 }0 i7 l! \$ }
20201019190314464.png
; w8 F. C9 V( a; D0 O
! `' y5 D4 a, s. _' ^
内核操作函数
) V  f6 o$ t  h- g5 S内核操作函数包含以下几种,主要包含两种操作:clean和invalidate。0 r' c% P3 c: w9 }7 }/ L
clean:将cache中的信息写到sram,相当于用cache信息覆盖sram;
* @5 G6 |$ Z8 Tinvalidate:使cache失效,相当于用sram信息覆盖cache;
9 L$ v- v  d( |, x; W* A二者为相反的操作。
9 F4 X+ D1 V5 z% B: F  n0 q
1 x4 n- w; s+ |! F2 s
2020101919032876.png
7 L8 B  u5 a# k1 F5 A/ g2 U4 ?/ b1 t
+ B' \* q: e# C+ }! U) V6 u
20201019190336970.png
$ l% a, r: r& l' y/ P& {7 v

( _! x: W. Y" R% Y1 M* Y% F) }& L% g7 n! J3 p# C# P* d0 A
内存对齐问题: s' L* Z, @5 S% ?' M
使用cache时,dma的buffer必须32byte对齐,不然可能会出现问题。比如下面的情况:
- q5 g2 |4 J4 Z2 t+ o+ Y2 S4 d+ d6 r/ y
  1. typedef struct1 {% m1 ?! P4 a5 v) F
  2. {
    0 R- {) W3 f; [2 m. R. D# a
  3.     __attribute__ ((aligned (32))) uint8_t rx_buffer[BUFFER_SIZE];//用于buffer
    2 K$ H# p8 u4 A( U
  4.     bool rx_xfer_done;                                     //用于记录dma已经被正确传输
    $ q" g) ?) _& f$ J( i/ C* R* Q
  5. }st_dma_xfer8 `) g+ Z" ?7 h& b( R
  6. 9 k6 r* k. D+ U, W9 ~
  7. void XDMAC_Handler(void)0 A6 y, b6 ]. W2 Q: v
  8. {/ h6 W6 c. m) n: e
  9.     uint32_t dma_status;2 H9 s& `" {- k! A8 v+ ?9 a7 G/ Y
  10.     dma_status = xdmac_channel_get_interrupt_status(XDMAC, XDMA_CH_RX);. A+ d5 Q1 s6 m5 D- k) b) i
  11.     if (dma_status & XDMAC_CIS_BIS)3 V5 I/ c* `$ m8 g
  12.     {
    1 l# E1 y4 B. P* Z# G- C
  13.       g_st_dma_xfer.rx_xfer_done = true;
      p4 {7 @5 R$ p1 P
  14.       SCB_InvalidateDCache_by_Addr((uint32_t*)g_st_dma_xfer.rx_buffer, DMA_TRANSFER_SIZE);
    & ^  i4 ?& B) G& J! P- Y
  15.     }1 K0 [$ {( d' x. e
  16. }
复制代码
3 |3 y# p# G6 C# A
9 O3 a) c5 U' P. G/ J' l+ Q" u
如果DMA的buffer只有16字节,DMA读取操作后,DMA控制器将接收到的数据写到了sram里面,然后进入DMA接收中断函数,cpu把成功读取的标识bool变量写为true,实际上写操作只是写在D-Cache里面,暂时没有写到sram。; _8 M- A# }; \0 `

. H( _2 k8 J* J, ]* M
20201019190359602.png
5 W4 F) E5 ?6 Y2 }1 v4 u
" \* f) o# w- Z: [; L( }4 r) \
如果此时cpu需要读取dma内容,需要对Dcache进行invalid操作,32个字节将一起更新,bool变量旧值0将覆盖新值1。cpu读不到中断函数写的bool变量信息。, ~! e" [$ P8 T2 Y$ L7 H

+ h' z" U' c( _* i. ]  l
20201019190409891.png

7 F. ]  e% z- l. e$ L) @8 f. [4 y- t) N5 `' B+ Q
可见:6 y- p; `5 b4 H5 C5 b
clean操作或者Invalidate操作都可能丢东西,使用上需要注意。经验是如果一段内存用来写dma外设,就不要读它,保证随时都可以clean;同样如果一段内存用来接收DMA外设传入信息,就不要用cpu写它,保证随时都可以invalidate。
+ N+ j( B! i6 L  h
, a% t$ A* C' L, r' j
2020101919042042.png
6 Z8 W9 v- q6 j1 L6 |; A1 u
% _' p( H( C% ~

( G" w: z4 L& g: _$ V  n' y
收藏 评论0 发布时间:2021-12-26 17:22

举报

0个回答

所属标签

相似技术帖

官网相关资源

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