
STM32H7的Cache与Buffer TCM和Cache的区别2 Q& ~ R, Y4 u: j' @1 {5 I …使用lwip用到了mpu,对于内存管理产生了很多的疑问,需要统一解决一下,不然用起来总有些不安。( Y4 J6 G! w6 w- n STM32H7使用的内存不是连续的,而是被划分为多段。" Y3 v5 x, J2 y' s1 z5 g/ P 0 G2 E9 @+ E% r6 X4 t( F- ^
TCM内存段是和CPU同频率的,不需要也不能用Cache。用好TCM的优先级应该排在用好Cache的前面。; l1 M6 `: D- W d$ ] H Cache处于核心里面,作为低速内存加速器使用,获得增益最大的是位于AXI总线上的比如内部Flash、内部SRAM、通过FMC或者QSPI控制器连接的外部sram。Cache使得低速Sram获取与高速TCM差不多的速度。使用Cache加速很有意义,不然400M的cpu变200M,相当于H7变F4,选择H7的cpu将变得没有意义。 ![]() 内存类型0 P# y! @1 Q# t 内存类型分为Normal以及Device和Strongly-ordered, ![]() ![]() % ^& w5 [6 _( s d4 x! |8 I # e7 }$ u# v$ G4 Z. u& H* i2 J Write-buffer是什么?+ u: F/ E. Z; z$ h Device和Strongly-Ordered类型时候提到了write-buffer,它属于cpu核心,cache经常与write-buffer一起使用,使用writer-buffer的目的是将处理器和cache从较慢的对主存的写操作中脱离出来。& j; d; W" W% A1 o. o4 n Write buffer可以缓存8个word的数据和4个独立的地址,可以enable或者disable使用ARM核心控制寄存器 W的bit3。同时还要受到内存管理页表的一个bit控制,所以使用Write-Buffer,MMU必须已经使能(控制寄存器的bit0)。MMU-Memory Management Unit 通常情况下的配置都是主内存允许bufferable,但是I/O 空间 unbufferable 当CPU执行一个写操作时,根据配置情况执行写入操作。: K1 w" C% Z( h4 ^ ^* i 3 h: j% m' l* z( o& y" } ![]() , A) m6 S8 B, ` ![]() 8 ~- e; w0 @4 m+ Q; W! I, s 如果程序中使用DMB and DSB,处理器会等到write-buffer内指令完成,再进行后续指令操作,如果过程中发生中断,中断返回后继续write-buffer清空等待。! L. s2 n [2 S: _2 a ) B+ X" ?, G* t( O, | DMB或者DSB被称为 显式限制操作 explicit barrier。: E8 | r) f% n7 O$ X ![]() / e; I8 u. a- i2 G* R: c5 w Memory Attrabute, h F- E+ k( U5 U Normal模式下可以设定的几种( z. ^9 d- i3 l4 a& X5 \ 1 K0 @6 ?. _% w ]8 l2 a ![]() ( t G# q9 O" R% ?7 P4 B Shareable属性! a% \0 `1 [. H% g* x 共享属性设计的意义在于,多个bus master读写情况下需要cache保持同步,对于CortexM7,只有L1-Cache,如果设置了Shared相当于non-cacheable。 ![]() 内核操作函数' v* S$ F5 _8 N6 e/ ]( D! t 内核操作函数包含以下几种,主要包含两种操作:clean和invalidate。 clean:将cache中的信息写到sram,相当于用cache信息覆盖sram;! j) }0 n" c5 f6 Y& C% [- `4 p+ i invalidate:使cache失效,相当于用sram信息覆盖cache; 二者为相反的操作。 3 a2 R5 N% P3 `3 B5 ~) {3 v" L& r' @ ![]() ![]() 9 U2 B1 r3 H4 q# M: O6 } 内存对齐问题 使用cache时,dma的buffer必须32byte对齐,不然可能会出现问题。比如下面的情况: + `7 D3 i0 w: y' b. i
如果DMA的buffer只有16字节,DMA读取操作后,DMA控制器将接收到的数据写到了sram里面,然后进入DMA接收中断函数,cpu把成功读取的标识bool变量写为true,实际上写操作只是写在D-Cache里面,暂时没有写到sram。 ' _" \" W3 C Y0 k/ ?4 y. p ![]() & |, S0 v! ]# @+ n; @ 如果此时cpu需要读取dma内容,需要对Dcache进行invalid操作,32个字节将一起更新,bool变量旧值0将覆盖新值1。cpu读不到中断函数写的bool变量信息。( a+ s- t, h0 o$ S ![]() 7 m q2 j* m; y9 `8 j 可见:$ K" |0 x& R% D5 b, \. B* ^; | clean操作或者Invalidate操作都可能丢东西,使用上需要注意。经验是如果一段内存用来写dma外设,就不要读它,保证随时都可以clean;同样如果一段内存用来接收DMA外设传入信息,就不要用cpu写它,保证随时都可以invalidate。2 N$ P% y' {: Q4 t0 ? & v9 B* M! ~/ [/ A) {2 J+ R/ a* H ![]() - S' P( Y) K7 L7 v+ ? |
【STM32H745I-DISCO】TouchGFX探索——3、触屏滑屏操作与中文显示
TouchGFX软件下载及使用
【STM32H745I-DISCO】TouchGFX探索——2、照葫芦画瓢
STM32H745I-DISCO硬件信号为空,M4、M7对于硬件信号的优先性判断
【STM32H745I-DISCO】TouchGFX探索——1、Example移植
STM32H745I-DISCO的GUI DEMO板摸索2-双核通讯
【STM32H745I-DISCO】基于CubeIDE的双核芯编程工程建立,以及双核间的通信测试
【STM32H745I-DISCO GuiDemo 】GuiDemo 基本工程搭建
NUCLEO-H723ZG开发板试用 ——串口点灯测试
兔哥的杂谈【002】——如何性价比更高地去编译STM32