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


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


文章目录

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

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

在ARMv8架构下,使用C语言结合内嵌汇编实现将一个值写入特定系统寄存器的函数可以按照下面的方法进行。

下面这个示例展示了如何将一个uint64_t类型的值写入到系统寄存器 s3_0_c15_c5_5中。

首先,要让C代码能够直接与寄存器交互,我们需要使用内嵌汇编(inline assembly)。ARM的内嵌汇编语法可以在GCC编译器中使用,它允许直接从C代码中执行汇编指令。

下面是一个简单的system_write_reg函数实现,该函数接受一个uint64_t类型的参数val,然后将这个值写入到s3_0_c15_c5_5寄存器中:

#include <stdint.h>void system_write_reg(uint64_t val) 
{asm volatile("msr s3_0_c15_c5_5, %0" // 使用msr指令写入寄存器: // 没有输出操作数: "r" (val) // 输入操作数,%0与val变量对应: // 没有破坏的寄存器列表);
}

解释:

  1. asm 关键字用于标记内嵌汇编的开始,而volatile告诉编译器不要优化这段代码,因为它可能会改变程序状态或者被程序状态所改变。
  2. "msr s3_0_c15_c5_5, %0" 是汇编指令,其中msr(Move to System Register)用于将值写入系统寄存器,s3_0_c15_c5_5是目标寄存器的名称,%0表示这行汇编代码中的第一个输入(在这个例子中,是val)。
  3. 输出部分(紧接在第一个冒号之后)在这个例子中是空的,因为我们没有向C代码返回任何值。
  4. 输入部分(第二个冒号之后)指定了我们的输入操作数。这里我们指定了"r" (val),意味着使用一个通用寄存器来存储val的值,并在汇编指令中通过%0引用它。
  5. 第三个冒号后面通常会跟着一个列表,指定了这段汇编代码可能会修改的寄存器,作为一种告知编译器的手段,以避免潜在的寄存器值冲突。在这个例子中,我们没有列出任何寄存器,因为msr指令的影响已经很明确了。

请注意,在实际的系统编程或驱动开发中,直接操作系统寄存器通常需要具备相应权限和确保与操作系统的兼容性,特别是在嵌入式系统或特定硬件平台上。确保你了解这些操作的后果,并在需要时获取相应的权限。

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

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

相关文章

[OpenGL] 法线贴图

目录 一 为什么要使用法线贴图 二 二种不同法线方式的使用 2.1 插值法线 2.1 法线贴图 本章节源码 点击此处 一 为什么要使用法线贴图 法线贴图我们可以使用更少的顶点表现出同样丰富的细节。高精度网格和使用法线贴图的低精度网格几乎区分不出来。所以法线贴图不仅看起来…

UE5中搭建一个简单的海岛

本文将用UE的WaterSystem与地形搭建一个简单的海岛&#xff0c;通过WaterSystem的参数设置&#xff0c;可以更好的自定义海岸线等效果。 1.基础风貌 1.1.首先新建一个Basic基础场景&#xff0c;切换到地形编辑模式刷出一块高地&#xff0c;用于沙滩。 1.2.引入UE官方插件Wat…

[IMX6ULL驱动开发]-Linux对中断的处理(一)

目录 中断概念的引入 ARM架构中断的流程 异常向量表 Linux系统对中断的处理 ARM对程序和中断的处理 Linux进程中断处理 中断概念的引入 如何理解中断&#xff0c;我们可以进行如下抽象。把CPU看做一个母亲&#xff0c;当它正在执行任务的时候&#xff0c;可以看为是一个母…

【BSP开发经验】简易文件系统digicapfs实现方式

文章目录 背景Linux vfs框架介绍数据结构系统调用openwriteread 总体框架 Linux 磁盘高速缓存机制标准文件访问同步文件访问异步文件访问buffer_head 如何实现一个简单的文件系统blkdevfs注册文件系统产生一个文件让文件变得可读可写 背景 在新的分区升级启动方案中需要分别实…

OGG几何内核-BRepBuilderAPI_MakeEdge学习

OGG几何内核fork自OCCT 7.7.0&#xff0c; BRepBuilderAPI_MakeEdge是几何内核的一个重要和基础的功能&#xff0c;也十分复杂&#xff0c;因为要支持line、circle、ellipse&#xff0c;parabola&#xff0c;hyperbola&#xff0c;circle&#xff0c;beziercurve&#xff0c;b…

springboot常用的注解

启动注解(Spring Boot 应用的入口注解)@SpringBootApplication @SpringBootApplication 是一个注解,它是 Spring Boot 应用的入口注解,用于表示一个应用程序的主类。这个注解通常被放置在包含 main() 方法的类上。@SpringBootApplication 是一个组合注解,整合了以下三个注…

亚马逊测评还能做吗?

只能说测评不是唯一的手段&#xff0c;但是推销量的一把好手。首先测评能让listing快速成长&#xff0c;短期内有望成为爆款&#xff0c;速度快&#xff0c;利润高&#xff0c;回款快。相对其他推广&#xff0c;测评无疑是有效&#xff0c;省培养listing的方法。其次新品前期太…

设计模式六大原则

开闭原则&#xff1a;对修改封闭&#xff0c;对拓展开放。 单一职责原则&#xff1a;类的功能要专一。 里氏代换原则&#xff1a;子类继承父类的时候&#xff0c;除添加新的方法完成新增功能外&#xff0c;尽量不要重写父类方法。 依赖倒转原则&#xff1a;类要依赖接口&…

Hsql每日一题 | day01

前言 就一直向前走吧&#xff0c;沿途的花终将绽放~ 题目&#xff1a;找出连续活跃3天及以上的用户 create table t_useractive(uid string,dt string );insert into t_useractive values(A,2023-10-01),(A,2023-10-02),(A,2023-10-03),(A,2023-10-04),(B,2023-10-01),(B…

代码随想录打卡第38天:动态规划解决编辑距离和回文串

1.72编辑距离 1.问题描述 找到其中需要进行操作的最少次数。 2.问题转换 大体思路可以参照前面的两个字符串的删除操作。添加操作可以将其看做是一个另类的删除操作&#xff0c;所以最后全部都可以看做是一个删除操作 3.解题思路 每一个位置的word1[i]和word2[j]都有两种…

RTOS原理和应用总结

RTOS的作用 RTOS一般应用在中低端处理器当中&#xff0c;这里举一个笔者日常开发遇到的案例来说明RTOS的作用。 假设你有一个设备&#xff0c;这个设备的外围硬件很多&#xff0c;假设有LED、一个网口、若干RS232等等。 在没有RTOS的时候&#xff0c;我们用裸机编程来写&…

HTML5 多媒体应用技术

目录 多媒体元素 audio元素video元素多媒体事件与JavaScript交互音频和视频轨道(Track)媒体API MediaElement APIMediaSource Extensions (MSE)Encrypted Media Extensions (EME)Web Audio API

数据库同步软件,天不生PanguSync万古如长夜

在信息时代的海洋中&#xff0c;数据是那永不熄灭的灯塔&#xff0c;照亮了科技发展的航道。然而&#xff0c;随着数据的膨胀和应用场景的多样化&#xff0c;如何确保这些宝贵资源在不同平台、不同设备间实时更新、保持一致性&#xff0c;便成了一道亟待解决的难题。于是&#…

Android File Transfer for mac(强大的安卓文件传输工具) 直装版

Android File Transfer是一款专门为Mac用户设计的软件&#xff0c;它用于在Android设备与Mac之间传输文件。这款软件提供了简单直观的操作界面&#xff0c;使用户能够轻松地在Android设备和Mac之间传输和管理文件。 下载地址&#xff1a;https://www.macz.com/mac/7099.html?i…

使用python实现socket进行消息传输-demo

Socket 是什么 Socket 是一种在计算机网络中用于实现进程间通信的一种机制。它是网络编程中的重要概念&#xff0c;通过它可以在不同的计算机之间进行数据传输和通信。Socket 可以用于实现各种网络应用&#xff0c;包括客户端-服务器模型、P2P 应用等。基本上&#xff0c;Sock…

自动驾驶决策规划算法——二次规划

自动驾驶决策规划算法第二章第二节(中) 参考线算法_哔哩哔哩_bilibili 动态规划开辟的凸空间如下&#xff0c;两条橙色线之间&#xff1a; 黄色的点就意味着L的上下界&#xff0c;物理意义是当轨迹ss1时&#xff0c;L的范围应该是(Lmin1,Lmax1)之间&#xff0c;这个范围就是开辟…

学习日记.1

今天就是配置了droidbot的环境。主要的知识来源是GitHub - xieincz/droidbot: A lightweight test input generator for Android. Similar to Monkey, but with more intelligence and cool features! 看readme&#xff0c;注意只需要platform就好&#xff0c;sdk太大不用下载…

《Ai企业知识库》-模型实践-rasa开源学习框架-基础理论-02

rasa官网 Conversational AI Platform | Superior Customer Experiences Start Here rasa简介&#xff1a; Rasa是一个开源的机器学习框架&#xff0c;专门用于构建自动化的文本和语音对话系统&#xff0c;即聊天机器人。它允许开发者和企业创建定制化的对话体验&#xff0c…

ubuntu设置root开机登录,允许root用户ssh远程登录

ubuntu与centos系统不同&#xff0c;默认root开机不能登录。 1、输入一下命令创建root密码&#xff0c;根据提示输入新密码 sudo passwd root 2、打开gdm-autologin文件&#xff0c;将auth required pam_succeed_if.so user ! root quiet_success这行注释掉&#xff0c;这行就…

el-upload 上传多个视频

<el-form-item label"视频" prop"video_url"><el-uploadclass"upload-demo"ref"uploadRef":multiple"true":on-change"handleChange":before-remove"beforeRemove":before-upload"before…