中止是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中持续履行中止处理程序。