什么是ARM中断事件?ARM中断异常处理具体过程

处理器/DSP

872人已加入

描述

ARM处理器是一种流行的处理器架构,用于许多现代移动设备和嵌入式系统中。中断和异常是ARM处理器中的两个重要概念,它们是处理器中断程序执行的关键机制。

什么是ARM中断事件?

中断是一种处理器事件,通常是外部设备或其他程序发出的信号,通知处理器需要执行某个任务或服务请求。在ARM处理器中,中断信号通常由中断控制器发出,并在处理器中断向量表中找到对应的中断处理程序。处理器在接收到中断信号后,要放下当前正在执行的任务而去执行中断处理程序。

怎么理解,打个比方,当你在家做饭的时候,突然电话铃声响起,你必须放下眼前正在干的的事情去处理完这个电话,然后再回来继续做饭。这里,电话铃声就是中断事件信号,拿起电话,与对方说话的过程就是处理中断事件的过程。

ARM处理器支持两种不同类型的中断,即中断请求(IRQ)和快速中断请求(FIQ)。IRQ通常用于处理一般的外部设备中断,而FIQ则用于处理更紧急的、时间敏感的中断请求。

FIQ优先级高于IRQ

(1) 同时请求,优先处理FIQ

(2) 已经在处理IRQ, FIQ中断可以中断IRQ的处理

异常是指处理器内部事件,通常是由程序错误、非法操作或硬件故障引起的。与中断类似,异常也会导致处理器停止当前执行的任务并转而执行异常处理程序。

打个比方,异常就像是做饭的时候突然起火了,表示做饭这个正常任务时候出现错误或者故障情况,必须要先去把起火这个异常事件处理了才能回来继续做饭。

异常分类

ARM处理器支持多种类型的异常,例如,未定义指令异常、数据中止异常、软件中止异常等。这些异常都有不同的原因和处理程序:

  1. 复位异常,当CPU刚上电时或按下reset重启键之后进入该异常,该异常在特权模式(SVC)下处理。
  2. 未定义指令异常,该异常发生在流水线技术里的译码阶段,如果当前指令不能被识别为有效指令,产生未定义指令异常,该异常在未定义异常模式下处理。
  3. 软件中断指令(swi)异常,该异常是软件程序自己执行软中断指令时产生,该异常也是在特权模式(SVC)下处理。
  4. 数据中止访问异常,该异常发生在要访问数据地址不存在或者为非法地址时,该异常在中止异常模式(ABT)下处理。
  5. 预取指令中止异常,该异常发生在CPU流水线取指阶段,如果目标指令地址是非法地址进入该异常,该异常在中止异常模式下处理。

总之,中断和异常是ARM处理器中的两个重要概念,它们为系统提供了处理器级别的事件和错误处理机制。处理器中断和异常的处理过程非常重要,因为它们可以确保系统的稳定性和可靠性,以及及时响应外部事件和内部错误。在ARM处理器中,中断和异常是实现可靠系统的关键机制之一。

ARM中断异常处理具体过程

处理器中断和异常的处理过程是非常重要的,因为它们可以保证系统的稳定性和可靠性。当中断或异常发生时,处理器会停止当前执行的任务,并跳转到相应的处理程序,以执行必要的任务或服务请求。一旦中断或异常处理完成,处理器将返回到原来的任务,并继续执行。

整体流程如下图:

ARM处理器

异常发生的硬件操作

当ARM处理器遇到中断异常时,ARM内核硬件会自动做以下工作:

  • 保存执行状态:将CPSR复制到发生的异常模式下SPSR中,便于异常返回时候,恢复到CPSR,恢复到异常前执行状态;
  • 模式切换:将CPSR模式位强制设置为与异常类型相对应的值,同时处理器进入到ARM执行模式,禁止所有IRQ中断,当进入FIQ快速中断模式时禁止FIQ中断;
  • 保存返回地址:将下一条指令的地址(被打断程序)保存在LR(异常模式下LR_excep)中。注意:由于流水线技术再结合异常类型不同,异常的返回地址是有区别的,这里提醒一下,我们将在后面文章具体写中断处理代码的时候详细分析一下具体地址的计算细节,因此也需要在中断处理程序里面修正。
  • 跳入异常向量表:强制设置PC的值为响应异常向量地址,将跳转到异常向量表(Exception Vector Table)中相应的异常处理程序。

异常向量表

异常向量表是一个特殊的内存区域,其中包含了处理器在不同类型异常发生时跳转的地址。每种ARM异常对应一个字长空间(4 Bytes),正好是一条32位指令长度,当异常发生时,CPU强制将PC的值设置为当前异常对应的固定内存地址。

下图展示了ARM处理器的异常向量表结构:

ARM处理器

当ARM处理器遇到中断异常时,它将读取相应的异常向量表条目,获取异常处理程序的地址。然后,处理器将跳转到该地址,开始执行异常处理程序。

正是由于异常向量表的存在,才让硬件异常处理和软件工程师自定义的处理程序有机联系起来。

异常处理程序

异常处理程序会执行一系列操作,以尽可能快地处理异常。这些操作包括:

  1. 修正返回地址,上面提到,由于流水线技术再结合异常类型不同,异常的返回地址是有区别的,更具不同模式LR的值要做个修正,具体如何修正我们再在后面文章再详细介绍。
  2. 保存寄存器状态:为了避免丢失现有的寄存器状态,异常处理程序通常会将寄存器状态保存到内存中,通常是保存在异常模式下的栈(SP_excep)里面,便于后面恢复。
  3. 诊断异常:异常处理程序可能需要分析异常的原因和上下文,以便确定如何恢复。
  4. 恢复异常:一旦异常原因被确定,异常处理程序可能会执行一些操作来恢复异常状态。例如,它可能会尝试重新加载指令或数据缓存,或者重新启动处理器。
  5. 恢复寄存器状态:最后,异常处理程序会将之前保存的寄存器状态从内存中恢复,以便处理器可以继续执行指令。
  6. 返回现场,在完成以上操作后,异常处理程序将跳转回原始指令的下一条指令处,将LR赋给PC,使处理器可以继续执行。
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分