【ARMv8/v9 系统寄存器 5 -- ARMv8 Cache 控制寄存器 SCTRL_EL1 使用详细介绍】

关于ARM Cache 详细学习推荐专栏
【ARM Cache 专栏】
【ARM ACE Bus 与 Cache 专栏】


文章目录

    • ARMv8/v9 Cache 设置寄存器
      • ARMv8 指令 Cache 使能函数
      • 测试代码

ARMv8/v9 Cache 设置寄存器

关于寄存器SCTRL_EL1 的详细介绍见文章:【ARMv8/v9 异常模型入门及渐进2 - 系统控制寄存器 SCTRL_ELx 介绍】,这篇文章主要是介绍如果通过控制这个寄存器来 enable cache 和 disable cache的。
在这里插入图片描述
如上图所示,可以通过SCTRL_E1I 域 和 C 域来打开 指令cache和数据cache。接下来以使能指令cache为例进行简单介绍。

ARMv8 指令 Cache 使能函数

  • 打开指令 cache 汇编代码实现如下
.set CTRL_C_BIT,      (1 << 2)
.set CTRL_SA_BIT,     (1 << 3)
.set CTRL_I_BIT,      (1 << 12)func enable_icacheEL1_OR_EL2_OR_EL3 x1 
1: mrs     x0, sctlr_el1b       4f
2: mrs     x0, sctlr_el2b       4f
3: mrs     x0, sctlr_el3
4: and     x0, x0, #~CTRL_I_BITEL1_OR_EL2_OR_EL3 x1 
1: msr     sctlr_el1, x0b       4f
2: msr     sctlr_el2, x0b       4f
3: msr     sctlr_el3, x0
4: dsb     syisbret
endfunc enable_icache
  • 关闭指令 cache 的汇编代码实现如下
func disable_icacheEL1_OR_EL2_OR_EL3 x1 
1: mrs     x0, sctlr_el1b       4f
2: mrs     x0, sctlr_el2b       4f
3: mrs     x0, sctlr_el3
4: and     x0, x0, #~CTRL_I_BITEL1_OR_EL2_OR_EL3 x1 
1: msr     sctlr_el1, x0b       4f
2: msr     sctlr_el2, x0b       4f
3: msr     sctlr_el3, x0
4: dsb     syisbret
endfunc disable_icache

既然有了指令cache的开和关,那么我们简单看下,关闭指令cache和打开指令cache的芯片行程差异如何:

测试代码

void foo(void)
{for (volatile int i = 0; i < 0x10000; i++)i++;
}int icache_test(void *data)
{uint64_t start, end;enable_icache();start = syscnt();foo();end = syscnt();log_info("when icache enable, cost time: 0x%llx\n", end -start);disable_icache();start = syscnt();foo();end = syscnt();log_info("when icache disable, cost time: 0x%llx\n", end -start);return 0;
}

关于汇编宏EL1_OR_EL2_OR_EL3 的实现将文章:【ARMv8/v9 系统寄存器 6 – EL 异常等级判定寄存器 CurrentEL 使用详细将介绍】

测试结果
在这里插入图片描述
可以看到打开指令cache和关闭指令cache两者是有一定时间差的,随着测试量的加大这个时间差将会进一步加大,所以代码中一般都会将cache打开。

关于ARM Cache 详细学习推荐专栏
【ARM Cache 专栏】
【ARM ACE Bus 与 Cache 专栏】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/704787.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

char x[]---char*---string---sizeof

字符串数组 #include <iostream>int main(){char c_str[]"abcd";char c_str1[]{a,b,c,d};std::cout<<sizeof(c_str)<<std::endl;std::cout<<sizeof(c_str1)<<std::endl;return 0; } char*存储的字符串个数 char*字符串所占字节大小 c…

洛谷P1364 医院设置

P1364 医院设置 题目描述 设有一棵二叉树&#xff0c;如图&#xff1a; 其中&#xff0c;圈中的数字表示结点中居民的人口。圈边上数字表示结点编号&#xff0c;现在要求在某个结点上建立一个医院&#xff0c;使所有居民所走的路程之和为最小&#xff0c;同时约定&#xff0c…

【计算机毕业设计】springboot二手家电管理平台

时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;二手家电管理平台当然不能排除在外。二手家电管理平台是在实际应用和 软件工程的开发原理之上&#xff0c;运用java语言以及前台VUE框架&#xf…

【操作系统期末速成】​内存管理|内存的装入模块在装入内存的方式|分配管理方式|页面置换算法|页面置换

&#x1f3a5; 个人主页&#xff1a;深鱼~&#x1f525;收录专栏&#xff1a;操作系统&#x1f304;欢迎 &#x1f44d;点赞✍评论⭐收藏 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到…

每周一算法:恰好经过K条边的最短路

题目描述 牛站 给定一张由 M M M 条边构成的无向图&#xff0c;点的编号为 1 ∼ 1000 1\sim 1000 1∼1000 之间的整数。 求从起点 S S S 到终点 E E E 恰好经过 K K K 条边&#xff08;可以重复经过&#xff09;的最短路。 注意: 数据保证一定有解。 输入格式 第 1 …

万字长文破解 AI 图片生成算法-Stable diffusion (第一篇)

想象一下&#xff1a;你闭上眼睛&#xff0c;脑海中构思一个场景&#xff0c;用简短的语言描述出来&#xff0c;然后“啪”的一声&#xff0c;一张栩栩如生的图片就出现在你眼前。这不再是科幻小说里才有的情节&#xff0c;而是Stable Diffusion——一种前沿的AI图片生成算法—…

「AIGC」Python实现tokens算法

本文主要介绍通过python实现tokens统计,避免重复调用openai等官方api,开源节流。 一、设计思路 初始化tokenizer使用tokenizer将文本转换为tokens计算token的数量二、业务场景 2.1 首次加载依赖 2.2 执行业务逻辑 三、核心代码 from transformers import AutoTokenizer imp…

半小时搞懂STM32知识点——UART

1.UART 1.1为什么要使用UART这种协议?介绍一下UART及其特点 成本低&#xff0c;硬件简单&#xff0c;数据格式灵活&#xff1b; 低速全双工异步串行通信 1.2 UART数据帧格式&#xff1f; 起始位&#xff08;1&#xff09;&#xff0b;数据位&#xff08;5-8&#xff09; 校验位…

C语言详解:数组指针

数组指针是指针 int* p[10] 这是指针数组的写法 &#xff0c;因为【】的优先级比*高&#xff0c; 所以为了解决优先级问题&#xff0c;加&#xff08;&#xff09; int(* p)[10]&arr;//数组的地址要存起来 说明p是指针&#xff08;首先与*结合&#xff09;&#xff0c…

走进开源,拥抱开源

走进开源&#xff0c;拥抱开源 一、开源文化1.1 什么是开源1.2 为什么要开源1.3 有哪些开源协议 二、选择开源2.1 开源社区的类型与特点2.2 如何选择开源社区2.3 如何选择开源项目 三、参与开源3.1 开源社区的参与方式3.2 开源项目的参与方式 四、Apache Doris 参与示例4.1 Dor…

几个排序器的verilog及其资源占用、延时分析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 因为课题需要&#xff0c;调研了几个快速排序方法&#xff0c;并手写或者改进了若干待测试对象&#xff0c;包括记分板型冒泡排序&#xff08;这个是别人的&#xff09…