stm32 H7 DMA 串口发送,数据一致性问题

 STM32F7系列芯片集成了L1高速缓存,即L1 CACHE,包括D-CACHE和I-CACHE。它可以提高CPU访问数据或指令的速度,改善MCU的性能。关于STM32F7 L1 CACHE的应用,有个数据一致性问题须要注意,否则编程时可能会遇到些奇怪的现象。编程

 

    在聊这个话题以前,先说几个基本概念或术语。缓存

1、芯片复位后,I-CACHE,D-CACHE默认是关闭的。能够分别打开或关闭以及配置各自大小。性能

2、对于STM32F7来讲,只有通过AXI总线接口访问时才用到L1 CACHE。换句话,经过其它总线【TCM/AHBP/AHBS】作数据或指令访问时是不涉及到L1 CACHE的。spa

3、回写【WRITE BACK】:在写数据时,只是把数据写进D-CACHE而未写入二级存储器,并将缓存行里的数据标识为DIRTY,直到执行CACHE的清除操做才将D-CACHE里的内容写进二级存储器。.net

3、透写【WRITE THROUGH】:在写数据操做时同时将数据写入D-CACHE和二级存储器。这对于保持数据的一致性有好处,代码编写也相对简单。不过它须要消耗更多的写数据时间。固然,下次访问相同内容时仍是能够直接从缓存里读取。跟回写相比,算是一种折衷处理办法。blog

4、STM32F7片内外各个存储单元的存储属性是经过MPU来配置的。在芯片复位以后,MPU是默认关闭的,此时各存储单元的存储属性遵守以下的默认配置。接口

    好,那何时会发生数据一致性问题?内存

    当有CPU和其它主设备【如DMA】共同访问某可缓存的二级存储器比方SRAM1,同时该存储器又具备回写属性,此时就可能发生数据一致性问题。由于该存储器的回写属性,致使经过CPU欲写入存储器的数据只是缓冲在CACHE里,而没有及时写入存储器。若是此时DMA访问该二级存储器的话,读到的数据可能跟预期不一致。flash

    为了不数据不一致的问题,咱们须要作D-CACHE维护操做。通常有以下四种方法:软件

1、当对一个可缓存的二级存储器作了写数据操做以后,经过软件对D-CACHE进行清除操做,即运行SCB_CleanDCache()。这样将CACHE里的缓存内容写回到二级存储器,好比把那些DIRTY CACHE行的数据写进SRAM1。

2、经过MPU调整可缓存存储器的存储属性,将其CACHE使用方式改成透写模式。这样保证每次写入CACHE里的内容也同时写入二级存储器,好比写进SRAM1。

3、经过MPU调整可缓存存储器的存储属性,将其共享属性改成可共享的【SHAREABLE】。此后该二级存储器将变为不可缓存。

4、经过配置CACR寄存器中的D-CACHE位,强制将全部写操做配置为透写属性。

 

    固然,跟上面描述相对应的还有一种情形。那就是DMA更新了可缓存存储器好比SRAM1的数据后,CPU再去读SRAM1,此时也会发生数据不一致的问题。由于CPU此时读的数据仍是以前CACHE里的旧数据。为了不这个问题,保证数据的一致,就得在CPU读SRAM1以前经过软件执行CACHE失效操做,这样保证CPU直接从二级存储器比方SRAM1读取数据。

 

    下面有个关于数据一致性的实例供你们思考。

首先CPU从片上FLASH存储块aSRC_Const_Buffer的128字节常量数据拷贝到SRAM1里的一个名为pBuffer的缓存区。

而后CPU配置并使能DMA执行从内存到内存的传输,将SRAM1里pBuffer缓存区的数据传输到DTCM  RAM的另外一个aDST_Buffer缓存区。

最后,CPU将aDST_Buffer缓存区的数据与flash存储块aSRC_Const_Buffer的常量数据进行比较是否一致。

最后小结下,对于STM32F7系列MCU来讲,可能发生数据一致性问题须要的几个因素:

1、有CPU和DMA参与数据访问;

2、有被CPU和DMA共同访问的可缓存的带回写属性的物理存储块;

3、开启了D-CACHE;

 

https://blog.csdn.net/lu_embedded/article/details/78416041 这篇也讲的很透彻,从系统层讲的很细

相关文章
相关标签/搜索