|
有STM32用户使用STM32H743芯片开发产品,其中用到ADC,通过DMA提取ADC结果并存放在相应内存区域,然后经CPU将这批结果拷贝到另外区域使用。咨询如何做MPU配置及缓存维护让这个拷贝操作尽量快捷。 STM32H7系列芯片采用双时钟域架构D1、D2和D3),配备灵活的MPU和Cache缓存机制。合理配置缓存策略及实施缓存维护操作对系统性能和数据一致性至关重要。本文基于STM32H743芯片,方向性地测试统计了不同MPU缓存配置下,数据在D1或D2以及D1域和D2域之间域进行拷贝的时间开销,并观察MPU配置和Cache维护对性能及数据正确性的影响,给有需要的人以方向性的参考。 先简单介绍下测试环境与方法。 芯片平台:STM32H743开发板 使用的IDE: ARM Keil MDK v5.42 计时工具:TIM2定时器,用于测量数据拷贝耗时 缓存配置:涉及写回WB和写回写分配WBWA缓存策略,包括针对指令缓存和数据缓存的开启与关闭 缓存维护操作:清理缓存(Clean)、无效缓存(Invalidate)、 清理并无效缓存(CleanInvalidate)。 数据拷贝方向:D1域→D1域、D1域→D2域、D2域→D1域、D2域→D2域 测试代码示例【下面以从D2域→D1域为例】
计时方式:TIM2计数器测量拷贝耗时,数据以计数时钟个数为单位。 上面示例代码为将数据从D2拷贝到D1,其他方向如D1->D2操作类似。 在代码中的准备好源数据后,可能会用到某种缓存维护操作。缓存维护是保证CPU缓存与主存数据一致性的关键手段。这里对可能用到的三个函数稍加解读。
功能:将指定地址范围内的缓存行中脏数据写回主存,但不使缓存行失效(缓存行内容仍保留在缓存中)。 适用场景:当CPU修改了缓存数据,需要确保主存数据同步,但后续仍会频繁访问该缓存行,保持缓存有效以提升性能。 效果:主存数据更新,缓存数据有效且最新。
功能:先执行清理(Clean)操作,将脏缓存行写回主存,然后执行失效(Invalidate)操作,使缓存行失效(数据从缓存中移除)。 适用场景:当CPU修改缓存数据后,且后续访问需要从主存重新加载数据,确保缓存和主存内容同步。 效果:主存数据更新,缓存行被清空,后续访问需重新加载。
功能:使指定地址范围内的缓存行失效,但不写回脏数据。 适用场景:当外设(比如DMA)修改了主存数据,CPU需要丢弃缓存中可能过时的数据,强制从主存重新读取。 效果:缓存行被清空,主存数据保持不变。 风险:如果缓存中有脏数据未写回,直接失效会导致数据丢失,可能引发数据错误。 我根据数据的不同拷贝方向和不同的MPU配置以及Cache维护策略,将测试数据放在下面表格里。MPU配置我这里只用到WT和WBWA,起初也是配合咨询者的测试。
这个表格纵方向看分7栏,第1栏是各种测试情形编号,第2栏到第5栏表示不同的拷贝方向,比方是从D1拷贝到D1,还是从D2拷贝到D1,或者同区拷贝等。第6栏代表Cache的开关及mpu配置,第7栏代表源数据准备好后做了怎样的Cache维护操作。 这个表格从横方向看分11行,第1行内容不言而喻,刚介绍了。从第2行【对应case 1】到第11行【对应 case 10】展示了不同情形下的配置及拷贝耗时。 这里的10种情形可以分成四大类,表格以不同颜色区分。 第一大类,关闭I/D cache时的拷贝耗时,整体上是最长的。从测试结果来看,case 9和case 10的D2->D2的拷贝情形有点特别,值得玩味。 第二大类,关闭D-Cache但开启I-Cache的情形,即表格中case 2的粉色行。 第三大类,开启I/D cache,并将源端、目的端RAM的MPU属性配置为WB。 第三大类里又分Case /4/5/6四种情形,差别在于当准备完源数据后,使用了不同的Cache维护操作。其实四种测试结果是一样的。原因请根据当前MPU配置来思考。 第四大类,开启I/D cache,并将源端、目的端的RAM的MPU属性配置为WBWA。 第四大类里也分Case7/8/9/10四种情形,差别也在于准备完源数据后,使用了不同的Cache维护策略。这四种情形的测试结果不全一样,又可以分为两小类,case7、 case8为同一小类,case9、 case10又为另一小类。 这里顺便对Case 3和Case 7的Cache维护策略说明下,这里是说当源数据准备好之后,不再专门调用Cache维护函数执行任何操作,直接进入拷贝环节。 从上面表格的测试结果来看,Case 7和Case 8是表现最佳的。当然,说本质上二者是同一情形。 另外,对于Case 10情形下的拷贝,结果是失败的,即源数据并没有被正确地拷贝进目的存储区。 强调一下,我这里准备源数据是通过CPU循环赋值完成的,CPU对存储区的访问可能涉及Cache分配及使用,这点跟咨询者的应用场景还有点明显不同,在他的应用里,源数据是DMA准备的,他顶多可以选择让DMA将数据存放在不同的域,但DMA访问存储区是不涉及Cache的,更没有因它而产生Cache分配的说法。这么说来,咨询者的应用情形可能对应于上面的Case 9或Case 3,当然也可能是表格中未罗列的其它情形,因为我这里配置MPU时源区和目的区都是一样的,其实两个区可以选择不同的MPU配置。 另外,我没有将WT放进来一起测试,主要考虑到组合越多,测试也就越费时。还有就是这种配置肯定不符合咨询者的快捷之期望。因而就没有放进来测试,有兴趣的可以自行验证测试。 这里算作抛砖引玉,我在此仅对上面测试结果做了简单陈述,未能逐个分析比较。有兴趣的可以基于表格中的情形及数据自行做进一步的思考、评估与验证。比方Case 10为什么会拷贝失败?Case 8与Case 9的差异是怎么产生的?我们可以通过这些具体的数据比较来更加直观而真切地理解MPU配置及相关Cache维护策略。 文章出处:茶话MCU |
【STM32U3 评测】CAN基本通讯测试
STM32H750 外扩 QSPI FLASH 跑 2 小时就死机?LAT1151 官方根治方案
STM32H723 多通道序列 ADC 启动不了?寄存器操作必须等 ADRDY 就绪
经验分享 | STM32H7 LPTIM+DMAMUX+BDMA应用演示
经验分享 | STM32H7系列ADC DMA传输异常案例分享
经验分享 | STM32H7 MDMA 与通用DMA的联动传输示例
STM32H750 基于 Keil 制作 QSPI 外部 Flash 下载算法 全流程实操指南
STM32H743 BDMA+LPTIM+LPUART应用演示
经验分享 | STM32H723 SPI 通讯异常排查:实时观察窗口的 “隐形干扰” 解决方案
经验分享 | STM32H7 SPI NSS 脉冲模式灵活应用:解决外置 ADC 通信干扰问题
微信公众号
手机版