2023/10/7 -- ARM

news2024/11/17 15:48:47

【程序状态寄存器读写指令】

1.指令码以及格式

mrs:读取CPSR寄存器的值
mrs 目标寄存器  CPSR:读取CPSR的数值保存到目标寄存器中
 
 msr:修改CPSR寄存器的数值
 msr CPSR,第一操作数:将第一操作数的数值保存到CPSR寄存器中
 //修改CPSR寄存器,也就表示程序的状态发生了变化
 10000

2.实例代码

mrs r1,cpsr  @从目标寄存器中读
    @切换到user模式,只修改模式位,其他位不变
    bic r1,#0x1f  @低5位清0
    orr r1,#0x10  @低5位置位
    @将修改后的CPSR数值写回
    msr cpsr,r1
 
 
注意:在user模式下不可以手动修改CPSR的数值
USER模式是 唯一的非特权模式,如果这个模式下随便修改CPSR的数值会对整个系统造成一些不好的影响。
USER模式也不可以手动切换到其他模式,需要发生对应的异常才可以进入对应的异常模式

【软中断指令】

1.概念

软中断是在软件层次上模拟出的一个中断,和硬件中断一样,软中断触发后也会执行对应的中断处理程序。当执行了软中断之后,处理器的工作模式由USER模式切换为SVC模式

2.软中断指令码以及格式

swi 中断号
注意:
中断号是一个由24位二进制数组成的一个立即数。不同的中断号用于区分不同的中断。

3.异常处理过程分析

3.1 异常模式和异常源的对应关系

5种异常模式对应7种异常源

异常模式

异常源

解释

FIQ

FIQ类型异常源

一些硬件发生了FIQ异常事件进入FIQ模型

IRQ

IRQ类型异常源

一些硬件发生了IRQ异常事件进入IRQ模型

SVC

复位信号

按键复位/上电复位时产生

swi软中断指令

执行swi指令

undef

未定义异常源

译码器在翻译指令时,遇到无法翻译的指令,指令未定义

abort

data abort

取数据发生异常时

prefetch abort

取指令发生异常时

5种异常模式对应7种异常源
当发生异常时处理器就会进入对应的异常模式工作
执行异常处理程序,完成特定的功能
5种异常模式对应7种异常源,异常源的优先级中复位信号的优先级最高

3.2 异常的处理过程分析

**********异常处理过程(CPU自动完成)****************
分为4大步3小步,主要为了保存现场以及程序的跳转和模式的切换
1.  保存发生异常之前的CPSR的值存放在对应异常的SPSR寄存器中
2.修改CPSR的值
   1>`修改状态位(T位 第5位),切换为ARM状态
   2>根据实际情况禁止IRQ和FIQ中断 ([7:6])
   3>修改模式位为对应的异常模式
3.将返回地址保存在对应异常模式下的LR寄存器中
4.修改PC的值,指向对应的异常向量表位置  

***********恢复现场(手动完成)***********
1.恢复CPSR的值为未发生异常之前的状态
2.修改PC寄存器的值,PC=LR

3.3 异常向量表

1.异常向量表是内存空间中的一段特殊的内存。这段内存有32字节大小。这个内存被平分为8等份。每一份4字节
2.异常向量表存放的是7种异常源对应的异常处理程序的跳转指令,有一份保留
3.7种异常源在异常向量表中的位置是固定不可变的
4.只要指定异常向量表的基地址,既可以根据不同异常源在异常向量表中的偏移量找到对应异常的跳转指令,进入不同的异常处理程序

4.软中断异常处理实例代码

.text  
.global _start 
            

_start:
    @初始化异常向量表
    b  main
    b .
    b do_swi
    b .
    b .
    b .
    b .
    b .

main:@主程序
    @初始化栈
    mov sp,#0X40000020
    @切换到USER模型
    msr cpsr,#0X10
    mov r1,#1
    mov r2,#2
    @产生软中断
    swi 1
    add r3,r1,r2
    b main
    
do_swi:@异常处理程序
    @保护现场
    stmfd sp!,{r1,r2,lr}
    mov r1,#4
    mov r2,#5
    mul r4,r1,r2
    @出栈恢复现场  pc=lr  cpsr=spsr
    ldmfd sp!,{r1,r2,pc}^  @^表示修改PC的值同时将CPSR的值修改

wh: 
    b wh  
    
.end 
    

【C和汇编的混合编程】

1.混合编程的意义

所谓的混合编程就是c语言资源和汇编资源的相互调用

  • 一般工程会有汇编启动程序,启动程序完成堆栈的相关初始化,完毕之后才跳转到c语言的main函数
  • c语言中几乎不可以直接操作寄存器,但是有些特定场景下需要c中操作寄存器,这时候就需要c语言中嵌套汇编的语法

2.概述

要想实现C和汇编的混合编程必须遵循ATPCS规范。
ATPCS : ARM-Thumb Procedure Call Standard

int add(int i,int j)
{
    return i+j;
}
函数参数的传递采用R0-R3进行传递,如果参数的个数大于4个通过压栈的方式进行传递
函数的返回值通过R0返回,如果函数的返回值大于4个字节通过r0-r1返回。
ATPCS规范中规定ARM采用满减栈。

3.汇编中调用c语言的函数

汇编调用C语言的函数,需要将c语言的函数当作汇编的标签使用,函数传递的参数保存在R0-R3寄存器中,函数的返回值最终保存在R0寄存器中

*****汇编文件**********
.text    
.global _start  
            
_start: 

    @ 1. 初始化栈指针,C代码运行必须有栈
    ldr sp, =0x40000820
    
    @ 2. 汇编调用c函数 
    @ 2.1 给C的函数传递实参值
    mov r0, #3   @ a = 3
    mov r1, #4   @ b = 4
    mov r2, #5   @ c = 5
    mov r3, #6   @ d = 6
    
    @ 2.2 汇编调用c的函数
    bl add_func
    
    @ 2.3 函数的返回通过r0返回,查看r0寄存器中的值

loop:   
        b loop  

.end

**********c文件********************
// c代码的函数是一个全局的函数
int add_func(int a, int b, int c, int d) 
{
 return (a+b+c+d);
}

4.c语言调用汇编的标签

c语言中想要调用汇编中的标签,只需要在c语言文件中将标签声明为函数的形式即可

********起始汇编文件**********
.text    
.globl _start  
            
_start: 

    @ 1. 初始化栈指针,C代码运行必须有栈
    ldr sp, =0x40000820
    
    @ 2. 汇编调用c,跳转到main函数
    b main
.end

********c文件************
// 使用extern对函数进行声明
extern int add_func(int a, int b, int c, int d);

int sum = 0;
int main()
{
 // 在c代码中调用汇编代码
 sum = add_func(1,2,3,4);
 while(1);
 return 0;
}

********汇编文件**********
.text 
.global add_func  @ 将add_func函数声明为全局
    
    add_func:
        add r0, r0, r1
        add r0, r0, r2
        add r0, r0, r3
        mov pc, lr
.end

5.c语言内联汇编

在某一些特定的场景下需要在c语言中直接使用汇编的语法,此时需要内联汇编。内联汇编的实现需要通过asm关键字进行修饰

5.1 格式

asm volatile(
    "汇编指令模板\n\t"     //"\n\t"表示一条指令的结束
    .....
    :输出列表  //指令结果的输出值
    :输入列表  //指令的数据输入
    :破坏列表  //破坏列表指定我们当前可用的寄存器
);

5.2 实例

********汇编启动文件*******
.text    
.globl _start  
            
_start: 

    @ 1. 初始化栈指针,C代码运行必须有栈
    ldr sp, =0x40000820
    
    @ 2. 汇编调用c,跳转到main函数
    b main
.end
    
 
 **********c语言文件***********
 // 内联汇编 
int add_func2(int a, int b, int c, int d)
{
 int sum = 0;
 // 使用汇编实现求和
 asm volatile(  "add r0, r0, r1\n\t"  "add r0, r0, r2\n\t"  "add r0, r0, r3\n\t"  :"=r"(sum)  :"r"(a),"r"(b),"r"(c),"r"(d)  :"memory" );
 return sum;
}
 //"=r"(sum)表示输出从寄存器中放到变量sum中
// "r"(a) 指定输入从变量a中获取放到通用寄存器
 //"memory"声明使用内存

// 使用extern对函数进行声明
extern int add_func(int a, int b, int c, int d);

int sum = 0;
int main()
{
 // 调用内联汇编的函数 
 sum = add_func2(5,6,7,8);
 
 // 在c代码中调用汇编代码
 sum = add_func(1,2,3,4);
 while(1);
 return 0;
}
 *********汇编文件*************
 .text 
.global add_func  @ 将add_func函数声明为全局
    
add_func:
        add r0, r0, r1
        add r0, r0, r2
        add r0, r0, r3
        mov pc, lr
.end
    

【开发板介绍】

1.核心板介绍

2.拓展板

【相关硬件基础内容介绍】

1.PCB

PCB( Printed Circuit Board),中文名称为印制电路板,又称印刷线路板,是重要的电子部件,是电子元器件的支撑体,是电子元器件电气相互连接的载体。由于它是采用电子印刷术制作的,故被称为“印刷”电路板。

2.电路板丝印

可以通过不同元器件的丝印标号在电路原理图中对应的硬件原理图

电路板丝印是用丝网bai印刷技术来制作印刷电路板。丝印值得是丝印层,画pcb的时候是分层的,其中包含文字的那一层,用来标注元件或者添加其他信息,这一层叫丝印层。
通过丝网印刷方式将元件外形、序号以及其他说明性文字印制在元件面或焊锡面上,以方便电路板生产过程的插件(包括表面封装元件的贴片)以及日后产品的维修操作。

 不同的电路元件的丝印图:
 Ux:常作为开发板上芯片的标号
 Rx:电阻
 Cx:电容
 Dx:二极管
 Qx:三极管
 
  
   标准器件的丝印的编号:
    U? --> 芯片  C? --> 电容   R? --> 电阻  L? --> 电感
    D? --> 二极管  Q? --> 三极管 J? --> 接插件 CON? --> 接插件

非标准器件的丝印编号:器件的编号的名字可以自定义
    FAN1 --> 风扇
    LD1  --> LED1灯
    KEY1 --> 按键1
 
 4. 网络标号
    在原理图上,器件引脚上边红色的字,就是网络标号,
    网络标号相同的两个引脚说明具有相同的电器连接属性,
    即在PCB板上两个引脚通过导线进行连接。
 

3.网络标号

网络标号(net label)是一个电气连接点,一般由字母或数字组成,具有相同网络标号的电气连接线、管脚、及网络是连接在一起的

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

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

相关文章

频敏变阻器 BP4G-31511/06350 BP4G-25010/04563 结构简单、操作方便

BP4G系列频敏变阻器(以下简称BP4G)适用于14-1000KW绕线型异步感应电机作重载偶尔起动用。它具有结构简单、操作方便、维护容易等优点,是一种理想的电动机起动装置 BP4G系列频敏变阻器(以下简称BP4G)适用于14-1000KW绕线型异步感应电机作重载…

川西旅游网系统-前后端分离(前台vue 后台element UI,后端servlet)

前台:tour_forword: 川西旅游网前端----前台 (gitee.com) 后台:tour_back: 川西旅游网-------后台 (gitee.com) 后端 :tour: 川西旅游网------后端 (gitee.com)

点餐小程序实战教程05-用户注册

上一篇我们讲解了用户身份识别的问题,本篇我们讲解一下注册功能以及审核功能。 1 表单容器 注册功能是使用表单容器完成,表单容器会根据数据源的字段来自动的生成页面,从右侧的组件区拖入表单容器 表单容器需要选择我们创建的用户管理的数…

GaussDB技术解读系列:高安全之密态等值

在第14届中国数据库技术大会(DTCC2023)的GaussDB“五高两易”核心技术,给世界一个更优选择专场,华为GaussDB首席安全架构师郭亮详细解读了GaussDB的高安全之密态等值技术。 本篇为大家分享GaussDB高安全的关键特性,名字…

2023年【烟花爆竹经营单位主要负责人】考试及烟花爆竹经营单位主要负责人新版试题

题库来源:安全生产模拟考试一点通公众号小程序 烟花爆竹经营单位主要负责人考试根据新烟花爆竹经营单位主要负责人考试大纲要求,安全生产模拟考试一点通将烟花爆竹经营单位主要负责人模拟考试试题进行汇编,组成一套烟花爆竹经营单位主要负责…

嬴图 | 微距观察从“表数据”到“图数据”的建模过程

前言 随着图数据库技术在工业领域的有效开展和深入应用,在建模时,到底“图数据”与“表数据”有哪些不同?本文,笔者以搭建一个简单的医院信息管理系统为例,具体对比并阐述了用关系型查询语言SQL和图查询语言UQL&#…

阿里云/腾讯云国际站账号:腾讯云国际站特效SDK购买

产品介绍 随着直播、短视频业务的爆发式增长,丰富多样的视频特效,自然生动的智能美颜,新奇有趣的贴纸玩法也受到大量关注,为多种视频场景注入了新的生机与活力。腾讯特效 SDK(Tencent Effect SDK)&#xf…

Node18.x进阶使用总结之MongoDB7.x(三)

Node18.x进阶使用总结之MongoDB7.x 1、MongoDB7.x的安装1.1、下载安装与启动1.2、MongoDB目录1.3、安装MongoDB Shell1.4、设置环境变量1.5、使用MongoDB 2、命令行交互2.1、数据库命令2.2、集合命令2.3、文档命令 3、Mongoose3.1、连接数据库3.2、创建新文档3.3、字段类型3.4、…

vue 百度地图/天地图设置铺满屏幕100%,解决空隙问题

设置100%无效&#xff0c;刷新依然右侧有空隙&#xff0c;解决&#xff1a;min-width: 100vw; <div class"aui-flex-col" style"width: 100%; height:100%"><div id"mapAllCon" style"width: 100%; min-width: 100vw; height: 10…

从0开始python学习-31.selenium 文本输入框、下拉选择框、文件上传、时间插件选择元素定位

目录 1. 纯文本输入框 2. 存在默认值的文本输入 3. 下拉选择框 4. 输入后下拉选择框 5. 文件上传 6. 时间插件 1. 纯文本输入框 driver.find_element(By.XPATH,/html/body/div[2]/td[2]/input).send_keys(测试名称) 2. 存在默认值的文本输入 注意&#xff1a; 1. 这种存…

mkv怎么转换为mp4?

mkv怎么转换为mp4&#xff1f;你是否有过这样的情况&#xff0c;电脑上播放MKV格式的视频文件很流畅&#xff0c;但却无法在手机端或者一些剪辑软件中正常播放以及识别&#xff0c;导致工作效率的降低&#xff1f;这个问题的根本原因在于电脑上的播放器可以兼容MKV格式&#xf…

Java中双冒号“::”到底什么意思

今天给大家分享一个JDK8中的新特性双冒号&#xff1a;”::“&#xff0c;双冒号“::”就是 Java 中的方法引用&#xff0c;是Java 8中的Lambda表达式写法之一&#xff0c;一种执行方法的方法。 在一定程度上简化了我们Java开发的冗余代码。 双冒号(::)使用场景一般有如下6种&a…

物流仓储RFID系统设计案例分享

一、项目背景 为了实现仓储货物管理数字化转型的目标&#xff0c;提升仓储业务自动化和数字化水平&#xff0c;在满足仓储日常需求的基础上&#xff0c;验证物联网和人工智能相关技术能力&#xff0c;为仓储业务的柔性自动化、快速部署和复制提供储备能力。 项目设计目标包括…

c++视觉ROI 区域和ROI 区域图像叠加

ROI 区域提取和ROI 区域图像叠加 ROI 区域提取 #include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image cv::imread("1.jpg");// 检查图像是否成功加载if (image.empty()) {std::cerr << "Error: Could not read the image." …

hadoop集群安装并配置

文章目录 1.安装JDK 环境2.系统配置2.1修改本地hosts文件2.2创建hadoop 用户2.2 设置ssh免密&#xff08;使用hadoop 用户生成&#xff09; 3.安装 hadoop 3.2.43.1 安装hadoop3.1.1 配置Hadoop 环境变量 3.2配置 HDFS3.2.1 配置 workers 文件3.2.2 配置hadoop-env.sh3.2.3 配置…

【数字化转型】10大数字化转型能力成熟度模型01(IOMM)

一、前言 数字化转型是数据化能力建设的目标和价值&#xff0c;作为一个新兴的课题&#xff0c;目前为止并未出现一个统一的数字化转型成熟度模型。不同的企业和机构&#xff0c;根据自身的发展和认知&#xff0c;推出了自己的企业级或者准行业级标准。这些标准具有很强的参考意…

一本没有任何数学公式的自然语言处理入门书

ChatGPT 时代来了&#xff0c;AI 从旧时王谢堂前燕&#xff0c;飞入寻常百姓家。越来越多非 AI 领域 的软件开发者涌进 NLP(自然语言处理)领域。在这个快速发展的时代&#xff0c;如果这些软件开发 者要像读书那样先读 4 年本科、2 年硕士、3 年博士才能搞 AI&#xff0c;风口早…

Python:温度转换(摄氏度与华氏度)

Python:温度转换&#xff08;摄氏度与华氏度&#xff09; TempStrinput("请输入带有符号的温度值&#xff1a;") if TempStr[-1] in [F,f]:C(eval(TempStr[0:-1])-32)/1.8print("转换后的温度是{:.2f}C".format(C)) elif TempStr[-1] in[C,c]:F1.8*eval(T…

在Android中实现动态应用图标

在Android中实现动态应用图标 你可能已经遇到过那些能够完成一个神奇的技巧的应用程序——在你的生日时改变他们的应用图标&#xff0c;然后无缝切换回常规图标。这是一种引发你好奇心的功能&#xff0c;让你想知道&#xff0c;“他们到底是如何做到的&#xff1f;”。嗯&…

【EI会议征稿】第三届智慧交通、能源与动力国际学术会议(STEP 2023)

第三届智慧交通、能源与动力国际学术会议&#xff08;STEP 2023&#xff09; 2023 3rd International Conference on Smart Transportation, Energy and Power 第三届智慧交通、能源与动力国际学术会议 (STEP 2023) 将于2023年12月15-17日在中国三亚市隆重举行&#xff0c;会议…