×
单片机 > 单片机程序设计 > 详情

ARM中断处理分析

发布时间:2020-05-28 发布时间:
|
中断是CPU提供的一个基本的功能;

中断的基本含义应该是允许CPU在执行某个代码序列的过程中停下来执行另外一个代码序列,这里有两层意思,一个是要切换到另一个场景,另一个是当执行完毕之后必须能够恢复原来的场景。

首先讨论如何才能切换到一个新的场景,

当一条指令的执行完之后,CPU会检查有没有中断产生,如果有就halt当前流水线。重载PC寄存器后重新启动流水线。

ARM7一般为3级流水线价格,分别是取指、译码和执行。PC寄存器中存放的是当前时刻(CPU机器时钟周期)取指操作的目标地址,即CPU即将执行的指令的地址由PC寄存器指定,正常情况下PC指针的内容是CPU自动调整的——每个时钟周期自动+4,在发生跳转时,可以通过直接执行修改PC值的指令来实现。中断的本质就是一次跳转,跟函数调用其实没有什么分别(只不过增加了一些硬件支持),所以这里第一步是将PC值写成对应的中断入口地址,比如IRQ就是0x18.

接下来还需要切换ARM的内核模式到相应的中断模式。写完PC值以后,下一个时钟周期流水线就开始从0x18处取指,然后译码、执行。中断入口地址处存放的是中断向量表,所谓中断向量就是另一个跳转指令,比如LDR     PC, [PC,#24] ,执行完这个跳转之后理论上CPU就已经从一个新的地址开始执行了。这个过程的实现是软硬件结合的结果,硬件负责第一次加载PC,而软件负责再次修改PC值,将程序指向指定的代码序列。

还必须考虑如何恢复原执行场景,这里跟刚才一样,一部分工作由硬件实现,另一部分必须由软件负责实现。因为第一次修改PC到中断入口地址是硬件完成的,所以第一次保存中断现场的工作也只能由硬件完成,这个工作包括将PC被修改前的值保存到LR_irq寄存器中,并将当前PSR寄存器的值保存到SPSR_irq中。为了实现中断嵌套,可能硬件还需要将当前中断信息压栈(硬件栈,而不是内存)以便当嵌套发生时用于恢复。

当程序执行到ISR后,硬件的工作基本完成,软件代码将在当前CPU模式下运行,这可能会修改LR和PSR等寄存器,所以在执行中断处理代码之前需要对这两个寄存器进行保护,否则一旦被破坏以后就无法恢复。这里同样需要保护的还包括工作寄存器等。

软件的职责还包括清掉设备中断标志。

最后,当ISR结束时,软件负责将CPU恢复到中断前的状态,然后利用已保存的LR地址跳转到中断时执行代码的下一行代码开始继续执行。

当涉及到中断嵌套的情况时,重复上述过程,只是硬件此时不需要在改变CPU的工作模式。

当涉及到有操作系统的时候,这个过程会变得稍微复杂一些。

首先在进入中断之前OS需要记录当前中断嵌套的层数,并且在中断退出之后恢复到被中断上下文之前做一次判断,因为中断程序可能改变当前就绪态优先级最高的任务,如果此时优先级最高的任务不再是先前被中断的任务时,得到恢复并继续执行的将是该当前优先级最高的就绪态的任务。

这里只有在中断嵌套层数为0时OS才会提供这样一次机会,否则将恢复到被中断的ISR中继续执行中断处理程序。

关键字:ARM  中断处理 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析