当前位置: 首页 > news >正文

【ARM 嵌入式 C 入门及渐进 6.2 -- ARMv8 C 内嵌汇编读系统寄存器的函数实现】


请阅读【嵌入式开发学习必备专栏】


文章目录

    • ARMv8 C 内嵌汇编读系统寄存器

ARMv8 C 内嵌汇编读系统寄存器

要在ARMv8架构中通过C代码和内嵌汇编来读取系统寄存器s3_0_c15_c5_5的值,并将其返回,可以按照以下方式实现system_read_reg函数:

#include <stdint.h>uint64_t system_read_reg(void) 
{uint64_t val;__asm__ volatile("mrs %0, s3_0_c15_c5_5" // 使用mrs指令从寄存器读取值: "=r" (val) // 输出操作数,将读取的值存入val变量: // 没有输入操作数: // 没有破坏的寄存器列表);return val;
}

这里的解释如下:

  • __asm__ 关键字用于嵌入汇编代码,而 volatile 表示编译器不应优化此代码,因为它的执行可能会影响程序的状态。
  • "mrs %0, s3_0_c15_c5_5" 是汇编指令,其中 mrs 是从系统寄存器读取值的指令。s3_0_c15_c5_5 是源寄存器的名称,%0 代表这条指令的第一个(也是唯一的一个)输出操作数。
  • "=r" (val) 定义了一个输出操作数。这里 =r 表示使用任意的通用寄存器来存储输出值,并且这个值会被存入 val 变量中。等号 (=) 指明这是一个输出操作数。
  • 在冒号之后的两个空部分分别表示没有输入操作数和没有寄存器会被此指令破坏或改变(除了通过输出明确指定以外)。

通过上述方式,可以把系统寄存器s3_0_c15_c5_5中的值读取到一个uint64_t类型的变量中,并通过函数返回这个值。这种方法允许直接访问和操作ARM架构下特定的系统寄存器,但使用时需要确保有相应的权限,并且了解直接操作系统寄存器可能带来的风险。

http://www.lryc.cn/news/351278.html

相关文章:

  • 使用 LlamaParse 进行 PDF 解析并创建知识图谱
  • Oracle行迁移解析
  • 【k8s】 busybox镜像、挂载volume卷
  • 文本三剑客之 sed 编辑器
  • 【MySQL精通之路】SQL优化(1)-查询优化(3)-索引合并
  • Linux中安装配置并使用samba服务(Centos以及Ubuntu)
  • three.js能实现啥效果?看过来,这里都是它的菜(06)
  • 利用ESP32-C3将TF卡内容变成U盘进行读取
  • C++小病毒
  • 使用VUE3+TS+elementplus创建一个增加按钮
  • Python面试宝典:文件读写和上下文管理器以及输入输出流面试题(1000加python面试题助你轻松捕获大厂Offer)
  • Spring Boot | Spring Boot 实现 “记住我“ 功能
  • AGM AG32 MCU替代GD32F407/STM32F407的手持示波器方案
  • MongoDB基础入门到深入(八)MongoDB整合SpringBoot、Chang Streams
  • linux下的nfs概述与实验(openEuler22.03)
  • 影响Oracle数据库打开速度的因素
  • dify:开源 LLMOps平台。
  • CCF20220601——归一化处理
  • 用Ai编写一个电机驱动程序
  • 【C++入门】—— C++入门 (下)_内联函数
  • Java数据结构与算法(最小栈)
  • 7 Series FPGAs Integrated Block for PCI Express IP核 Advanced模式配置详解(三)
  • k8s 部署mqtt简介
  • 汇凯金业:量化交易中常用的数学模型有哪些
  • 局部直方图均衡化去雾算法
  • selenium环境安装和web自动化基础
  • 【UE Websocket】“WebSocket Server”插件使用记录
  • spring中依赖注入(DI)是什么?
  • paligemma、Grounding-DINO-1.5简单无需标注无需训练直接可以使用的VLM图像到文本模型
  • FreeRTOS学习——FreeRTOS队列(下)之队列创建