全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 控制/MCU >

Cortex R52内核Cache的具体操作(2)

时间:2024-07-15 15:44

人气:

作者:admin

标签: 内核  指令  Cortex 

导读:本节内容主要讲述CortexR52内核Cache的具体操作包括使缓存无效(invalidate)操作,清除(clean)缓存。有的时候客户可能需要对cache做一些清理,比如invalidate,clean等操作。虽然目前在cor...

本节内容主要讲述CortexR52内核Cache的具体操作包括使缓存无效(invalidate)操作,清除(clean)缓存。有的时候客户可能需要对cache做一些清理,比如invalidate,clean等操作。虽然目前在cortex R52内核很少需要操作cache,但是本节依然给一些操作指导和实践,以备以后不时之须。

Cache Line缓存行的概念

操作cache相关指令需要通过汇编代码来操作,也都是以缓存行(Cache Line)为单位来进行操作。CortexR52缓存行的长度是64字节,比如下面的invalidate指令:

49d67ae8-427b-11ef-b8af-92fbcf53809c.png

点击可查看大图

指令的解释如下:

49eff9f0-427b-11ef-b8af-92fbcf53809c.png

点击可查看大图

1__asm volatile

这表示这是一段内联汇编代码,并且使用volatile关键字告诉编译器不要对这段代码做优化。

2"mcr p15, #0, %[bsc_sdram_cs3_mirror_space], c7, c6, #1 "

这是ARM处理器的指令。mcr是一个协处理器数据操作指令,用于向协处理器(如CP15)中的特定寄存器写入数据。在这里,它将数据写入到CP15寄存器中。p15, #0: 指定了协处理器的编号,这里表示CP15。

3%[bsc_sdram_cs3_mirror_space] "r" (n)

这里使用了内联汇编中的替换字符串(substitution strings),%[bsc_sdram_cs3_mirror_space] 用于指定一个替换占位符,它将在后面的 :: 部分中提供实际的值。"r" (n) 则表示使用寄存器(register)约束,这意味着n是一个变量。通常情况下,使用 "i" 约束表示将一个立即数直接嵌入到汇编指令中,而不是从变量中加载。但在你的代码中,你想要从一个变量中加载一个值传递给汇编指令。因此,你应该使用 "r" 约束来表示将一个寄存器中的值传递给汇编指令,而不是使用 "i"。

4:: 和 : "memory"

这两个部分是内联汇编的修饰符。:: 表示没有输出寄存器,"memory" 则表示该内联汇编代码可能会对内存进行读写操作,因此编译器需要考虑到内存屏障(memory barrier)的影响。

以RZT2M为例对cache作一些操作

1以rzt2m读取SDRAM为例,做一个打开和关闭cache的性能比较

SDRAM在代码中如果使用external Address sapce mirror的地址空间,那么开启和关闭cache的配置如下图所示:

4a11616c-427b-11ef-b8af-92fbcf53809c.png

点击可查看大图

4a4374b8-427b-11ef-b8af-92fbcf53809c.png

点击可查看大图

从上图可以看出关闭cache后读取数据的时间是打开cache后时间开销的十多倍。所以cache是否使能,性能差别十分显著。

2如果同样是读取10K bytes的数据,加上一起对cache invalidate/clean的操作之后,时间开销如下

4a69f7a0-427b-11ef-b8af-92fbcf53809c.png

点击可查看大图

上面的代码每读取sdram一次,都有对cache做操作。所以时间开销增加了很多,但是实际情况,是否需要频繁的操作cache需要看实际情况而定。注意每次对cache的操作都是以,cache line的长度(64字节)对cache做处理的。比如invalidate某段sdram地址对应的cache, 0x58000000-0x58000040, 那么对这段地址的invalidate操作是:

左右滑动查看完整内容

__asm volatile ( "mcr p15, #0 , %[bsc_sdram_cs3_mirror_sapce], c7, c6, #1      
"   /*DCIMVAC ->Invalidate data cache line by VA to PoC: test OK*/
::[bsc_sdram_cs3_mirror_sapce] "i" (0x58000000) : "memory");

注意代码中 "i" 与 "r" 的区别,在上文中已经有提到。

注意对cache的操作需要十分慎重,并且充分验证的情况下进行。

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信