ARM知识点二
一、指令
- 指令的生成过程
- 指令执行过程示例
if (a == 0) {x = 0;
} else {x = x + 3;
}
//翻译为
cmp r0,#0
MOVEQ R1,#0
ADDGT R1,R1,#3
指令获取:从Flash中读取 CMP R0, #0,控制器开始执行。
指令解码:解码器解析 CMP 指令,ALU比较R0的值和0。
条件执行:
若条件满足 EQ,执行 MOVEQ,将0放入R1。
若条件满足 GT,执行 ADDGT,将R1加3。
结果存储:将计算结果保存在R1中。
二、ARM的工作模式
- 用户模式(USR模式)
权限:最低
资源:最少
用途:用于执行普通任务,例如应用程序。大部分程序都运行在用户模式下。 - 管理员模式(SVC模式)
权限:高
资源:多
用途:用于执行核心级任务,例如操作系统的核心代码。 - 中断模式(IRQ模式)
权限:高
资源:多
用途:用于执行中断代码,处理普通中断请求。 - 快速中断模式(FIQ模式)
权限:更高
资源:最多
用途:用于快速处理高优先级中断请求。虽然在某些操作系统(如 Linux)中不常用,但它提供了更快的响应时间。 - 数据终止模式(abort模式)
用途:用于处理内存访问错误。当程序尝试访问非法或无效内存地址时,处理器进入该模式以处理异常。
对寄存器的分配情况
- R0-R7 为所有模式所共享;
- R8-R12 有两份, FIQ模式独享一份;
- R13-R14每种模式都有一份;
模式切换过程中,特殊寄存器的作用
CPSR寄存器
- 可以对CPSR的某些位修改而达到想要的效果。不用背,直接查。
三、立即数
- 一条指令,存放常数的区域只有 12bit; 造成的问题是,当指令中出现大常数的时候, 无法存入12bit中,形成 非法指令!
- ARM公司 将12bit分为 低8bit–X,高4bit–Y,最终的结果是 : X<<2Y ,这样的 8bit常数经过偶数位#循环左移#得到的数据,称之为 立即数;
- 0x10E0 是不是立即数----> 否
0x10D0 ----------------- 否
0x10C0 ----------------- 是 - 简便方法是判断基值(立即数的范围是0x00到0xFF。)
1.补全32位
2.最边上的两个1中间间隔不能超过6个数(包括0,也包括逻辑左移时)
3.其次是这少于等于8个数要放在8位中时,只能移动偶数位,才符合立即数标准,左右移动都可以 - 当要存放较大的数时,通常采用伪指令
Ldr r0 ,=0x12345678 @编译器会用真实的指令替换
四、补充一些伪指令
.byte
解释:.byte指令告诉编译器将后面的数据按照字节(1字节)进行存储。.byte 0x41, 0x42, 0x43 ; 存储ASCII字符'A', 'B', 'C'
char buf[] = {0x41, 0x42, 0x43}; // 初始化字符数组
.word
解释:.word指令用于告诉编译器将后面的数据按照4字节(32位)为单位进行存储。常用于初始化整型数组或表示32位整数。.word 0x12345678, 0x9ABCDEF0 ; 存储两个32位整数,.word开始的地址就是存放这0x12345678
int xi[] = {0x12345678, 0x9ABCDEF0}; // 初始化整型数组
.equ解释:.equ伪指令用于定义符号常量。它将某个符号与一个特定的值绑定,这样在代码中可以使用符号来代替具体的数值。.equ PI, 3.14 ; 将符号PI定义为3.14
五、异常
- 异常(Exception)是指处理器对一些特定事件(例如中断、错误、系统调用等)所做出的响应。异常处理是嵌入式系统中非常重要的一部分,因为它允许系统在发生特定事件时进行处理,从而确保系统的可靠性和稳定性。
1. 异常向量表
异常类型 | 向量地址 | 描述 | 异常模式 |
---|---|---|---|
Reset | 0x00 | 复位异常 | Supervisor |
Undefined Instruction | 0x04 | 未定义指令异常 | Undefined |
SWI | 0x08 | 软件中断 | Supervisor |
Prefetch Abort | 0x0C | 预取指令中止异常 | Abort |
Data Abort | 0x10 | 数据中止异常 | Abort |
IRQ | 0x18 | 普通中断请求异常 | IRQ |
FIQ | 0x1C | 快速中断请求异常 | FIQ |
2. 同时发生时,处理优先级
- 复位(Reset)
处理器上电或者复位时发生的异常 - 数据中止(Data Abort)
数据访问错误时发生的异常,一般是与Memory 误操作有关,如对不合法的内存地址、0地址写操作,或对一些Memory 越界操作。 - FIQ(快速中断请求)
FIQ用于快速响应时间敏感的外部硬件中断,优先级高于IRQ。 - IRQ(普通中断请求)
IRQ用于处理标准的外部硬件中断。优先级低于FIQ。 - 预取指令中止(Prefetch Abort)
在指令预取阶段,如果试图访问的指令地址无效或产生错误,则会触发预取指令中止。 - 未定义指令(Undefined Instruction)
当处理器遇到未定义或不支持的指令时触发。常用于调试和异常捕获。 - SWI(软件中断)
软件中断由SWI指令触发,通常用于执行系统调用或从用户模式切换到内核模式。
3.异常的处理过程
1.流程图(类似于工作模式的切换)
- 异常处理是计算机系统中处理突发事件的关键机制,不同的异常处理需要不同的资源和权限。为了有效处理异常,系统在处理过程中通常会切换到更高权限的模式(如内核模式),这种模式切换由硬件自动完成,确保处理器获得所需的资源和权限。
- 中断异常是异常处理中最重要的类型之一,它能够显著提高系统的响应速度和执行效率。通过快速响应外部事件(如输入输出操作),中断机制使系统能够在需要时中断当前任务来处理更紧急的任务,从而优化资源利用和提升系统性能。
4.中断和异常之间的关系
- 软中断通常也称之为异常,是由处理器内部条件触发的中断。通常由软件指令触发(除数为0),同步发生的。一般用于实现系统调用和任务调度
- 异常是由处理器检测到的错误条件或特殊事件自动触发。软中断可以通过指令主动触发。
- 硬中断也称为真正的中断,硬中断是由硬件设备(磁盘)发出的中断信号,通知处理器有外部事件需要处理。硬中断是异步的,随时发生。
- 正常指令执行 → 检测到异常信号 → 查找异常向量表 → 根据中断向量号获取中断描述符 → 跳转到异常处理程序 → 执行处理例程 → 恢复上下文并返回原程序 → 继续执行
5. 异常向量表的优化
- 问题背景:在ARM异常向量表中,通常需要使用固定偏移来指向异常处理程序。当异常处理程序的地址(例如swi_handle)非常大时,无法直接使用简单的分支指令(如B指令)跳转,因为这些指令可能受限于指令编码长度(通常16位或32位),导致无法存储长地址。
- 解决方案:
采用LDR指令来间接加载处理程序的地址,从而跳转到真正的处理程序位置。这允许在向量表中使用一个更小的跳转指令和更灵活的地址加载方式。 - 实例
b reset @0x0 ; 跳转到复位处理程序
nop ; 无操作,可能用于对齐或延迟
ldr pc, _swi @0x8 ; 从_swi标签处加载地址到PC,跳转到SWI处理程序
nop ; 无操作,占位符
nop
nop
ldr pc, _irq @0x18 ; 从_irq标签处加载地址到PC,跳转到IRQ处理程序
nop ; 无操作,占位符_swi: @@ _swi 一定要紧贴着 异常向量表,保证 他的值很小.word swi_handle @0x12345678 ; 存储SWI处理程序的地址_irq:; 可能会有类似的定义来加载IRQ处理程序
相关文章:

ARM知识点二
一、指令 指令的生成过程 指令执行过程示例 if (a 0) {x 0; } else {x x 3; } //翻译为 cmp r0,#0 MOVEQ R1,#0 ADDGT R1,R1,#3指令获取:从Flash中读取 CMP R0, #0,控制器开始执行。 指令解码:解码器解析 CMP 指令,ALU比较R…...

C# ?的使用
栏目总目录 可空类型标记符(?) 说明: 可空类型标记符?用于指示某个值类型(如int、float等)可以为null。这是C# 2.0引入的一个特性,用于处理数据库查询、JSON解析等场景中可能出现的空值。 示例代码&am…...

【unity小技巧】unity性能优化以及如何进行性能测试
文章目录 前言GPU性能优化打包素材 CPU性能优化代码执行优化 性能测试Vector2.Distance 和 sqrMagnitude哪个好?动画切换优化shader属性优化 URP渲染器资产优化对象池优化删除没必要的空函数图片、音乐音效、贴图等素材压缩ScriptableObject优化参数参考完结 前言 …...

算法参考改进点/知识点
1、clip文章中改进点 图像编码器image encoder: 将全局平均池化层替换为注意力池化机制。注意力池化机制:通过一个单层的“transformer式”多头QKV注意力,其中查询query是基于图像的全局平均池表示。改进VIT(Vision Transformer…...

electron 配置、打包 -报错解决
目录 一、配置途中遇到的问题: 二、 make 配置好后开始打包 三、Electron-builder 打包报错 一、配置途中遇到的问题: 1. 安装 yarn add electron -D 一直卡在这里失败 一直卡可以使用下面这个,然后再重新装依赖 1. 采用新的镜像地址 npm …...

基于STM32设计的智能鱼缸(华为云IOT)(200)
文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】设计实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】ESP8266工作模式配置【3】自动换水原理1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献1.4 开发工具的选择【1】设备端开发【2】上位…...

Django与数据库
目录 创建项目app 路由子表 数据库 创建数据库 什么是ORM 定义数据库表 Django Admin 管理数据 过滤条件 代码直接生成HTML 使用模板 前后端分离架构 对资源的增删改查处理 列出客户 添加客户 临时取消 CSRF 校验 修改客户信息 删除客户 Django中ORM的处理 数据模…...

大数据系列之:CentOS7安装R详细步骤
大数据系列之:CentOS7安装R详细步骤 一、下载R二、解压R三、创建安装目录四、指定安装目录五、安装编译依赖六、编译与编译安装七、设置环境变量八、激活环境变量九、执行R命令十、执行demo测试程序 一、下载R wget https://cran.r-project.org/src/base/R-4/R-4.4…...

Linux学习第57天:Linux PWM驱动实验
Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本章的思维导图如下: 一、PWM驱动简析 1、设备树下的PWM控制节点 8 路 PWM 都属于 I.MX6ULL 的 AIPS-1 域,分为了两部分, PWM1~P…...

git 远程拉取指定文件
指定操作 git init 创建一个空的文件 git remote add orgin 远程仓库地址链接 表示添加远程库的地址 git config core.sparsecheckout true 打开sparsecheckout功能 注意:如果需要分支内所有文件,这个指令可以直接过忽略,则会拉取对应分支所有的文件…...

【css】 CSS3+JS做一个酷炫的仪表进度条3d进度条
创建一个动态进度环组件 在现代网页设计中,进度环是一种常见的视觉元素,用于展示任务的完成度或加载状态。本文将介绍如何使用Vue.js和Less创建一个动态进度环组件,该组件不仅具有美观的视觉效果,还能够根据用户输入动态改变颜色…...

uniapp小程序全局配置分享到朋友和朋友圈功能的实现
文章目录 1.创建/mixins/share.js插件2.全局配置3.编写share.js4.调用5.分享成功 1.创建/mixins/share.js插件 直接创建 2.全局配置 (1)找到main.js在下面引入share.js文件 (2)使用mixins混入vue中,这样就相当于在每一…...

Java优化后台分页
第一种情况:先查询出所有记录,再进行分页处理(分页中可以异步处理) 优化前: List<String> list Arrays.asList("1","2","3","4","5","6","…...

<数据集>电梯内人车识别数据集<目标检测>
数据集格式:VOC格式 图片数量:97张 标注数量(xml文件个数):97 标注类别数:3 标注类别名称: [person, motorcycle, bicycle] 序号类别名称图片数框数1person891322motorcycle78793bicycle2222 使用标注工具&#…...

二百五十三、OceanBase——Linux上安装OceanBase数据库(三):OBD页面上部署OceanBase数据库
一、目的 安装OceanBase后,启动obd web,需要在OBD页面上部署OceanBase数据库 二、参考文档 http://t.csdnimg.cn/Qeedq 三、实施步骤 1 在obadmin用户下,启动obd服务,登录页面访问 [obadminhurys23 oceanbase]$ obd web 2 登…...

Redis应用笔记
Redis应用笔记 一、 前言二、 Redis八种常用数据类型2.1 Redis的五种基本数据类型2.2 Redis的三种特殊数据类型 三、发现Redis热Key方案3.1 使用 Redis 自带的 --hotkeys 参数来查找3.2 使用MONITOR 命令3.3 借助开源项目 四、解决 hotkey五、Redis 内存碎片5.1 为何会有Redis …...

html实现好看的塔罗牌、十二星座运势网站源码
文章目录 1.设计来源1.1 十二星座1.2 所有界面效果图 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/deta…...

万字长文带你入门shell编程(超详细)
一、概述 Shell 是计算机操作系统中用户与操作系统内核之间的接口层,它提供了一种方式让用户能够通过命令行界面(CLI)与操作系统交互。Shell 可以被视为一个命令解释器,它接收用户输入的命令,解析这些命令,…...

音质提升秘籍:专业音频剪辑软件汇总
现在欣赏传输音频文件比以前简单多了,这些音频的质量也影响了听众的体验与感受。所以使用一些靠谱的音频剪辑工具处理音频能让你的音频文件呈现更好的效果。 1.福昕音频剪辑 链接直达>>https://www.foxitsoftware.cn/audio-clip/ 这是一款电脑端软件。别看…...

idea配置
在我们使用idea的时候会进行配置主要就idea编译器的下载,maven资源管理器,Tomcat服务器 在IntelliJ IDEA的官网进入http://www.jetbrains.com/idea/ 如图如果你是大学生的话一般学校会有相关的激活码直接选择左边的.exe文件下载,直接的就是企…...

将 WinForms 中的 Panel 替换为 WPF 的 WindowsFormsHost 元素
要将 WinForms 中的 Panel 替换为 WPF 的 WindowsFormsHost 元素,你需要执行以下步骤:1. 添加对 WindowsFormsIntegration 的引用:确保你的项目引用了 WindowsFormsIntegration 和 PresentationCore、PresentationFramework 程序集࿰…...

C++ ---- vector的底层原理剖析及其实现
vector 一、定义二、常用接口及模拟实现三、vector迭代器失效问题四、使用memcpy拷贝会出现的问题五、二维数组vector<vector< T >> vv 一、定义 vector 是 C 标准模板库(Standard Template Library, STL)中的一个非常有用的容器。它是一个…...

跑酷视频素材去哪里下载?哪里有跑酷游戏视频素材?
在这个快节奏的视觉时代,跑酷视频因其惊险和动感吸引了众多动作爱好者和视频创作者的目光。如果您正在寻找高质量的跑酷视频素材来丰富您的项目,无论是增强视频的视觉冲击力还是展现跑酷运动的魅力,以下几个推荐的网站将是您的理想选择。 蛙…...

Centos 7配置问题
在VMWare12上面安装Centos 7 Linux虚拟机,在切换到命令界面时,需要登录用户名和密码,但发现输入用户后有字符显示,但是密码没有。 经过一系列查看后,发现这个是Linux的一种机制,即当你输入密码时不显示&…...

浮动IP(Floating IP)计费;OpenStack算力共享;OpenStack实现资源虚拟化;算力调度策略
目录 浮动IP(Floating IP)计费 浮动IP的定义与作用 计费中的浮动IP数据 浮动IP在计费中的作用 OpenStack算力共享 一、OpenStack在算力共享中的角色 二、OpenStack与算力共享的结合方式 三、实际应用案例 算力调度策略 算力计费策略 OpenStack实现资源虚拟化 1.虚…...

Android 源码单独编译Settings模块
一般我们编译源码,只需要在源码的根目录下执行三个命令就行 . build/envsetup.sh 或者source build/envsetup.sh lunch 选择编译目标 make -j60make 不带参数的编译方式是直接编译整个系统,我们也可以使用make带模块名或者使用mmm等命令单独编译某个模块。 首先找到对应模块…...

虚拟机类加载机制
与那些编译时需要进行连接的语言不同,在java语言中,类型的 动态加载:编写一个面向接口的应用程序,可以等到运行时再指定其实现类。 类加载:加载-连接-初始化-使用-卸载 一个类被调用时,会将其class文件从…...

Google Earth Engine(GEE)——逐月筛选影像,并给影像集合添加新的属性
简介 导入影像集合首先,您需要导入您要筛选的影像集合。使用Google Earth Engine的ImageCollection类来导入影像集合。您可以通过ee.ImageCollection()函数传递影像集合的ID或通过一个ee.ImageCollection()对象导入影像集合。 例如,导入Landsat 8卫星每月影像集合的代码如下…...

如何从智联招聘网站快速抓取职位详情?两大技巧揭秘
摘要: 本文将揭秘如何利用Python爬虫技术,高效且合法地从智联招聘网站抓取职位详情信息。通过实战示例,展现两大核心技巧,助你在大数据时代抢占先机,为你的市场分析、人才研究提供强大支持。 一、引言:数据…...

C#知识|ini文件操作
哈喽,你好啊,我是雷工! 本节学习ini文件的操作,之前练习过通过ini文件导出采集模块的配置信息,然后再另一个模块中导入配置信息,如此实现快速配置采集模块,提高效率。 以下为学习笔记。 01 认识ini文件 ini文件是一种文件格式,类似txt,xml等, ini文件在上位机开发中使…...