Caching ARM:使用缓存加速关键代码

Caching ARM:使用缓存加速关键代码,caching,optimization,arm,Caching,Optimization,Arm,假设我有一个嵌入式项目(如果有区别的话,使用armcortex-M),其中部分代码是关键的,需要尽可能在确定的时间内快速运行 是否可以牺牲一级缓存的一部分,并将其保留用于关键代码/数据?然后我可以加载关键代码/数据,并始终以一级缓存的速度运行/访问它们。好的,我认为答案是“从技术上讲,不是”。作为缓存分配的内存被缓存控制器用来做它应该做的事情,这就是缓存 因此,希望芯片供应商提供了从可用的最快内存运行代码的方法。如果芯片有TCM,那么在那里加载关键代码应该很好,并以缓存在一级缓存中时的速度运行。

假设我有一个嵌入式项目(如果有区别的话,使用armcortex-M),其中部分代码是关键的,需要尽可能在确定的时间内快速运行

是否可以牺牲一级缓存的一部分,并将其保留用于关键代码/数据?然后我可以加载关键代码/数据,并始终以一级缓存的速度运行/访问它们。

好的,我认为答案是“从技术上讲,不是”。作为缓存分配的内存被缓存控制器用来做它应该做的事情,这就是缓存

因此,希望芯片供应商提供了从可用的最快内存运行代码的方法。如果芯片有TCM,那么在那里加载关键代码应该很好,并以缓存在一级缓存中时的速度运行。如果芯片提供闪存和RAM,那么在RAM上加载关键代码也应该快得多。在后一种情况下,缓存控制器(如果存在)可以配置为使用相同的RAM运行缓存代码。

是的,可能:

TB3186 “如何使用aCortex实现确定性代码性能™-M高速缓存控制器“

。。。
有了CMCC,缓存的一部分可以作为确定代码性能的TCM,方法是以某种方式加载关键代码并将其锁定。当某一特定方式被锁定时,中国移动不会将锁定方式用于例行缓存事务。加载关键代码的锁定缓存方式充当了一种始终获得缓存命中的条件。

一些ARM微控制器可能具有紧密耦合内存(TCM),这基本上就是您所要求的。因此TCM的速度与一级缓存相同?几乎所有的sram通常都比闪存快,闪存的最佳速度通常是sram速度的一半,最差时慢几倍。简单地将代码移动到sram可能会给您带来提升,那么我建议您只需打开缓存即可缓存它。确定性不一定会发生,你必须控制对齐和其他一些事情。如果不小心/意识到添加或删除指令可能会改变关键部分的整体性能,而不仅仅是该指令的一个时钟,但对于cortex-m,一次只能获取一个或两个指令,不像big brother,它更像是一次8个或16个指令(其中对齐惩罚更为严重). 但是,打开缓存后,您可能会获得更多的缓存惩罚,这取决于缓存的工作方式……从ram开始,检查您的芯片文档,看看它们是否有TCM或其他解决方案,例如STM32在闪存前面有一个缓存,您无法关闭,对于小型基准测试,如紧密循环,会产生性能错觉,但在现实世界中,程序可能不会跳转,并且可能会显示实际的闪存性能。即使我们不使用TCM,我们也会使用这个技巧将程序加载到比ROM快得多的(非常)快速的板载静态RAM中。