ARM中断异常处理:

ARM系统中止品种:按中断处理降序排列优先级:重置、数据访问中止、高速中断请求、外部中断请求、预取中止、令、软件中断。

ARM体系中的异常中断向量表:

0x0 复位

0x4 没有定义指令

0x8 软件中断(SWI)

0x0c 预取指中止

0x10 数据訪问中止

0x14 保留

0x18 外部中断请求(IRQ)

0x1c 高速中断请求(FIQ)

各异常中断相应着一定的处理器模式,不同处理器模式下有各自的物理寄存器。

假设异常中断处理程序中使用它自己的物理寄存器之外的其它寄存器,异常中断处理程序

必须保存和恢复这些寄存器。

进入和退出异常中断的过程:

进入中断的过程:

<1>将当前程序状态寄存器CPSR的内容保存到将要运行的异常中断相应的SPSR寄存器中。

<2>设置当前程序状态寄存器CPSR中对应的位。使处理器进入对应的运行模式;设置CPSR中的位。禁止IRQ中断。当进入FIQ模式时,禁止FIQ中断。

<3>将寄存器lr_mode设置成返回地址

<4>将程序计数器PC,设置成该异常中断的中断向量地址。从而跳转到对应的异常中断处理程序处运行。

上述的处理器对异常中断的响应过程能够用例如以下的伪代码描写叙述:

R14_<exception_mode> = return_link

SPSR_<exception_mode> = CPSR

CPSR[4:0] = exception_mode_number

/*当执行于ARM状态时*/

CPSR[5] = 0

/*当对应的FIQ异常中断时,禁止新的FIQ中断*/

if <exception_mode> == reset or FIQ then

CPSR[6] = 1

/*禁止新的IRQ中断*/

CPSR[7] = 1

PC = exception_vector_address

响应复位异常中断:当处理器的复位引脚有效时。处理器中止当前指令。当处理器的复位引脚变成无效时,处理器開始运行以下的操作:

R14_svc = UNPREDICTABLE value

SPSR_svc = UNPREDICTABLE value

/*进入特权模式*/

CPSR[4:0] = 0b10011

/*切换到ARM状态*/

CPSR[5] = 0

/*禁止新的FIQ中断*/

CPSR[6] = 1

/*禁止新的IRQ中断*/

CPSR[7] = 1

if high_vectors_configured then

PC = 0xFFFF0000

else

PC = 0x00000000

响应没有定义指令异常中断:处理器检測到没有定义指令异常时,处理器開始运行以下的操作:

R14_und = address_of_next_instruction_after_the_undefined_instruction

SPSR_und = CPSR

/*进入没有定义指令异常中断模式*/

CPSR[4:0] = 0b11011

/*切换到ARM状态*/

CPSR[5] = 0

/*禁止新的IRQ中断*/

CPSR[7] = 1

if high_vectors_configured then

PC = 0xFFFF0004

else

PC = 0x00000004

响应SWI异常中断:处理器检測到SWI异常时,处理器開始运行以下的操作:

R14_svc = address_of_next_instruction_after_the_SWI_instruction

SPSR_svc = CPSR

/*进入特权模式*/

CPSR[4:0] = 0b10011

/*切换到ARM状态*/

CPSR[5] = 0

/*CPSR[6]不变*/

/*禁止新的IRQ中断*/

CPSR[7] = 1

if high_vectors_configured then

PC = 0xFFFF0008

else

PC = 0x00000008

响应预取指中止异常中断:处理器检測到预取指中止异常时,处理器開始运行以下的操作:

R14_abt = address_of_the_aborted_instruction + 4

SPSR_abt = CPSR

/*进入预取指中止异常中断模式*/

CPSR[4:0] = 0b10111

/*切换到ARM状态*/

CPSR[5] = 0

/*CPSR[6]不变*/

/*禁止新的IRQ中断*/

CPSR[7] = 1

if high_vectors_configured then

PC = 0xFFFF000C

else

PC = 0x0000000C

响应数据訪问中止异常中断:处理器检測到数据訪问中止异常时。处理器開始运行以下的操作:

R14_abt = address_of_the_aborted_instruction + 8

SPSR_abt = CPSR

/*进入数据訪问中止异常中断模式*/

CPSR[4:0] = 0b10111

/*切换到ARM状态*/

CPSR[5] = 0

/*CPSR[6]不变*/

/*禁止新的IRQ中断*/

CPSR[7] = 1

if high_vectors_configured then

PC = 0xFFFF0010

else

PC = 0x00000010

响应IRQ异常中断:处理器检測到IRQ异常时,处理器開始运行以下的操作:

R14_irq = address_of_next_instruction_to_be_executed + 4

SPSR_irq = CPSR

/*进入IRQ异常中断模式*/

CPSR[4:0] = 0b10010

/*切换到ARM状态*/

CPSR[5] = 0

/*CPSR[6]不变*/

/*禁止新的IRQ中断*/

CPSR[7] = 1

if high_vectors_configured then

PC = 0xFFFF0018

else

PC = 0x00000018

响应FIQ异常中断:处理器检測到FIQ异常时。处理器開始运行以下的操作:

R14_fiq = address_of_next_instruction_to_be_executed + 4

SPSR_fiq = CPSR

/*进入FIQ异常中断模式*/

CPSR[4:0] = 0b10001

/*切换到ARM状态*/

CPSR[5] = 0

/*禁止新的FIQ中断*/

CPSR[6] = 1

/*禁止新的IRQ中断*/

CPSR[7] = 1

if high_vectors_configured then

PC = 0xFFFF001C

else

PC = 0x0000001C

退出中断的过程:从异常中断处理程序中返回包含下面两个基本操作

<1>将SPSR_mode寄存器的内容拷贝到当前程序状态寄存器CPSR中。以恢复被中断的程序的处理器状态。

<2>将lr_mode寄存器的内容拷贝到程序计数器PC中,以返回到发生异常中断的指令的下一条指令处运行。

对不同的异常中断。PC所指的位置是不同的,同一时候,返回地址也是不同的。

SWI和没有定义指令异常中断处理程序的返回:

SWI和没有定义指令异常中断是由当前运行的指令自身产生的。中断发生时,PC指向当前指令后的第2条指令,处理器将PC-4保存到异常模式下的lr_mode寄存器中,因此通过下面命令来实现返回:MOVS PC, LR 。当异常中断处理程序中使用了数据栈时。能够通过下面指令在进入中断处理程序时保存被中断程序的运行现场,在退出中断处理程序时恢复被中断程序的运行现场:

STMFD sp!, {reglist,lr}

;... ...

LDMFD sp!, {reglist,pc}^



IRQ和FIQ异常中断处理程序的返回:

IRQ和FIQ异常中断发生时,PC指向当前指令后的第3条指令。处理器将PC-4保存到异常模式下的lr_mode寄存器中,这时,PC-4指向当前指令后的第2条指令。因此通过下面命令来实现返回:SUBS PC, LR,#4 。

当异常中断处理程序中使用了数据栈时,能够通过下面指令在进入中断处理程序时保存被中断程序的运行现场,在退出中断处理程序时恢复被中断程序的运行现场:

SUBS LR, LR, #4

STMFD sp!, {reglist,lr}

;... ...

LDMFD sp!, {reglist,pc}^

将异常中断处理程序注冊到异常中断向量表中:

<1>使用跳转指令:在异常中断相应的向量表中特定的位置放一条跳转指令,直接跳转到该异常中断的处理程序。缺点:仅仅能在32M的空间内跳转


<2>的数据读出命令LDR:使用LDR至PC直付值。

第一步:第一绝对异常中断处理程序的地址被存储在距离向量4KB的范围内的存储单元;第二步骤:再利用LDR读单元的内容PC在。

ARM架构和编程-4的更多相关文章

  1. X86 架构和 ARM 架构

    1.关于x86架构 X86是一个intel通用计算机系列的标准编号缩写,也标识一套通用的计算机指令集合,X86是由Intel推出的一种复杂指令集,用于控制芯片的运行的程序,现在X86已经广泛运用到了家 ...

  2. ARM架构和X86架构对比

    转载地址 我们就ARM架构的系统与X86架构系统的特性进行一个系统分析,方便用户在选择系统时进行理性.合理的比价分析. 一.性能: X86结构的电脑无论如何都比ARM结构的系统在性能方面要快得多.强得 ...

  3. ARM架构

    ARM架构(过去称作进阶精简指令集机器(Advanced RISC Machine),更早称作Acorn RISC Machine)是一个32位元精简指令集(RISC) 中央处理器(processor ...

  4. ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?(转载自知乎)

    ARM架构:  由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~ARMv8种类. ARM7:       一类采用ARMv3或ARMv4架构的,使用冯诺依曼结构的内核. ...

  5. 一文解读ARM架构 (转)

    本文主要介绍的是arm架构和x86架构的区别,首先介绍了ARM架构图,其次介绍了x86架构图,最后从性能.扩展能力.操作系统的兼容性.软件开发的方便性及可使用工具的多样性及功耗这五个方面详细的对比了a ...

  6. X86架构与ARM架构比较(摘录自网络)

    引言 CPU是怎样运作的? CPU的运作与人脑的运作差不多.先谈一下人这个系统的工作方式.眼镜.耳朵.舌头.皮肤等等感觉器官接收到"触觉",把信息传给大脑,大脑把信息处理后,把处理 ...

  7. 原子操作--ARM架构

    说明:内核版本号为3.10.101 一.ARM架构中的原子操作实现 在原子操作(一)中我们已经提到,各个架构组织为“复仇者”联盟,统一了基本的原子变量操作,这里我们就拿atomic_dec(v)来看看 ...

  8. 百度全新的ARM架构服务器,一个2U机箱装6台,每台4个3T硬盘,每个机箱共72TB

    1月11日,中国科学院原秘书长.国家科技重大专项国务院咨询评估组专家侯自强,来到百度南京数据中心,和他一起的还有中国工程院院士倪光南以及工业和信息化部电信研究院传输研究所副所长石友康等人.他们看到的是 ...

  9. 让x86的android模拟器能模拟arm架构系统

    网上介绍共计三种模拟器比较常用,分别是bluestacks.andy和Genymotion,前者支持ARM架构,中者支持远程控制,后者启动速度快,各有优缺点. 如果要用genymotion模拟arm的 ...

随机推荐

  1. 跟我一起写 Makefile(一)

    跟我一起写 Makefile  陈皓 概述—— 什么是makefile?也许非常多Winodws的程序猿都不知道这个东西,由于那些Windows的IDE都为你做了这个工作,但我认为要作一个好的和pro ...

  2. linux学习之四---gdb调试

    在Linux应用程序开发中,最经常使用的调试器是gdb. 一.启动和退出gdb gdb调试的对象是可运行文件,而不是程序的源码.假设要使一个可运行文件能够被gdb调试,那么使用编译器gcc编译时须要增 ...

  3. Ubuntu环境下SSH的安装及使用

    Ubuntu环境下SSH的安装及使用 SSH是指Secure Shell,是一种安全的传输协议,Ubuntu客户端可以通过SSH访问远程服务器 .SSH的简介和工作机制可参看上篇文章SSH简介及工作机 ...

  4. C++学习之路—多态性与虚函数(一)利用虚函数实现动态多态性

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 多态性是面向对象程序设计的一个重要特征.顾名思义 ...

  5. 棋盘问题 简单搜索DFS

    Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...

  6. Spring MVC Controller与jquery ajax请求处理json

    在用 spring mvc 写应用的时候发现jquery传递的[json数组对象]参数后台接收不到,多订单的处理,ajax请求: "}]}]} $.ajax({ url : url, typ ...

  7. 解决 Android SDK Manager不能下载旧版本的sdk的问题

    解决无法使用Android SDK  Manager下载SDK开发包的解决办法. 当我们在官网下载google的集成ADT,也就是adt-bundle-linux-x86.zip开发包,进行解压, 打 ...

  8. Delphi Socket的最好项目——FastMsg IM(还有一些IM控件),RTC,RO,Sparkle等等,FileZilla Client/Server,wireshark,NSClient

    https://www.nsclient.org/nsclient/ 好好学习,天天向上

  9. 获取ocx运行路径的另一种方法

    在InitInstance里边可以获取   1 2 3 4 5 6 7 8 9 10 11 12     if (bInit)     {         // TODO: 在此添加您自己的模块初始化 ...

  10. 基于FPGA的红外遥控解码与PC串口通信

    基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...