M3 M4内核异常的具体行为

2019-07-21 00:44发布

        我看了一下cortex-M3的权威指南,有些问题不明白,想请教各位大神帮忙指点。
        在那本书的第九章,讲的就是中断的具体行为,其中写道:
            中断/异常的相应序列
                1、入栈:把八个寄存器的值压入栈中
                2、取向量:从向量表中找出对应的服务程序入口地址。
                3、选择堆栈指针MSP/PSP,更新堆栈指针SP,跟新连接寄存器LR,更新程序计数器PC。

            行为的具体行为介绍,压栈是硬件自动完成,压入八个寄存器的值,包括了r1,r2,r3,r12,pc,lr,xPSR等保护现场。然后是取向量,有指令总线自动完成。上面的这些几乎都是有硬件完成,且是自动,不用多管。关键是下面的更新寄存器。我原样写上来!
                入栈和取向量操作完成之后。在执行服务立城之前,还要更新一系列的寄存器。
                1、sp:在入栈之后会把堆栈指针(PSP/MSP)更新到新的位置。在执行服务例程时,将由MSP负责对堆栈的访问。
                2、PSR:更新IPSR字段的值为新响应的异常编号。
                3、PC:在取完向量之后,PC将指向服务例程的入口地址。
                4、LR:在出入ISR的时候,LR的值将从新的到诠释、、、、(诠释内容略,不用关心)。
                以上是响应异常时的通用寄存器的变化,另一方面,在NVIC中,也有跟新若干个相关寄存器。(这个我几乎可以确定是自动更新,用户程          序不用关心)。我想知道的是SP会跟新如果他更新了,那么栈就改变了,要想在会来,要怎回来。不管他是硬件更新还是程序更新,总要有个              可以恢复SP的方法吧。书上直说会更新,没有解释怎么更新,也没有说怎么恢复,只是说了遇到某些特定指令后启动中断返回序列,然后就堆栈SP      就回来了。
                我想问的就是SP是怎么恢复的,是在新的SP的栈低存放着原来的SP吗?还是有其他的机制保存这个SP?我经过单步调试  几乎看不出来结          果!    
     
      (cortex-m3权威指南 Joseph yiu著 宋岩 译   第九章   P145)           
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。