ARM中断体系结构

ARM中断体系结构

一、什么是“中断”?

举个例子,我正在看电视,突然感到肚子疼,想要上大号,这时我就得暂停电视,起身去上厕所啊,上完大号了,人也舒服了,我就回来播放电视继续看。 看电视过程中,突然被打断去完成上厕所这件事,就可以理解为一个中断。说的再通俗一些,你拉的那泡“粑粑”,就是一个中断事件😂。

对于计算机也类似,当CPU在正常执行程序时,突然来了另外的一个紧急事件,这是CPU就得停下正在执行的程序,去完成紧急事件,当完成紧急事件后,再继续执行原本的程序。

中断触发类型

中断事件的触发包括2种类型,硬件触发和软件触发。

打个比方,感到肚子疼进而想上大号,可以是被锤了一拳肚子疼(外部硬件触发),也可以是吃坏了东西肚子疼(内部软件触发)。

中断优先级

还是举这个例子,我正在看电视,突然想上大号,这时刚好又有人敲门,而且桌子上的电话还响了,同时产生了3个中断事件,那么我应该怎么办呢? 当然是按照事情的优先级逐个处理, 先开门把人接进来,然后拿上桌子上的电话,接着去卫生间上大号。

对于计算机也一样,当同时产生多个中断事件,CPU也是按照预先规定的优先级逐个处理。

同时产生多个中断事件时,需要按优先级处理,这个很好理解,但需要注意另一种情况,当你正在处理一个中断事件时,接着又来了其它中断事件,也需要按优先级处理。

ARM处理器的7种中断类型

首先,从名次定义的角度说,中断≈异常。

一件事干的好好的,突然被打断了,能不是一种”异常“吗?

如果要较真,它两的区别在于——异常通常是CPU被动接受,中断可以是其它设备主动发起。

中断(异常)名称 优先级
复位异常(Reset) 1 (最高优先)
数据中止异常 2
快速中断异常(FIQ) 3
外部中断异常(IRQ) 4
预取异常 5
软中断异常(SWI) 6
未定义指令异常 7

二、ARM体系的CPU工作模式

ARM体系下,CPU有7种工作模式:

  1. 用户模式(USR):CPU在正常的程序执行状态。
  2. 快速中断模式(FIQ):用于高速数据传输、通道处理。
  3. 中断模式(IRQ):通用的中断处理。
  4. 管理模式(SVC):也叫特权模式,操作系统使用的一种保护模式。
  5. 数据访问中止模式(ABT):数据或指令预取终止时,进入该模式。
  6. 系统模式(SYS):运行具有特权的操作系统任务。
  7. 未定义指令指令中止模式(UND):用于支持硬件协处理器的仿真。

可以看出,以上7种模式,和上述的7种中断类型有一定联系。

发生各类中断时,CPU自动进入对应的模式。

程序运行时,大都属于“用户模式”,其它6种模式也叫特权模式,为的是处理中断,保护被访问的系统资源。

在ARM状态下,每种工作模式都有16个通用寄存器和1个程序状态寄存器(Current Program Status Register)。 CPSR的具体含义可查手册。

ARM体系中,通常的中断执行步骤
  1. 保护现场。保存当前程序的状态到SPSR寄存器,保存当前的PC值到R14,可以理解为按下电视暂停键。
  2. 模式切换。根据中断类型,进入IRQ模式或者FIQ模式。可以理解为选择跑着去卫生间还是走着去。
  3. 多个中断请求处理。即同时产生多个中断时,识别优先级和中断标志位,判断应先处理哪个中断。
  4. 获取中断服务子程序地址。PC指针跳转到“中断向量表”保存的IRQ或FIQ中断向量地址处,即中断服务子程序的地址入口,可以理解为大脑获取卫生间的地址。
  5. 中断返回,恢复现场。当完成中断事件后,将SPSR寄存器中保存的程序状态恢复到CPSR寄存器中,R14保存的PC值恢复到PC中,继续先前执行的程序,可以理解为回来按下电视播放键继续看。
中断向量

中断向量就是中断源的识别标志,用来存放相应中断服务程序的入口地址(首地址),

中断向量表

ARM地址空间预先设置了一种表格结构,当中断发生时,查询这个表格就能获取该种中断的地址入口,而这个表格就叫“中断向量表”。

向量表开始于存储器映射的低地址0x00000000,个别处理器起始于高地址。

异常类型 CPU模式 功能 低地址
复位异常(Reset) 特权模式 快速中断请求处理 0x0000000
未定义指令异常 未指定指令中止模式 外部中断请求处理 0x0000004
软中断异常(SWI) 特权模式 操作系统的高级处理 0x0000008
预取指令异常 数据访问中止模式 操作系统的高级处理 0x000000C
数据异常 数据访问中止模式 存储器保护 0x0000010
外部中断 外部中断请求模式 存储器保护 0x0000018
快速中断 快速中断请求模式 软件模拟硬件协处理器 0x000001C

ARM体系的7种中断,详述

ARM体系,有7种不同的中断类型,而不同的中断源对应不同的中断地址入口,当中断发生时,CPU 将1个特定的存储器地址放入PC中,实现跳转。

1 复位异常

当CPU接收到复位引脚信号,即系统上电或系统复位时,系统产生复位异常中断。

此时,程序跳转到处理复位异常的中断服务程序,通常包含一些与系统初始化相关的操作:

  • 设置异常中断向量表
  • 初始化堆栈
  • 初始化存储系统、关键I/O设备等
  • 使能中断
  • 切换CPU至适当的工作模式
  • 初始化C语言变量,跳转到接下来的应用程序中
2 未定义指令异常

当ARM处理器执行任一外部<协处理器>的指令时,必须等待该协处理器应答后,才能真正地执行该指令,这一点类似于TCP协议中的“握手”。

但是如果协处理器没有应答,就会产生未定义指令异常。

如果尝试执行未定义指令,也会产生未定义指令异常,处理器会被切换到未定义指令中止模式。

3 SWI软中断异常

使用软中断指令,处理器会切换到管理模式,执行特定的管理(操作系统)函数。

4 预取指令中止异常

当指令预取访问存储器失败时,存储器想ARM处理器发出中止信号,该预取指令会被标记无效,但这时还不会产生异常,只有当ARM处理要执行标记过无效的指令时,才会产生异常。这里可以理解为,当发生2次预取指令失败时,就会产生异常。

当发生预取指令中止异常时,程序应返回到引发异常的指令处,重新读取并执行该指令,而不是返回到该指令的下一条指令处。

5 数据访问中止异常

如果数据访问指令的目标地址不存在,或者该地址不允许访问时,由存储器发出数据中止信号,产生数据访问中止异常。

6 外部中断请求异常

通过CPU的IRQ输入引脚,由外部产生IRQ异常,系统中的各种外设通常用这种中断方法请求服务。

7 快速中断请求异常

通过CPU的FIQ输入引脚,由外部产生FQI异常。

FIQ向量位于向量表末尾,这样可以省去一条跳转指令,能够提高响应速度。

posted @   莱特山山酒  阅读(575)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示