历史上的今天
今天是:2025年03月15日(星期六)
2020年03月15日 | ARM的异常响应过程
2020-03-15 来源:eefocus
其他内容不再赘述,现在粘贴三张需要的表
表1 异常类型,优先级及向量地址

表2 ARM状态下的寄存器组织(Thumb下是其一部分,就不列了)

Thumb状态下的寄存器组织
Thumb状态下的寄存器组是ARM状态下的子集,高位寄存器R8~R12在Thumb状态
下不可见,在Thumb-2下可使用
表3 当前程序状态寄存器CPSR - 1个,备份程序寄存器SPSR_mode(svc,irq,und,fiq,abt)-5个

N~Q为条件码,不做赘述
...........................
控制位含义如下:
I 为中断禁止控制位,I=1禁止外部IRQ中断,I=0允许IRQ中断。
F 为禁止快速中断FIQ的控制位,F=1禁止,F=0允许。
T 为ARM与Thumb指令切换,T=1执行Thumb指令,T=0执行ARM指令。若不具备Thumb指令的处理器,T=1时表示强制下一条执行的指令产生未定义的指令中断。
M4~M0为模式选择位,决定处理器处于何种模式,具体见表1
表4 ARM处理器工作模式

eg:对于CPSR寄存器,选择用户模式且使用快速中断FIQ,禁止IRQ中断,Thumb状态,则CPSR的值为:0x000000B0.
嗯,看完这些,就可以描述ARM异常中断的响应过程和异常处理程序的返回过程了
一:ARM异常的中断响应过程
除了复位异常立即中止当前指令外,其他情况都是处理器完成当前指令才去执行异常处理程序。
1.保存CPSR(当前程序状态寄存器)的值到将要执行异常中断对应的SPSR(备份程序寄存器)。
--SPSR有五组,分别是svc,irq,und,fiq,abt
2.设置当前状态寄存器CPSR的值
设置CPSR的M0-M4的5个位,进入相应工作模式。同时也可以设置F,I,T来禁止允许相应中断,例:设置I=0禁止IRQ中断;设置F=1进入复位模式或者FIQ模式以禁止FIQ中断。
3.将引起异常指令的下一条地址(断点地址)保存到新的异常工作模式的LR(R14_mode,程序链接寄存器)中,使得异常处理程序执行完后能正确返回原来的程序处继续执行。
例如异常中断发生,R13_mode存放堆栈指针,R14_mode存放断点地址。
4.给程序计数器PC强制赋值,转入表1所示的向量地址,以便执行相应的处理程序。
二:从异常处理程序中返回
复位异常发生后,从0x00000000开始重新执行程序,无需返回。其余异常处理完成后必须回到原来程序处执行。
1.将SPSR_mode寄存器的值复制到CPSR中,使得CPSR恢复到原先状态。
1.根据异常类型将PC值恢复成断点地址,以继续执行用户原来运行着的程序。
2.清除CPSR的中断禁止标志I和F,开放外部中断IRQ和快速中断FIQ。
程序状态字和断点地址的恢复是同时进行的,先恢复一方会产生错误。
先恢复CPSR,则保存断点地址的R14_mode不能访问。
先恢复断点地址,则异常处理程序失去对指令的控制,以至于CPSR不能恢复。
在应用程序的设计中,首先要进行异常向量的初始化处理,采用的方法是在异常向量表的特定位置放置一条跳转指令,跳转到异常处理程序。当ARM处理器发生异常时,程序计数器PC会被强制设置为对应得异常向量,从而跳转到异常处理程序,当异常处理完成以后返回到主程序继续执行。
下一篇:ARM的异常及向量表
史海拾趣
|
《AlientekSTM32例程手册》28个实验连载--串口实验--整理后 1.注意我们的教材讲解是基于寄存器操作,方便初学者理解透彻, 2.我们另外还提供了该实例的库函数源码,下载链接:https://bbs.eeworld.com.cn/icview-210815-1-1.html 3.此实验的教程在《Alientek STM32不完全手册》的 3.3节: ...… 查看全部问答> |
|
NVIC_SetPriority(SysTick_IRQn, 0x04) replyreload += \',\' + 1316591;NVIC_SetPriority(SysTick_IRQn, n);n=0x00~0x03 设置Systick为抢占优先级0n=0x04~0x07 设置Systick为抢占优先级1n=0x08~0x0B 设置Systick为抢占优先级2n=0x0C~0x0F ...… 查看全部问答> |
|
暑假期间要做一个5发一收的小玩意,因为以前调过51的24l01,决定移植到2553上,改用spi模块做,按教程一步一步调,发送端调完了,接收端出问题了,只有接收端,检测载波,不管哪个信道,全是有载波,把发送端上电,依旧没有接收,但是一直有载波没 ...… 查看全部问答> |
|
[ESP32-Audio-Kit音频开发板测评]五、读一下ID 这个跑起来我觉得比上个还简单,直接找到读ID的例程 然后点向右键头的编译下载,并按住BOOT键,显示下载成功,按RESET键开始运行: … 查看全部问答> |




