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. 股票价格跨度二、题目链接 点击跳转到题目位置 三、题目描述 设计一个算法收集某些股票的每日报价,并返回该股票当日价格的 跨度 。 当日股票价格的 跨度 被定义为股票价格小于或等于今天价格的最大连续日数(…...
聊聊分布式架构04——RPC通信原理
目录 RPC通信的基本原理 RPC结构 手撸简陋版RPC 知识点梳理 1.Socket套接字通信机制 2.通信过程的序列化与反序列化 3.动态代理 4.反射 思维流程梳理 码起来 服务端时序图 服务端—Api与Provider模块 客户端时序图 RPC通信的基本原理 RPC(Remote Proc…...
维吉尼亚密码
维吉尼亚密码属于多表代换密码 其中A<–>0,B<–>1,…,Z<–>25,则每个密钥K相当于一个长度为m的字母串,称为密钥字。维吉尼亚密码一次加密m个明文字母。 示例:设m6,密钥字为…...
ubuntu20.04挂载拓展盘保姆级流程
背景:跑模型玩时,发现机子硬盘太小了,搞个1t固态作为挂载盘。以下为操作全流程记录 1、开始root权限操作 sudo su若进不去,考虑是否给root设置过密码,新系统第一次进入需要设置密码。 进入成功: rooty:…...
顶顶通电话机器人接口对接开源ASR(语音识别)
前景介绍 目前大部分用户使用的都是在线ASR按照分钟或者按次付费,之前开源ASR效果太差不具备商用的条件,随着 阿里达摩院发布了大量开源数据集或者海量工业数据训练的模型,识别效果已经和商用ASR差距非常小,完全具备了很多场景代…...
windows消息机制
windows开发比较简单,首先要理解的就是消息机制。 Windows消息机制是指Windows操作系统中的消息传递机制。在Windows中,应用程序通过消息进行通信和交互。消息是一种轻量级的通信方式,用于在不同的窗口、线程或进程之间传递信息。 在Windows…...
整数划分——DP
用 j j j 个数表示 i i i 的方案数,考虑dp 转移考虑最小值是否为1 无限制 若为1,则转移到 f ( i 1 , j 1 ) f(i1, j1) f(i1,j1)不为1,则全部1,转移到 f ( i j , j ) f(ij, j) f(ij,j) 数之间不能重复 那么相当于每次整…...
Git切换用户常用命令
1、查看 查看用户名 : git config user.name查看密码: git config user.password查看邮箱: git config user.email查看配置信息(包含上面的信息): $ git config --list2、新增、切换 修改用户名 git…...
一般香港服务器带宽选多大够用?(带宽计算方法)
在海外IDC市场份额中,香港服务器依托自身优越的服务器资源条件,在各个行业中发挥的重要作用。但是,不同业务对网络带宽的要求各不相同,弄清楚如何计算带宽需求对于确保业务平稳运行至关重要,最好从一开始就使用正…...
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所在的区域, 默认oss-cn-hangzhousecure: true, // secure: 配合region使用,如果指…...
php实战案例记录(17)计算时间的函数及其示例说明
在PHP中,有许多函数可以用于计算和处理时间。以下是一些常用的计算时间的函数及其示例说明: time():获取当前时间的Unix时间戳。 $currentTimestamp time(); echo $currentTimestamp;date():将Unix时间戳格式化为指定的日期和时…...
基于Keil a51汇编 —— MPL 宏定义
MPL 宏 Ax51汇编程序支持的宏处理语言(MPL)是一种字符串替换工具,使您能够编写可修复的代码块(宏)并将其插入源文本中的一个或多个位置。 宏处理器查看源文件的方式与汇编程序不同。 对于汇编程序来说,源…...
Android 13 骁龙相机点击拍照流程分析(二)——点击拍照到存入相册
一.前言 本篇是在Android 13 骁龙相机点击拍照流程分析(一)——点击拍照到更新到左下角缩略图文章的基础上进行延申的,前面的预览、点击拍照的过程参考第一篇:Android 13 骁龙相机点击拍照流程分析(一)——点击拍照到更新到左下角缩略图-CSDN博客 二.生成图片并保存 从第…...
常见算法-巴斯卡三角形(Pascal)
常见算法-巴斯卡三角形(Pascal) 1、说明 巴斯卡(Pascal)三角形基本上就是在解 nCr,因为三角形上的每一个数字各对应一个nCr,其中 n 为 row,而 r 为 column,如下: 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()…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...



