STM32H7的Cache与Buffer TCM和Cache的区别 …使用lwip用到了mpu,对于内存管理产生了很多的疑问,需要统一解决一下,不然用起来总有些不安。 $ X1 v! j3 q8 g8 ~! Q STM32H7使用的内存不是连续的,而是被划分为多段。
TCM内存段是和CPU同频率的,不需要也不能用Cache。用好TCM的优先级应该排在用好Cache的前面。7 N/ z$ }% _, P! b9 ?9 X Cache处于核心里面,作为低速内存加速器使用,获得增益最大的是位于AXI总线上的比如内部Flash、内部SRAM、通过FMC或者QSPI控制器连接的外部sram。Cache使得低速Sram获取与高速TCM差不多的速度。使用Cache加速很有意义,不然400M的cpu变200M,相当于H7变F4,选择H7的cpu将变得没有意义。 " S7 t% _6 |: A$ `9 O2 }/ | 内存类型% y+ z2 m& } i! R1 z3 J 内存类型分为Normal以及Device和Strongly-ordered, - p% i2 ^1 @* S4 N; u! r# [ - v* r' t. F7 L3 o3 M Write-buffer是什么?7 w) M$ v3 p- ^) U: \$ q Device和Strongly-Ordered类型时候提到了write-buffer,它属于cpu核心,cache经常与write-buffer一起使用,使用writer-buffer的目的是将处理器和cache从较慢的对主存的写操作中脱离出来。! [# [3 Z; K# s) a Write buffer可以缓存8个word的数据和4个独立的地址,可以enable或者disable使用ARM核心控制寄存器 W的bit3。同时还要受到内存管理页表的一个bit控制,所以使用Write-Buffer,MMU必须已经使能(控制寄存器的bit0)。MMU-Memory Management Unit* w; H& v( X2 D; q, B6 V6 q4 x 通常情况下的配置都是主内存允许bufferable,但是I/O 空间 unbufferable 当CPU执行一个写操作时,根据配置情况执行写入操作。6 ]6 c, [: t$ o2 s! {6 b0 W5 r 6 R- ?( b# l9 s; @ , s2 v1 D& I) T: ?3 n- Z( I8 h0 c( g 如果程序中使用DMB and DSB,处理器会等到write-buffer内指令完成,再进行后续指令操作,如果过程中发生中断,中断返回后继续write-buffer清空等待。 . N* s9 |% U: f' C+ ~2 i' J, D DMB或者DSB被称为 显式限制操作 explicit barrier。+ ?# s9 o/ E: U/ @1 n f2 B! Z 2 {; L, k5 C! H4 o+ S, W i 3 z( ]9 K" A( [1 d2 @7 E2 g, Q- r9 d Memory Attrabute Normal模式下可以设定的几种 # h+ V, K6 ?* d/ S- Q2 W+ g, c# O1 k# O Shareable属性% e. G& }5 z% K o; n0 m1 G 共享属性设计的意义在于,多个bus master读写情况下需要cache保持同步,对于CortexM7,只有L1-Cache,如果设置了Shared相当于non-cacheable。% i& {+ q9 B. s8 E/ W6 u- n Z2 }- s' m- c0 G, @ 内核操作函数 内核操作函数包含以下几种,主要包含两种操作:clean和invalidate。, `$ N2 V8 i2 c8 y6 R6 m clean:将cache中的信息写到sram,相当于用cache信息覆盖sram; invalidate:使cache失效,相当于用sram信息覆盖cache; 二者为相反的操作。4 g$ `9 S; f1 R+ |4 N ' K! r$ j, C- S8 r7 ~ , F, H& T" g* R1 @' T0 C * c9 n/ y5 g* U' Q6 L6 f0 \, m" Q 内存对齐问题 使用cache时,dma的buffer必须32byte对齐,不然可能会出现问题。比如下面的情况:
0 t6 E. O2 n% Z! \3 J( ~ 如果DMA的buffer只有16字节,DMA读取操作后,DMA控制器将接收到的数据写到了sram里面,然后进入DMA接收中断函数,cpu把成功读取的标识bool变量写为true,实际上写操作只是写在D-Cache里面,暂时没有写到sram。% A' c% C+ k& l! C/ R0 I/ W 如果此时cpu需要读取dma内容,需要对Dcache进行invalid操作,32个字节将一起更新,bool变量旧值0将覆盖新值1。cpu读不到中断函数写的bool变量信息。* k( Q. d5 h0 v% M1 S 1 V A7 j* U7 l 可见: clean操作或者Invalidate操作都可能丢东西,使用上需要注意。经验是如果一段内存用来写dma外设,就不要读它,保证随时都可以clean;同样如果一段内存用来接收DMA外设传入信息,就不要用cpu写它,保证随时都可以invalidate。4 Y5 Y/ q# A; V+ [4 R8 V! a$ } ) w: D5 ?: v& c- M |
【经验分享】STM32_H7_ADC
STM32H7R/S高性能MCU:安全性,大存储和优异图显赋能更多应用创新
Stm32H7XX GCC下分散加载实现
【银杏科技ARM+FPGA双核心应用】STM32H7系列10——ADC
DIY-STM32H750核心板
[nucleo-H7A3ZI-Q]1-点亮一个皮皮灯
DIY-STM32H743核心板
【银杏科技ARM+FPGA双核心应用】STM32H7系列57——MDK_FLM
1月10日有奖直播 | 基于STM32 的CODESYS智能自动化解决方案
STM32的CAN FD位定时设置注意事项