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

【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指令的影响已经很明确了。

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

相关文章:

  • pl/sql基础语法操作
  • Day 39 防火墙技术Firewalld
  • 深入理解数仓开发(一)数据技术篇之日志采集
  • git会忽略我们工作改动中的大小写
  • AcWing 831. KMP字符串——算法基础课题解
  • Java基础(三)- 多线程、网络通信、单元测试、反射、注解、动态代理
  • 线程的概念和控制
  • 分布式锁2-Zookeeper分布式锁实战
  • Django中使用Celery(通用方案、官方方案)
  • 一顿五元钱的午餐
  • 141.字符串:重复的字符串(力扣)
  • Stable Diffusion教程
  • Midjourney绘画关键词参数汇总(二)
  • currentTarget指向监听者Target:指向触发者
  • TikTok矩阵管理系统:品牌增长的新引擎
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • CAP理论的例子讲解
  • css属性的继承、初识值、计算值、当前值、应用值
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • express + mock 让前后台并行开发
  • Java知识点总结(JavaIO-打印流)
  • markdown编辑器简评
  • MQ框架的比较
  • mysql_config not found
  • Python实现BT种子转化为磁力链接【实战】
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 将回调地狱按在地上摩擦的Promise
  • 聊聊flink的TableFactory
  • 目录与文件属性:编写ls
  • 配置 PM2 实现代码自动发布
  • 什么软件可以剪辑音乐?
  • 使用 Docker 部署 Spring Boot项目
  • 微信小程序开发问题汇总
  • 一个JAVA程序员成长之路分享
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • Hibernate主键生成策略及选择
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # centos7下FFmpeg环境部署记录
  • # Maven错误Error executing Maven
  • #1015 : KMP算法
  • #NOIP 2014#Day.2 T3 解方程
  • (4)事件处理——(7)简单事件(Simple events)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (windows2012共享文件夹和防火墙设置
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (顺序)容器的好伴侣 --- 容器适配器
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转载)(官方)UE4--图像编程----着色器开发
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法