ARM中的异常和中断
2007-12-06 13:26
323 查看
ARM处理器中主要有7个异常(2个中断异常):
1、复位异常;在以ARM为核的单片机中,常把下列事件作为引起复位的原因。
• 上电复位:在上电后,复位使内部达到预定的状态,特别是程序跳到初始入口;
• 复位引脚上的复位脉冲:这是由外部其他控制信号引起的;
• 对系统电源检测发现过压或欠压;
• 时钟异常复位。
ARM处理器复位后,处理器硬件将进行以下操作:
• 强制进入管理模式;
• 强制进入ARM状态;
• 跳转到绝对地址PC=0x00000000处执行;
• 禁止IRQ中断和FIQ中断。
复位后,程序状态寄存器如下:
上电复位后,进入管理模式,执行操作系统程序,一般用做对系统初始化,例如开中断等;然后切换到用户模式,开始执行正常的用户程序。
切换到用户模式可使用下列程序:
MRS R0,CPSR ;读状态寄存器
BIC R0,R0,#03 ;把末两位清0
MSR CPRS_c,R0 ;把修改后的值加载给状态寄存器,切换结束
...... ;用户程序
2、未定义指令异常;由于ARM使用32位代码,包含的信息量很大,可达2的31方(4G)。ARM指令集不能用尽所有代码。当ARM处理器遇到无法译码的指令时就会发
生未定义指令异常。进入中断处理程序。
ARM的未定义指令异常有以下两种情况:
(1)遇到一条无法执行的指令,此指令没有定义;
(2)执行一条对协处理器的操作指令,在正常情况下,协处理器应该应答,但协处理器没有应答。
未定义异常中断时,状态寄存器中的F位不变。使用下列指令退出异常中断,返回原程序 。
• 把下一条指令的地址拷贝给LR;
• 把程序状态寄存器CPSR拷贝给SPSR_und;
• 强制进入未定义模式;
• 强制进入到ARM模式;
• 跳转到绝对地址PC=0x00000004处执行;
• 禁止IRQ中断。
进入中断后,程序状态寄存器如下:
MOVS PC,R14.
3、软件中断异常;是由指令SWI引起的。程序在执行这一指令后,进入异常中断。处理器响应中断,硬件执行如下的操作。
• 把下一条指令的地址拷贝给LR;
• 把程序状态寄存器CPSR拷贝给SPSR_svc;
• 强制进入管理模式;
• 强制进入到ARM状态;
• 跳转到绝对地址PC=0x00000008处执行;
• 禁止IRQ中断。
进入中断后的程序状态寄存器如下:
软件中断处理程序完成后,使用下列指令返回到原中断处:MOVS PC,R14.
4、预取指中止异常;由程序存储器引起的中止异常叫做预取指中止异常;由数据存储器引起的中止异常叫做数据中止异常。由于ARM的指令是3级流水线结构,读
取指令周期是提前进行的,因此把读取指令的过程一般称预取指。如果在取得指令的同时程序存储器发出中止信号,则ARM处理器把这一条指令标记位无效,然后等待执
行。有两种可能如下:
• 当执行这条指令前程序发生跳转,则这条无效指令不引起异常中断;
• 当执行到这条指令时,处理器会发生预取指中止异常,引起中断。
当记进入预取指异常中断时,处理器硬件响应中断,执行以下的操作:
• 把中断时PC的地址拷贝给LR;
• 把程序状态寄存器CPSR拷贝给SPSR_abt;
• 强制进入中止异常模式;
• 强制进入到ARM状态;
• 跳转到绝对地址PC=0x0000000C处执行;
• 禁止IRQ中断。
进入中断后,程序状态寄存器如下:
预取指中止异常中断返回时,应该执行下列指令:SUBS PC,R14,#4.
5、数据中止异常;ARM处理器访问数据存储器时,在读取数据的同时数据存储器发出了中止信号,引起数据中止异常。
数据中止异常中断服务程序返回时,使用下列指令:
SUBS PC,R14,#8
上述指令是返回到中断时所执行的指令,目的是再一次从数据存储器中读取数据。如果不再一次读取数据,则执行下一条指令,此时使用下列指令返回:
SUBS PC,R14,#4
• 把中断时的PC的地址拷贝给LR;
• 把程序状态寄存器CPSR拷贝给SPSR_abt;
• 强制进入中止异常模式;
• 强制进入到ARM状态;
• 跳转到绝对地址PC=0x00000010处执行;
• 禁止IRQ中断。
进入中断后,程序状态寄存器如下:
6、中断请求(IRQ)异常;例如:定时器中断、串行口通讯中断、外部信号中断和A/D处理中断等。IRQ中断是可屏蔽的。在状态寄存器中的I位就是IRQ的屏蔽位
。当I=1时。则屏蔽IRQ中断,当I=0时,则允许中断。处理器复位后置I为1,关闭中断。
当发生IRQ中断时,处理器硬件响应中断,执行下列操作:
• 把中断时的PC的地址值拷贝给LR;
• 把程序状态寄存器CPSR拷贝给SPSR_irq;
• 强制进入IRQ异常模式;
• 强制进入到ARM状态;
• 跳转到绝对地址PC=0x00000018处执行;
• 禁止IRQ中断。
进入中断后,程序状态寄存器如下:
完成中断处理后,程序执行下列返回原中断处:SUBS PC.R14,#4.
7、快速中断(FIQ)请求异常;FIQ快速中断是可屏蔽的。在状态寄存器中的F位就是FIQ的屏蔽位。当F=1时。则屏蔽FIQ中断,当F=0时,则允许中断。处理器复
位后置F为1,关闭中断。
当发生IRQ中断时,处理器硬件响应中断,执行下列操作:
• 把中断时的PC的地址值拷贝给LR;
• 把程序状态寄存器CPSR拷贝给SPSR_fiq;
• 强制进入FIQ异常模式;
• 强制进入到ARM状态;
• 跳转到绝对地址PC=0x0000001C处执行;
• 禁止FIQ中断。
进入中断后,程序状态寄存器如下:
完成中断处理后,程序执行下列返回原中断处:SUBS PC.R14,#4
1、复位异常;在以ARM为核的单片机中,常把下列事件作为引起复位的原因。
• 上电复位:在上电后,复位使内部达到预定的状态,特别是程序跳到初始入口;
• 复位引脚上的复位脉冲:这是由外部其他控制信号引起的;
• 对系统电源检测发现过压或欠压;
• 时钟异常复位。
ARM处理器复位后,处理器硬件将进行以下操作:
• 强制进入管理模式;
• 强制进入ARM状态;
• 跳转到绝对地址PC=0x00000000处执行;
• 禁止IRQ中断和FIQ中断。
复位后,程序状态寄存器如下:
[align=center]......[/align] | [align=center]I[/align] | [align=center]F[/align] | [align=center]T[/align] | [align=center]M4[/align] | [align=center]M3[/align] | [align=center]M2[/align] | [align=center]M1[/align] | [align=center]M0 [/align] |
[align=center]1[/align] | [align=center]1[/align] | [align=center]0[/align] | [align=center]1[/align] | [align=center]0[/align] | [align=center]0[/align] | [align=center]1[/align] | [align=center]1[/align] |
切换到用户模式可使用下列程序:
MRS R0,CPSR ;读状态寄存器
BIC R0,R0,#03 ;把末两位清0
MSR CPRS_c,R0 ;把修改后的值加载给状态寄存器,切换结束
...... ;用户程序
2、未定义指令异常;由于ARM使用32位代码,包含的信息量很大,可达2的31方(4G)。ARM指令集不能用尽所有代码。当ARM处理器遇到无法译码的指令时就会发
生未定义指令异常。进入中断处理程序。
ARM的未定义指令异常有以下两种情况:
(1)遇到一条无法执行的指令,此指令没有定义;
(2)执行一条对协处理器的操作指令,在正常情况下,协处理器应该应答,但协处理器没有应答。
未定义异常中断时,状态寄存器中的F位不变。使用下列指令退出异常中断,返回原程序 。
• 把下一条指令的地址拷贝给LR;
• 把程序状态寄存器CPSR拷贝给SPSR_und;
• 强制进入未定义模式;
• 强制进入到ARM模式;
• 跳转到绝对地址PC=0x00000004处执行;
• 禁止IRQ中断。
进入中断后,程序状态寄存器如下:
[align=center]......[/align] | [align=center]I[/align] | [align=center]F[/align] | [align=center]T[/align] | [align=center]M4[/align] | [align=center]M3[/align] | [align=center]M2[/align] | [align=center]M1[/align] | [align=center]M0 [/align] |
[align=center]1[/align] | [align=center]x[/align] | [align=center]0[/align] | [align=center]1[/align] | [align=center]1[/align] | [align=center]0[/align] | [align=center]1[/align] | [align=center]1[/align] |
3、软件中断异常;是由指令SWI引起的。程序在执行这一指令后,进入异常中断。处理器响应中断,硬件执行如下的操作。
• 把下一条指令的地址拷贝给LR;
• 把程序状态寄存器CPSR拷贝给SPSR_svc;
• 强制进入管理模式;
• 强制进入到ARM状态;
• 跳转到绝对地址PC=0x00000008处执行;
• 禁止IRQ中断。
进入中断后的程序状态寄存器如下:
[align=center]......[/align] | [align=center]I[/align] | [align=center]F[/align] | [align=center]T[/align] | [align=center]M4[/align] | [align=center]M3[/align] | [align=center]M2[/align] | [align=center]M1[/align] | [align=center]M0 [/align] |
[align=center]1[/align] | [align=center]x[/align] | [align=center]0[/align] | [align=center]1[/align] | [align=center]0[/align] | [align=center]0[/align] | [align=center]1[/align] | [align=center]1[/align] |
4、预取指中止异常;由程序存储器引起的中止异常叫做预取指中止异常;由数据存储器引起的中止异常叫做数据中止异常。由于ARM的指令是3级流水线结构,读
取指令周期是提前进行的,因此把读取指令的过程一般称预取指。如果在取得指令的同时程序存储器发出中止信号,则ARM处理器把这一条指令标记位无效,然后等待执
行。有两种可能如下:
• 当执行这条指令前程序发生跳转,则这条无效指令不引起异常中断;
• 当执行到这条指令时,处理器会发生预取指中止异常,引起中断。
当记进入预取指异常中断时,处理器硬件响应中断,执行以下的操作:
• 把中断时PC的地址拷贝给LR;
• 把程序状态寄存器CPSR拷贝给SPSR_abt;
• 强制进入中止异常模式;
• 强制进入到ARM状态;
• 跳转到绝对地址PC=0x0000000C处执行;
• 禁止IRQ中断。
进入中断后,程序状态寄存器如下:
[align=center]......[/align] | [align=center]I[/align] | [align=center]F[/align] | [align=center]T[/align] | [align=center]M4[/align] | [align=center]M3[/align] | [align=center]M2[/align] | [align=center]M1[/align] | [align=center]M0 [/align] |
[align=center]1[/align] | [align=center]x[/align] | [align=center]0[/align] | [align=center]1[/align] | [align=center]0[/align] | [align=center]1[/align] | [align=center]1[/align] | [align=center]1[/align] |
5、数据中止异常;ARM处理器访问数据存储器时,在读取数据的同时数据存储器发出了中止信号,引起数据中止异常。
数据中止异常中断服务程序返回时,使用下列指令:
SUBS PC,R14,#8
上述指令是返回到中断时所执行的指令,目的是再一次从数据存储器中读取数据。如果不再一次读取数据,则执行下一条指令,此时使用下列指令返回:
SUBS PC,R14,#4
• 把中断时的PC的地址拷贝给LR;
• 把程序状态寄存器CPSR拷贝给SPSR_abt;
• 强制进入中止异常模式;
• 强制进入到ARM状态;
• 跳转到绝对地址PC=0x00000010处执行;
• 禁止IRQ中断。
进入中断后,程序状态寄存器如下:
[align=center]......[/align] | [align=center]I[/align] | [align=center]F[/align] | [align=center]T[/align] | [align=center]M4[/align] | [align=center]M3[/align] | [align=center]M2[/align] | [align=center]M1[/align] | [align=center]M0 [/align] |
[align=center]1[/align] | [align=center]x[/align] | [align=center]0[/align] | [align=center]1[/align] | [align=center]0[/align] | [align=center]1[/align] | [align=center]1[/align] | [align=center]1[/align] |
。当I=1时。则屏蔽IRQ中断,当I=0时,则允许中断。处理器复位后置I为1,关闭中断。
当发生IRQ中断时,处理器硬件响应中断,执行下列操作:
• 把中断时的PC的地址值拷贝给LR;
• 把程序状态寄存器CPSR拷贝给SPSR_irq;
• 强制进入IRQ异常模式;
• 强制进入到ARM状态;
• 跳转到绝对地址PC=0x00000018处执行;
• 禁止IRQ中断。
进入中断后,程序状态寄存器如下:
[align=center]......[/align] | [align=center]I[/align] | [align=center]F[/align] | [align=center]T[/align] | [align=center]M4[/align] | [align=center]M3[/align] | [align=center]M2[/align] | [align=center]M1[/align] | [align=center]M0 [/align] |
[align=center]1[/align] | [align=center]x[/align] | [align=center]0[/align] | [align=center]1[/align] | [align=center]0[/align] | [align=center]0[/align] | [align=center]1[/align] | [align=center]0[/align] |
7、快速中断(FIQ)请求异常;FIQ快速中断是可屏蔽的。在状态寄存器中的F位就是FIQ的屏蔽位。当F=1时。则屏蔽FIQ中断,当F=0时,则允许中断。处理器复
位后置F为1,关闭中断。
当发生IRQ中断时,处理器硬件响应中断,执行下列操作:
• 把中断时的PC的地址值拷贝给LR;
• 把程序状态寄存器CPSR拷贝给SPSR_fiq;
• 强制进入FIQ异常模式;
• 强制进入到ARM状态;
• 跳转到绝对地址PC=0x0000001C处执行;
• 禁止FIQ中断。
进入中断后,程序状态寄存器如下:
[align=center]......[/align] | [align=center]I[/align] | [align=center]F[/align] | [align=center]T[/align] | [align=center]M4[/align] | [align=center]M3[/align] | [align=center]M2[/align] | [align=center]M1[/align] | [align=center]M0 [/align] |
[align=center]1[/align] | [align=center]x[/align] | [align=center]0[/align] | [align=center]1[/align] | [align=center]0[/align] | [align=center]0[/align] | [align=center]0[/align] | [align=center]1[/align] |
相关文章推荐
- ARM 中断状态和SVC状态的堆栈切换 (异常)【转】
- ARM异常中断返回的几种情况
- ARM:ARM中断异常的处理流程
- ARM异常、中断以及他们的向量表分析
- 【ARM裸机】 - 中断与异常
- ARM_异常和中断---学习笔记
- ARM 处理器 ~ 中断与异常
- 浅析arm的异常、中断和arm工作模式的联系
- ARM异常中断初探
- ARM中断异常处理的返回
- ARM流水线与异常中断返回的几种情况
- ARM中断异常处理的返回
- ARM异常、中断以及他们的向量表分析
- ARM异常介绍与中断编写(参考与韦东山完全手册)
- Arm架构异常处理流程之中断
- 浅析arm的异常、中断和arm工作模式的联系
- ARM异常---一个Uart中断的触发处理过程:
- ARM异常中断初探----转载
- ARM 中断状态和SVC状态的堆栈切换 (异常)
- 【ARM】arm异常中断处理知识点