
STM32H7的Cache与Buffer2 t: G$ r+ N4 \3 `$ P% [ TCM和Cache的区别 …使用lwip用到了mpu,对于内存管理产生了很多的疑问,需要统一解决一下,不然用起来总有些不安。$ z e& c1 q+ g$ c4 P: z( J , z" S0 t% s! D* j4 z( j( O; F) M8 O STM32H7使用的内存不是连续的,而是被划分为多段。 3 ]8 o1 q; D" }$ O; g/ k7 N
TCM内存段是和CPU同频率的,不需要也不能用Cache。用好TCM的优先级应该排在用好Cache的前面。 Cache处于核心里面,作为低速内存加速器使用,获得增益最大的是位于AXI总线上的比如内部Flash、内部SRAM、通过FMC或者QSPI控制器连接的外部sram。Cache使得低速Sram获取与高速TCM差不多的速度。使用Cache加速很有意义,不然400M的cpu变200M,相当于H7变F4,选择H7的cpu将变得没有意义。/ d2 q: r* _: {% G2 ~. y% L$ X ![]() 内存类型) b$ O+ n P* I, l0 x 内存类型分为Normal以及Device和Strongly-ordered, ![]() ![]() , f2 ^+ I# `( g9 r0 D5 i6 T Write-buffer是什么? u) N2 J/ _: G2 y0 T0 J Device和Strongly-Ordered类型时候提到了write-buffer,它属于cpu核心,cache经常与write-buffer一起使用,使用writer-buffer的目的是将处理器和cache从较慢的对主存的写操作中脱离出来。 Write buffer可以缓存8个word的数据和4个独立的地址,可以enable或者disable使用ARM核心控制寄存器 W的bit3。同时还要受到内存管理页表的一个bit控制,所以使用Write-Buffer,MMU必须已经使能(控制寄存器的bit0)。MMU-Memory Management Unit- O" ]- P" E i, J! @% @ 通常情况下的配置都是主内存允许bufferable,但是I/O 空间 unbufferable& W& K/ h' o/ Z 当CPU执行一个写操作时,根据配置情况执行写入操作。' V% n# n" F! @. c7 R 0 F% h, U" W& | ![]() ; V( ], e, g* ` ![]() 0 |2 q, L2 {: c9 ]( k8 U* { 如果程序中使用DMB and DSB,处理器会等到write-buffer内指令完成,再进行后续指令操作,如果过程中发生中断,中断返回后继续write-buffer清空等待。3 o+ U5 ^0 B4 r9 F3 D* [5 O& g+ U! I DMB或者DSB被称为 显式限制操作 explicit barrier。9 u% F" L# B+ v6 _+ t" x1 P, R ![]() Memory Attrabute Normal模式下可以设定的几种 ( }! J- m0 h# x4 F3 _* E q ![]() Shareable属性# F; j% k g |- j3 B6 f( o 共享属性设计的意义在于,多个bus master读写情况下需要cache保持同步,对于CortexM7,只有L1-Cache,如果设置了Shared相当于non-cacheable。; u, s N& f) ~. v ![]() * B7 P" P: ^4 l. _' w 内核操作函数 内核操作函数包含以下几种,主要包含两种操作:clean和invalidate。- c* D. b4 {. S4 R- k$ _ clean:将cache中的信息写到sram,相当于用cache信息覆盖sram;$ y, V/ A0 V6 t) M* v( ?) J e) S invalidate:使cache失效,相当于用sram信息覆盖cache;& K! r$ u; V) y2 c |! n+ x 二者为相反的操作。6 t/ Z5 ?0 ~0 U4 `& G 9 @& y7 V1 G) x ![]() ![]() 6 P n4 N3 p2 Z/ G: a2 O; Z3 X ( |5 |' P7 X/ q1 @5 G 内存对齐问题 f1 w I$ j8 J, A 使用cache时,dma的buffer必须32byte对齐,不然可能会出现问题。比如下面的情况:
如果DMA的buffer只有16字节,DMA读取操作后,DMA控制器将接收到的数据写到了sram里面,然后进入DMA接收中断函数,cpu把成功读取的标识bool变量写为true,实际上写操作只是写在D-Cache里面,暂时没有写到sram。7 S0 `4 l& [* w2 Y" p ) E4 h+ y* d% z6 S7 ]! i) e+ C ![]() + V4 J- w" Y6 |5 N2 k( H 如果此时cpu需要读取dma内容,需要对Dcache进行invalid操作,32个字节将一起更新,bool变量旧值0将覆盖新值1。cpu读不到中断函数写的bool变量信息。- g" C4 {& e& ~$ B ![]() + j7 j5 S, E9 `# |- i, x# T 可见:: x; a, p8 t/ J6 K X# d h clean操作或者Invalidate操作都可能丢东西,使用上需要注意。经验是如果一段内存用来写dma外设,就不要读它,保证随时都可以clean;同样如果一段内存用来接收DMA外设传入信息,就不要用cpu写它,保证随时都可以invalidate。 # Y S4 q3 H& a4 A ![]() |
STM32H745I-DISCO串口打印
【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开发板试用 ——串口点灯测试