vr全景网站开发,广东网站制作公司排名,js动效网站,wordpress 置顶 评论一、指令
指令的生成过程 指令执行过程示例
if (a 0) {x 0;
} else {x x 3;
}
//翻译为
cmp r0,#0
MOVEQ R1,#0
ADDGT R1,R1,#3指令获取#xff1a;从Flash中读取 CMP R0, #0#xff0c;控制器开始执行。 指令解码#xff1a;解码器解析 CMP 指令#xff0c;ALU比较R…一、指令
指令的生成过程 指令执行过程示例
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最终的结果是 : X2Y ,这样的 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. 异常向量表
异常类型向量地址描述异常模式Reset0x00复位异常SupervisorUndefined Instruction0x04未定义指令异常UndefinedSWI0x08软件中断SupervisorPrefetch Abort0x0C预取指令中止异常AbortData Abort0x10数据中止异常AbortIRQ0x18普通中断请求异常IRQFIQ0x1C快速中断请求异常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处理程序