
STM32H7的Cache与Buffer TCM和Cache的区别3 Y" p! J& C' B( Z& `) | …使用lwip用到了mpu,对于内存管理产生了很多的疑问,需要统一解决一下,不然用起来总有些不安。 STM32H7使用的内存不是连续的,而是被划分为多段。" S& m) w; b$ e/ `3 k! h 7 }6 l' f8 r/ p
TCM内存段是和CPU同频率的,不需要也不能用Cache。用好TCM的优先级应该排在用好Cache的前面。! } t) `, |$ ] Cache处于核心里面,作为低速内存加速器使用,获得增益最大的是位于AXI总线上的比如内部Flash、内部SRAM、通过FMC或者QSPI控制器连接的外部sram。Cache使得低速Sram获取与高速TCM差不多的速度。使用Cache加速很有意义,不然400M的cpu变200M,相当于H7变F4,选择H7的cpu将变得没有意义。1 o! g% A' i; k F- v ![]() + T" h9 r: k. ?# P9 w ]" x/ s 内存类型- o" ~( x! T+ G; F* R, J 内存类型分为Normal以及Device和Strongly-ordered,* C" C/ b& r3 P ![]() ![]() & l, V% o0 N4 a9 ^- i3 q. q i* \" C6 h+ s& h/ v4 ^ Write-buffer是什么?. X8 X& K3 e! \7 k Device和Strongly-Ordered类型时候提到了write-buffer,它属于cpu核心,cache经常与write-buffer一起使用,使用writer-buffer的目的是将处理器和cache从较慢的对主存的写操作中脱离出来。: \/ ]6 X4 k7 X8 [' A7 R Write buffer可以缓存8个word的数据和4个独立的地址,可以enable或者disable使用ARM核心控制寄存器 W的bit3。同时还要受到内存管理页表的一个bit控制,所以使用Write-Buffer,MMU必须已经使能(控制寄存器的bit0)。MMU-Memory Management Unit 通常情况下的配置都是主内存允许bufferable,但是I/O 空间 unbufferable6 e2 a z3 e7 w% S, x; U6 O0 ^+ K 当CPU执行一个写操作时,根据配置情况执行写入操作。 ![]() ![]() 如果程序中使用DMB and DSB,处理器会等到write-buffer内指令完成,再进行后续指令操作,如果过程中发生中断,中断返回后继续write-buffer清空等待。 DMB或者DSB被称为 显式限制操作 explicit barrier。 ; f! ]. B. @& c ![]() Memory Attrabute Normal模式下可以设定的几种 ![]() 0 L- ?' Y/ D' |/ T+ y% r$ D- |, L Shareable属性) E6 ]8 @; ?! T# g 共享属性设计的意义在于,多个bus master读写情况下需要cache保持同步,对于CortexM7,只有L1-Cache,如果设置了Shared相当于non-cacheable。 ![]() ( ^* s1 r1 a( U5 `; J) N' {2 \ 内核操作函数 内核操作函数包含以下几种,主要包含两种操作:clean和invalidate。2 m9 |0 k/ U- w7 N clean:将cache中的信息写到sram,相当于用cache信息覆盖sram;5 e% S2 C# ?! d: B. `. D" n* W1 G invalidate:使cache失效,相当于用sram信息覆盖cache; 二者为相反的操作。 ) u3 I. `+ y& j. }2 y ![]() 7 G/ E. j! r B: Q) R4 K ^3 P ![]() . k$ L% X4 {" P' y- C 3 }; w+ o5 c1 I; d1 }, g! i! C5 u 内存对齐问题. J% f2 S+ `/ b/ v' W' b3 {6 m% Q 使用cache时,dma的buffer必须32byte对齐,不然可能会出现问题。比如下面的情况:; e% L+ K& {' V- u V! E R2 ?7 @9 _' a
如果DMA的buffer只有16字节,DMA读取操作后,DMA控制器将接收到的数据写到了sram里面,然后进入DMA接收中断函数,cpu把成功读取的标识bool变量写为true,实际上写操作只是写在D-Cache里面,暂时没有写到sram。 9 T6 k9 }3 U0 _$ W1 `3 L% ] ![]() 如果此时cpu需要读取dma内容,需要对Dcache进行invalid操作,32个字节将一起更新,bool变量旧值0将覆盖新值1。cpu读不到中断函数写的bool变量信息。$ {2 Z7 `- c5 I7 d/ D) n 4 Z: H/ i6 f3 G6 d" }- c5 [ ![]() + d, x7 L1 y8 l/ q2 ?7 t, f8 m 可见:( x) `" [3 f% ?' d0 j- a6 g0 s clean操作或者Invalidate操作都可能丢东西,使用上需要注意。经验是如果一段内存用来写dma外设,就不要读它,保证随时都可以clean;同样如果一段内存用来接收DMA外设传入信息,就不要用cpu写它,保证随时都可以invalidate。 % z3 H& N8 f) h& k, B; F ![]() - w% i h3 F2 V7 B1 }" O |
【Wio Lite AI视觉开发套件】+移植TensorFlow Lite
STM32H745I-DISCO脉冲宽度调制(PWM)
STM32H745I-DISCO串口通信,输入输出
拷打cubemx【002】——自定义还需基于芯片的工程
STM32硬件结构学习
STM32中BOOT的作用
STM32H7的TCM,SRAM等五块内存基础知识
STM32H7的TCM,SRAM等五块内存基础知识
简单了解一下STM32H7的BDMA
有奖预约 | STM32H7R7基于RT-Thread RTOS的智能终端GUI解决方案