异常与中断
- 硬件平台:韦东山嵌入式Linxu开发板(S3C2440.v3)
- 软件平台:运行于VMware Workstation 12 Player下UbuntuLTS16.04_x64 系统
- 参考资料:https://wenku.baidu.com/view/6e2a774a336c1eb91a375d64.html, S3C2440datasheet,开发版原理图,《ARM体系与编程》杜春雷
- 源码仓库:https://gitee.com/d_1254436976/Embedded-Linux-Phase-1
目录
一、基础知识点
-
特权模式与用户模式
多数系统将处理器工作模式划分为特权模式和用户模式
1.1 特权模式:一般指操作系统管理程序运行的状态,具有较高的特权级别,又称为特权态(特态)、系统态、管态。当处理器处于管态时全部指令(包括特权指令)可以执行,可使用所有资源,并具有改变处理器状态的能力。
1.2 用户模式:一般指用户程序运行时的状态,具有较低的特权级别,又称为普通态(普态)、用户态、目态。当处理器处于目态时,就只有非特权指令能执行。 -
使用到的寄存器简称
{
程序计数器(PC)
堆栈指针寄存器(SP)
链接寄存器(LR)
程序状态寄存器(CPSR)
程序状态保存寄存器(SPSR)
} -
代码密度
代码密度:单位存储空间中包括的指令的个数。比如ARM指令是32位的。而Thumb指令时16位的,假设在1K的存储空间中,能够放32条ARM指令,就能够放64条Thumb指令,因此在存放Thunb指令时,代码密度高。
二、什么是异常与中断
- 异常:是指CPU内部出现的中断,即在CPU执行特定指令时出现的非法情况。同时异常也称为同步中断,
因此只有在一条指令执行后才会发出中断 ,不可能在指令执行期间发生异常。 - 中断:也称为异步中断。因此它是由其他硬件设备依照 CPU 时钟信号随机产生,即意味着中断能在指令之间发生。
中断又分为外部可屏蔽中断(INTR)和外部非屏蔽中断(NMI),所用I0设备产生的中断请求均引起可屏蔽中断。
三、ARM怎样处理中断/异常
- 初始化:a.设置中断源,让其可以产生中断
b.设置中断控制器(屏蔽优先级)
c.设置CPU总开关 - 执行程序:(开发者自行设计的程序)
- 产生中断:产生中断:某个动作信号——>中断控制器——>CPU
CPU每执行完一条指令,都会检查有无中断或异常产生
发现有异常/中断产生,开始处理
{
对于不同异常跳去不同地址执行程序
} - 异常/中断程序处理
{
a.保存现场(可保存在各种寄存器中)
b.处理异常/中断
{
分辨中断源
在调用不同的函数
}
c.恢复现场
}
提问:中断程序怎么被调用?
回答:主要通过硬件和软件的协调作用
—硬件:cpu通过跳转指令到达某个地址(查询可知地址0x18)——>0x18
—软件:0x18中保存着处理函数——>保存现场——>处理异常/中断(分辨中断源、调用对应函数)——>恢复现场
四、CPU模式(Mode)_状态(State)与寄存器
-
CPU的State:
{
ARM State:AMR指令集,每个指令4byte
THUMB State:THUMB指令集,每个指令2byte(多用于单片机,单片机Flash空间小)
}
二者的区别:
Thumb指令能够看做是ARM指令压缩形式的子集。是针对代码密度的问题而提出的。它具有16位的代码密度。Thumb不是一个完整的体系结构,不能指望处理程序仅仅运行Thumb指令而不运行ARM指令集。因此。Thumb指令仅仅须要支持通用功能。必要时,可借助完好的ARM指令集,比如:全部异常自己主动进入ARM状态。在编写Thumb指令时。先要使用伪指令CODE16声明,并且在ARM指令中要使用BX指令跳转到Thumb指令,以切换处理器状态。编写ARM指令时,可使用伪指令CODE32声明。 -
CPU分为七种模式:
{
用户模式:usr
特权模式:
{
系统模式:sys
异常模式:
{
未定义指令模式:Undefined(und)
管理模式:Supervisor(svc)
中止模式:Abort(abt)
中断模式:IRQ(irq)
快中断模式:FIQ(fiq)
}
}
}
!特权模式可以编程操作CPSR任意切换六种模式,用户模式下则不可!
提问:如何在用户模式下切换其他模式?
回答:实现模式切换,可通过软件中断的方式实现异常,如中断指令SWI(具体操作细节在下面第四个swi异常模式有讲)。ARM State下七种模式的使用的寄存器如下图:
分析:每个模式需要用到的寄存器有相同的,也有每个模式下专用的寄存器 在异常模式下,R13为SP寄存器,R14位LR寄存器(用于保存发生异常时的指令地址)
THUMB State下七种模式的使用的寄存器如下图
分析:每个模式需要用到的寄存器有相同的,也有每个模式下专用的寄存器. 有8个状态寄存器集通用寄存器,R0-R7,以及程序计数器(PC),堆栈指针寄存器(SP),链接寄存器(LR),、程序状态寄存器(CPSR)和程序状态保存寄存(SPSR) !SPSR用来保存“被中断模式的CPSP”!
程序状态寄存器CPSR,SPSR分析
M0-M4——Mode bits,设置模式的切换(如果处于用户模式则无法修改),具体如上图
T——State bits,切换状态,T=1,为THUMB状态,T=0,为ARM状态
F——FIQ disable,F=1,FIQ中断被禁止
I——IRQ disable,I=1,IRQ中断被禁止
bit8-bit27——Resverved保留位
bit28-bit31——状态位
- 硬件处理异常流程
----在进入异常时:
a.在适当的链接寄存器中保留下一条指令的地址。如果有例外的话从ARM状态输入,然后将下一条指令的地址复制到链接寄存器(即,当前PC + 4或PC + 8取决于异常。详见表2-2)。如果有例外的话从THUMB状态输入,然后写入链接寄存器的值是当前PC偏移量的一个值使程序在从异常返回时从正确的位置恢复。这意味着异常处理程序不需要确定异常是从哪个状态输入的。
公式表达:LR-异常 = 下一条指令地址(被中断指令)即PC+4/PC+8
b.将CPSR的数据传输到适当的SPSR中。
公式表达:SPSR—异常 = CPSR
c.将CPSR模式位(M0-M4——Mode)修改,进入异常模式
d.跳到向量表
---- 退出异常时<