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

2023/10/7 -- ARM

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

1.指令码以及格式

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

2.实例代码

mrs r1,cpsr  @从目标寄存器中读@切换到user模式,只修改模式位,其他位不变bic r1,#0x1f  @低5位清0orr 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  mainb .b do_swib .b .b .b .b .main:@主程序@初始化栈mov sp,#0X40000020@切换到USER模型msr cpsr,#0X10mov r1,#1mov r2,#2@产生软中断swi 1add r3,r1,r2b maindo_swi:@异常处理程序@保护现场stmfd sp!,{r1,r2,lr}mov r1,#4mov r2,#5mul r4,r1,r2@出栈恢复现场  pc=lr  cpsr=spsrldmfd 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 Standardint 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 = 3mov r1, #4   @ b = 4mov r2, #5   @ c = 5mov 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, r1add r0, r0, r2add r0, r0, r3mov 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, r1add r0, r0, r2add r0, r0, r3mov 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 --> 按键14. 网络标号在原理图上,器件引脚上边红色的字,就是网络标号,网络标号相同的两个引脚说明具有相同的电器连接属性,即在PCB板上两个引脚通过导线进行连接。

3.网络标号

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

相关文章:

2023/10/7 -- ARM

【程序状态寄存器读写指令】 1.指令码以及格式 mrs:读取CPSR寄存器的值 mrs 目标寄存器 CPSR:读取CPSR的数值保存到目标寄存器中msr:修改CPSR寄存器的数值msr CPSR,第一操作数:将第一操作数的数值保存到CPSR寄存器中//修改CPSR寄存器,也就表示程序的状…...

yolov5加关键点回归

文章目录 一、数据1)数据准备2)标注文件说明 二、基于yolov5-face 修改自己的yolov5加关键点回归1、dataloader,py2、augmentations.py3、loss.py4、yolo.py 一、数据 1)数据准备 1、手动创建文件夹: yolov5-face-master/data/widerface/tr…...

untitle

实用的科研图形美化处理教程分享 ​ 显微照片排版标记 除了统计图表之外,显微照片也是文章中必不可少的实验结果呈现方式。除了常规实验的各种组织切片照片,在空间转录组文章中显微照片更是常见。显微照片的呈现方式也是有讲究的,比如对照片…...

《论文阅读》监督对抗性对比学习在对话中的情绪识别 ACL2023

《论文阅读》监督对抗性对比学习在对话中的情绪识别 前言摘要相关知识最坏样本干扰监督对比学习生成式对抗网络纳什均衡琴森香农散度范式球模型架构监督对抗性对比学习模型结构图实验结果问题前言 你是否也对于理解论文存在困惑? 你是否也像我之前搜索论文解读,得到只是中文…...

2023-10-07 LeetCode每日一题(股票价格跨度)

2023-10-07每日一题 一、题目编号 901. 股票价格跨度二、题目链接 点击跳转到题目位置 三、题目描述 设计一个算法收集某些股票的每日报价,并返回该股票当日价格的 跨度 。 当日股票价格的 跨度 被定义为股票价格小于或等于今天价格的最大连续日数&#xff08…...

聊聊分布式架构04——RPC通信原理

目录 RPC通信的基本原理 RPC结构 手撸简陋版RPC 知识点梳理 1.Socket套接字通信机制 2.通信过程的序列化与反序列化 3.动态代理 4.反射 思维流程梳理 码起来 服务端时序图 服务端—Api与Provider模块 客户端时序图 RPC通信的基本原理 RPC(Remote Proc…...

维吉尼亚密码

维吉尼亚密码属于多表代换密码 其中A<–>0&#xff0c;B<–>1&#xff0c;…&#xff0c;Z<–>25&#xff0c;则每个密钥K相当于一个长度为m的字母串&#xff0c;称为密钥字。维吉尼亚密码一次加密m个明文字母。 示例&#xff1a;设m6&#xff0c;密钥字为…...

ubuntu20.04挂载拓展盘保姆级流程

背景&#xff1a;跑模型玩时&#xff0c;发现机子硬盘太小了&#xff0c;搞个1t固态作为挂载盘。以下为操作全流程记录 1、开始root权限操作 sudo su若进不去&#xff0c;考虑是否给root设置过密码&#xff0c;新系统第一次进入需要设置密码。 进入成功&#xff1a; rooty:…...

顶顶通电话机器人接口对接开源ASR(语音识别)

前景介绍 目前大部分用户使用的都是在线ASR按照分钟或者按次付费&#xff0c;之前开源ASR效果太差不具备商用的条件&#xff0c;随着 阿里达摩院发布了大量开源数据集或者海量工业数据训练的模型&#xff0c;识别效果已经和商用ASR差距非常小&#xff0c;完全具备了很多场景代…...

windows消息机制

windows开发比较简单&#xff0c;首先要理解的就是消息机制。 Windows消息机制是指Windows操作系统中的消息传递机制。在Windows中&#xff0c;应用程序通过消息进行通信和交互。消息是一种轻量级的通信方式&#xff0c;用于在不同的窗口、线程或进程之间传递信息。 在Windows…...

整数划分——DP

用 j j j 个数表示 i i i 的方案数&#xff0c;考虑dp 转移考虑最小值是否为1 无限制 若为1&#xff0c;则转移到 f ( i 1 , j 1 ) f(i1, j1) f(i1,j1)不为1&#xff0c;则全部1&#xff0c;转移到 f ( i j , j ) f(ij, j) f(ij,j) 数之间不能重复 那么相当于每次整…...

Git切换用户常用命令

1、查看 查看用户名 &#xff1a; git config user.name查看密码&#xff1a; git config user.password查看邮箱&#xff1a; git config user.email查看配置信息&#xff08;包含上面的信息&#xff09;&#xff1a; $ git config --list2、新增、切换 修改用户名 git…...

一般香港服务器带宽选多大够用?(带宽计算方法)

​  在海外IDC市场份额中&#xff0c;香港服务器依托自身优越的服务器资源条件&#xff0c;在各个行业中发挥的重要作用。但是&#xff0c;不同业务对网络带宽的要求各不相同&#xff0c;弄清楚如何计算带宽需求对于确保业务平稳运行至关重要&#xff0c;最好从一开始就使用正…...

vue中使用ali-oss上传文件到阿里云上

1.使用 npm 安装ali-oss npm install ali-oss --save2.写ali-oss.js // 引入ali-oss let OSS require(ali-oss) let client new OSS({region: oss-cn-xxx, // bucket所在的区域&#xff0c; 默认oss-cn-hangzhousecure: true, // secure: 配合region使用&#xff0c;如果指…...

php实战案例记录(17)计算时间的函数及其示例说明

在PHP中&#xff0c;有许多函数可以用于计算和处理时间。以下是一些常用的计算时间的函数及其示例说明&#xff1a; time()&#xff1a;获取当前时间的Unix时间戳。 $currentTimestamp time(); echo $currentTimestamp;date()&#xff1a;将Unix时间戳格式化为指定的日期和时…...

基于Keil a51汇编 —— MPL 宏定义

MPL 宏 Ax51汇编程序支持的宏处理语言&#xff08;MPL&#xff09;是一种字符串替换工具&#xff0c;使您能够编写可修复的代码块&#xff08;宏&#xff09;并将其插入源文本中的一个或多个位置。 宏处理器查看源文件的方式与汇编程序不同。 对于汇编程序来说&#xff0c;源…...

Android 13 骁龙相机点击拍照流程分析(二)——点击拍照到存入相册

一.前言 本篇是在Android 13 骁龙相机点击拍照流程分析(一)——点击拍照到更新到左下角缩略图文章的基础上进行延申的,前面的预览、点击拍照的过程参考第一篇:Android 13 骁龙相机点击拍照流程分析(一)——点击拍照到更新到左下角缩略图-CSDN博客 二.生成图片并保存 从第…...

常见算法-巴斯卡三角形(Pascal)

常见算法-巴斯卡三角形&#xff08;Pascal&#xff09; 1、说明 巴斯卡&#xff08;Pascal&#xff09;三角形基本上就是在解 nCr&#xff0c;因为三角形上的每一个数字各对应一个nCr&#xff0c;其中 n 为 row&#xff0c;而 r 为 column&#xff0c;如下&#xff1a; 0C0 1…...

AI:09-基于深度学习的图像场景分类

图像场景分类是计算机视觉领域的重要任务之一,它涉及将图像分为不同的场景类别,如城市街景、山脉风景、海滩等。本文将介绍基于深度学习的图像场景分类方法,并提供相应的代码实例,展示了深度学习在图像场景分类中的技术深度和应用前景。 图像场景分类是计算机视觉中的一项…...

uni-app:引入echarts(使用renderjs)

效果 代码 <template><view click"echarts.onClick" :prop"option" :change:prop"echarts.updateEcharts" id"echarts" class"echarts"></view> </template><script>export default {data()…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法

使用 ROS1-Noetic 和 mavros v1.20.1&#xff0c; 携带经纬度海拔的话题主要有三个&#xff1a; /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码&#xff0c;来分析他们的发布过程。发现前两个话题都对应了同一…...