0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Cache技术在星辰处理器中的应用

痞子衡嵌入式 来源:安德鲁的设计笔记本 2023-08-29 17:28 次阅读

引言

目前,灵动微控制器产品体系中,适配了MicroPython的,有MM32F3(MM32F3273G9P,Arm Cortex-M3)和MM32F5(MM32F5277E9P,ArmChina STAR-MC1),从官方数据来看,使用星辰处理器(STAR-MC1)的MM32F5对指令的处理效率要高于使用Cortex-M3处理器的MM32F3。如图x所示。

9dcb042e-464c-11ee-a2ef-92fbcf53809c.png

figure-arm-core-benchmark 图x 星辰处理器同其他Arm处理器内核对比

然而,同一份MicroPython的启动过程,在使用同样主频(120MHz)的情况下,在MM32F5平台上运行,总是莫名其妙地慢好多。。。昨天跟同事Hao聊SDK的样例工程对Cache问题的处理策略时,偶然意识到,早期为MM32F5适配MicroPython的时候没有考虑过Cache,随即赶紧翻出来MicroPython的代码,果然没开。好吧,更新MicroPython项目下MM32F5平台的启动代码,替换来自于SDK中的system_mm32f5277e.c和system_mm32f5277e.h文件。

/*
*Copyright2022MindMotionMicroelectronicsCo.,Ltd.
*Allrightsreserved.
*
*SPDX-License-Identifier:BSD-3-Clause
*/


#include"hal_device_registers.h"

#ifdefined(__VTOR_PRESENT)&&(__VTOR_PRESENT==1U)
externuint32_t__VECTOR_TABLE;
#endif

voidSystemInit(void)
{

#ifdefined(__FPU_PRESENT)&&(__FPU_PRESENT==1U)
#ifdefined(__FPU_USED)&&(__FPU_USED==1u)
SCB->CPACR|=(SCB_CPACR_CP10_MASK|SCB_CPACR_CP11_MASK);/*setCP10,CP11FullAccess*/
#endif
#endif/*__FPU_PRESENT*/

#ifdefined(__ICACHE_PRESENT)&&(__ICACHE_PRESENT==1U)
#ifndefICACHE_DISABLED
if(SCB->CLIDR&SCB_CLIDR_IC_Msk)
{
SCB_EnableICache();
}
#endif/*DCACHE_DISABLED*/

#endif/*__ICACHE_PRESENT*/
#ifdefined(__DCACHE_PRESENT)&&(__DCACHE_PRESENT==1U)
#ifndefDCACHE_DISABLED
if(SCB->CLIDR&SCB_CLIDR_IC_Msk)
{
SCB_EnableDCache();
}
#endif/*DCACHE_DISABLED*/
#endif/*__DCACHE_PRESENT*/
}

/*EOF.*/

其中,如果没有调用SCB_EnableICache()和SCB_EnableDCache()函数,默认关闭ICache和DCache,配置宏__ICACHE_PRESENT和__DCACHE_PRESENT来自于MM32F5270的芯片头文件mm32f5277e.h。

#define__STAR_REV0x0100U/*Corerevisionr1p0*/
#define__SAUREGION_PRESENT0U/*SAUregionspresent*/
#define__MPU_PRESENT1U/*MPUpresent*/
#define__VTOR_PRESENT1U/*VTORpresent*/
#define__NVIC_PRIO_BITS3U/*NumberofBitsusedforPriorityLevels*/
#define__Vendor_SysTickConfig0U/*Setto1ifdifferentSysTickConfigisused*/
#define__FPU_PRESENT1U/*FPUpresent*/
#define__DSP_PRESENT1U/*DSPextensionpresent*/
#define__ICACHE_PRESENT1U/*DefineifanICACHEispresentornot*/
#define__DCACHE_PRESENT1U/*DefineifanDCACHEispresentornot*/

编译,验证。找来两块之前下载了MicroPython固件的MM32F5开发板,向其中一块板子下载启用ICache和DCache之后的新固件。运行程序后,同使用之前版本固件的程序相比,果然有明显的提升。如图x所示。

9ddcc740-464c-11ee-a2ef-92fbcf53809c.gif

video-mm32f5-micropython 图x 启用Cache前后的MicroPython启动过程对比实物

图中板子运行程序启动MicroPython启动流程后,执行文件系统中Python源文件,闪烁小灯。图中下方的板子使用了启用Cache的程序,明显先完成MicroPython启动过程,先开始执行闪烁小灯的程序。

提交更新到代码仓库。Bingo!

commit46372ed15d5769b25775a209c56d62c4cfc3ac5d(HEAD->master,origin/master,origin/HEAD)
Author:AndrewSU
Date:WedJun1411062023+0800

updatethestartupcodetoenabletheicacheformm32f5.

-thisfixwouldacceleratethespeedofrunningtheinstruction
sequenceonmm32f5,whichhastheicacheanddcacheintegrated.

Signed-off-by:AndrewSU

启用Cache后,之前在MM32F5微控制器平台上运行MicroPython小概率会出现hardfault的问题也得到的缓解,颇有“治好了某人多年老寒腿”的赶脚。^v^。

Cache的工作原理

Cache主要解决高速的CPU访问低速的存储器均衡速度差的问题,Cache通过预取数据/命令的机制,低速但整块地从低速存储器中取数据块,然后快速但串行地向CPU送数据流。高速的处理器大多使用哈佛结构,即使用指令总线和数据总线分别取指令和数据,对应有ICache和DCache。

Cache能够有效工作基于几个基本前提:

空间局部性:在最近的未来,使用到的信息和当前使用的信息在空间上会是邻近的。这个因为数据大部分都是连续存储的。所以主存当中的数据都是成块传输到Cache当中。

时间局部性:在最近的未来,使用到的信息可能是当前正在使用的信息。由于CPU本质上一个死循环,里面还有很多小循环的运行和操作,所以当前使用到的数据很可能会在循环当中,这样当前的数据有可能会在将来在再被调用一次。

另外,关于Cache还有其余部分需要了解:

Cache与主存的映射方式:解决主存内数据块和Cache当中数据块的对应关系。

替换算法:Cache小,主存大。如果Cache中数据存满了之后,如何操作。

Cache写策略:如果CPU修改了Cache中的副本,如何确保Cache中的数据和主存中的母本数据保持一致。

关于Cache的工作原理,以及设计机制,可参考计算机专业考研四大专业课之《计算机体系结构》,以及参考文献中的《一文搞懂Cache基本原理》。

需要关闭DCache的情况

在微控制器系统中,有时会需要直接使用内存里的数据同外设交互,而不进入CPU,例如使用DMA(另一个总线主机AHB Master,但不需要Cache功能)相关,这种场景下,使用Cache的意义就不大了,甚至可能会出现数据不一致的风险,此时,就需要关闭Cache才能让系统正常工作。具体来说,ICache可以继续启用,毕竟指令都是送到CPU中执行,但DCache需要关掉,否则通过CPU写入到内存的数据未能及时同步物理内存时(基于Cache的写策略),启动DMA时搬运的数据不一定是实际需要传送的数据。另外,所有使用到“内嵌”DMA的外设模块的工程中,也需要小心谨慎地使用DCache,例如一些USB外设、ENET外设、显示加速器、以数据块为操作单元的加速计算模块等。

关ICache的情况虽然不多,但也存在,例如在涉及IAP应用中,从存放指令的介质中擦除指令、写入新指令后,再读指令,实际的新指令可能尚未替换到ICache中存放的旧指令,导致程序执行错误。

鱼和熊掌都想要

关闭DCache之后,CPU读数据的速度会明显慢很多,例如本文一开始展现的情况。怎样才能提升访问访问速度的同时,又能确保数据一致性呢?总不会人为频繁地开关Cache吧(很多微控制器对启动Cache的时机也有特别要求,需要在运行应用程序的一开始就要开启)。这里有两种可能的思路,供大家参考:

使用内存保护单元MPU

使用内存隔离/同步指令

这两种方法,分别是在空间上和时间上对数据进行隔离,控制仅在必要的空间上或时间上启用和关闭Cache。

使用内存保护单元MPU

MPU(Memory Protection Unit)内存保护单元在ARMv7-M架构下被引入。在 ARMv7-M架构下,Cortex-M3和Cortex-M4处理器对 MPU 都是选配的,不是必须的。ARMv8-M架构下继续沿用了MPU,星辰处理器STAR-MC1就使用了ARMv8-M。

MPU是一个可以编程的设备模块,可用来定义内存空间的属性,比如特权指令和非特权指令,以及Cache是否可访问。ARMv7-M通常支持8个region,每个region 代表一段连续的区域。

关于MPU的用法,可参见参考文献中的《ARM-MPU内存保护单元详解》和《Armv8-M Architecture Reference Manual》。

使用内存隔离/同步指令

ARM的指令集中,有内存隔离指令DMB(Data Memory Barrier)、DSB(Data Synchronization Barrier)和ISB(Instruction Synchronization Barrier):

数据存储器隔离。DMB 指令保证:仅当所有在它前面的存储器访问操作都执行完毕后,才提交(commit)在它后面的存储器访问操作。

数据同步隔离。比 DMB 严格:仅当所有在它前面的存储器访问操作都执行完毕后,才执行在它后面的指令(亦即任何指令都要等待存储器访问操作——译者注)。

指令同步隔离。最严格:它会清洗流水线,以保证所有它前面的指令都执行完毕之后,才执行它后面的指令。

在一些ARM程序代码中,会用到__DSB() 指令,特别是在一些中断处理函数中。例如:

//中断定时器PIT中断处理函数
voidPIT_LED_HANDLER(void)
{
/*Clearinterruptflag.*/
PIT_ClearStatusFlags(PIT,kPIT_Chnl_0,kPIT_TimerFlag);
pitIsrFlag=true;
__DSB();
}

程序通过中断信号进入中断处理函数时,首先应当清除相应的中断标志位,但有些CPU的时钟太快,快于中断使用的时钟,就会出现清除中断标志的动作还未完成,CPU就又一次重新进入同一个中断处理函数,导致死循环,__DSB() 指令的作用就是避免上述情况的发生。

总结

本文从修复MicroPython启动程序在MM32F5微控制器上比较慢的问题,体验了星辰处理器中Cache的作用。简单介绍了Cache的工作原理和机制,重点介绍了使用Cache可能存在的风险,并进一步探讨了如何能用到Cache高速存取的同时避免数据不一致的情况。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    6812

    浏览量

    147648
  • 处理器
    +关注

    关注

    68

    文章

    18288

    浏览量

    222176
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41027
  • 定时器
    +关注

    关注

    23

    文章

    3148

    浏览量

    112043
  • Cache
    +关注

    关注

    0

    文章

    127

    浏览量

    27984

原文标题:Cache技术在星辰处理器中的应用

文章出处:【微信号:pzh_mcu,微信公众号:痞子衡嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Arm中国自主研发坚挺,星辰处理器正式商用!

    电子发烧友网报道 (文/黄晶晶) 前段时间处于风口浪尖的Arm事件似乎已逐渐平息,外界对Arm中国始终怀着一份神秘感。就在最近,Arm中国召开的星辰处理器分享会上,Arm中国CEO吴雄昂特别在线做了
    的头像 发表于 07-15 09:27 7991次阅读

    多核处理器设计九大要素

    机)节点集成到同一芯片内,各个处理器并行执行不同的线程或进程。基于SMP结构的单芯片多处理处理器之间通过片外
    发表于 04-13 09:48

    如何实现Arm处理器ICache的测试?

    处理器涉及到的主存块内容。需要读取数据是,处理器可能就会从Cache读取需要的数据,而不是从主存
    发表于 08-31 16:30

    【经验】如何实现Arm处理器ICache的测试

    处理器涉及到的主存块内容。需要读取数据是,处理器可能就会从Cache读取需要的数据,而不是从主存
    发表于 10-13 18:02

    嵌入式处理器Cache一致性问题怎么解决?

    随着嵌入式计算机应用的发展,嵌入式CPU的主频不断提高,这就造成了慢速系统存储不能匹配高速CPU处理能力的情况。为了解决这个问题,许多高性能的嵌入式处理器内部集成了高速缓存Cache
    发表于 09-05 07:00

    处理器在读内存的过程,CPU核、cache、MMU如何协同工作?

    处理器中断处理的过程是怎样的?处理器在读内存的过程,CPU核、cache、MMU如何协同工作?
    发表于 10-18 08:57

    ARM处理器使用虚拟地址来提供cache index和cache tag

    早期的ARM处理器使用虚拟地址(virtual addresses)来提供cache index和cache tag。VIVT优点这样做的好处是处理器内核可以使用虚拟地址进行
    发表于 06-20 15:22

    星辰处理器是什么样的内核?相较于Arm Cortex-M系列内核又有什么差别

    比提高内核性能本身还要来得明显。而提升存储访问效率的方法往往有两个:层次化设计(Memory Hierarchy)层次化设计的核心是缓存(Cache)。嵌入式系统处理器运行速度远
    发表于 09-06 15:03

    ARM处理器的逻辑cache和物理cache是什么

    ARM处理器的逻辑cache和物理cache是什么?有没有哪位大神可以帮忙解决一下这个问题
    发表于 11-03 15:25

    ARM应用处理器Cache level进化历史阐述

    level之间的关系设计, 如何更高效的做推测性的cache prefetch。另外随着多核技术的发展,如何更有能效(比如大小核)的,高效的实现cache一致性也是重要的技术。以下阐
    发表于 12-14 16:17

    处理器中非阻塞cache技术的研究

    现代高速处理器的设计中对于cache技术的研究已经成为了提高处理器性能的关键技术,本文针对在流水线结构中采用非阻塞
    发表于 12-28 09:54 8次下载

    安谋中国“星辰处理器正式商用

    据安谋中国产品研发副总裁刘澍介绍,“星辰处理器是安谋中国IoT应用处理器的产品系列,名称寓意“成为中国冉冉升起的启明星,为产业带来更多赋能”。
    发表于 07-09 14:30 1207次阅读

    星辰处理器是什么样的内核?

    如果用一句话介绍“星辰处理器,那就是:安谋科技设计的一款基于 Armv8-M 架构的嵌入式处理器。这里,安谋科技是中国最大的芯片设计 IP 开发与服务供应商,而灵动微电子则是从安谋科技获得了该
    的头像 发表于 06-08 09:11 3071次阅读

    小编科普一下超标量处理器中的Cache

    L1 Cache和L2 Cache通常和处理器是在一块实现的。在SoC中,主存和处理器之间通过总线SYSBUS连接起来。
    的头像 发表于 01-08 10:56 637次阅读

    Cache技术星辰处理器中的应用

    STAR-MC1),从官方数据来看,使用星辰处理器(STAR-MC1)的MM32F5对指令的处理效率要高于使用Cortex-M3处理器的MM32F3。如图x所示。
    发表于 07-21 15:08 360次阅读
    <b class='flag-5'>Cache</b><b class='flag-5'>技术</b>在<b class='flag-5'>星辰</b><b class='flag-5'>处理器</b>中的应用