所以A指令执行完以后头头网电子竞技才能响应中断

当前位置:头头体育亚洲第三 > 头头网电子竞技 > 所以A指令执行完以后头头网电子竞技才能响应中断
作者: 头头体育亚洲第三|来源: http://www.nanjinglvyou.net|栏目:头头网电子竞技

文章关键词:头头体育亚洲第三,异常处理程序

  其中的移植代码中存在的很多问题比如中断的关闭和开启,任务级别的情景切换,中断到任务的情景切换都是我们在平时移植中讲到,我也不在此强调了。在官网中提供的移植过程中存在异常处理机制,这个本不是在移植过程中考虑的,但是文档中确实提供了一个比较好的处理方式。我在此对这一段时间的学习做一个总结。

  首先需要了解ARM的异常处理机制,异常是每一种处理器都必须考虑的问题之一,关键在于如何让处理,返回地址在什么位置都是需要考虑的,

  ARM中支持7种异常,其中包括复位、未定义指令异常、软中断异常、预取指令中止、数据中止、IRQ、IFQ。每一种异常运行在特定的处理器模式下。我在此逐一的分析。

  一般异常发生后,CPU都会进行一系列的操作,这些操作有一部分是CPU自动完成,有一部分是需要我们程序员完成。

  2、 设置适当的CPSR位:改变处理器状态进入ARM状态;改变处理器模式进入相应的异常模式;设置中断禁止位禁止相应中断。头头网电子竞技

  异常的返回地址也是需要我们注意的地方,不同的异常模式返回地址也是存在差异的,这主要是因为各种异常产生的机理存在差别所导致的。这样我们的需要在异常进入处理函数之前或者在返回时调整返回地址,一般采用进入异常处理函数前进行手动调整。下面每一种异常R14保存的值都给了出来,其中也包含了CPU自动处理的部分,根据保存的R14就可以知道怎样实现地址的返回。

  从上面的代码可以知道,头头网电子竞技对于每一种异常,保存的返回地址都是不一样的,一般都需要我们手动的跳转,当然调整的时机也需要我们选择,是在进入处理前跳转还是返回时调整都是需要我们程序员控制的。

  在ARM Developer Suite Developer Guide中对ARM处理器的异常处理操作提供能更加详细的解释,每一种异常下的处理方式如下文描述:

  异常返回时另一个非常重要的问题是返回地址的确定,在前面曾提到进入异常时处理器会有一个保存LR的动作,但是该保存值并不一定是正确的返回地址,下面以一个简单的指令执行流水状态图来对此加以说明。

  我们知道在ARM架构里,PC值指向当前执行指令的地址加8处,也就是说,当执行指令A(地址0x8000)时,PC等于指令C的地址(0x8008)。假如指令A是“BL”指令,则当执行该指令时,会把PC(=0x8008)保存到LR寄存器里面,但是接下去处理器会马上对LR进行一个自动的调整动作:LR=LR-0x4。这样,最终保存在LR里面的是B指令的地址,所以当从BL返回时,LR里面正好是正确的返回地址。同样的调整机制在所有LR自动保存操作中都存在,比如进入中断响应时,处理器所做的LR保存中,也进行了一次自动调整,并且调整动作都是LR=LR-0x4。

  假设在指令A处(地址0x8000)发生了异常,进入异常响应后,LR上经过调整保存的地址值应该是B的地址0x8004。头头网电子竞技

  异常是由指令本身引起的,从SWI中断返回后下一条执行指令就是B,正好是LR寄存器保存的地址,所以只要直接把LR恢复给PC。

  异常是由指令本身引起的,从异常返回后下一条执行指令就是B,正好是LR寄存器保存的地址,所以只要直接把LR恢复给PC。

  因为指令不可能被中断打断,所以A指令执行完以后才能响应中断,此时PC已更新,指向指令D的地址(地址0x800C),LR上经过调整保存的地址值是C的地址0x8008。中断返回后应该执行B指令,所以返回操作是:

  该异常并不是处理器试图从一个非法地址取指令时触发,取出的指令只是被标记为非法,按正常处理流程放在流水线上,在执行阶段触发Prefetch Abort异常,此时LR上经过调整保存的地址值是B的地址0x8004。异常返回应该返回到A指令,尝试重新取指令,所以返回操作是:

  CPU访问存储器时触发该异常,此时PC指向指令D的地址(地址0x800C),LR上经过调整保存的地址值是C的地址0x8008。异常返回后,应回到指令A,尝试重新操作存储器,所以返回操作是:

  1.由于CPU会自动跳转到对应的异常向量中,因此只需要在在各个异常向量中存放对应的操作,最简单的都是存放一个B指令跳转到对应的异常处理函数的操作即可。但由于B指令的跳转返回只有+-32M,而异常处理函数的地址可能会超过+-32M,因此可以采用另一种方式实现方式:在异常向量中保存一条指令LDR PC [addr],其中的addr中就保存了异常处理函数的地址,当然addr的相对地址要小于+-32M。这样也就解决了跳转范围的问题。

网友评论

我的2016年度评论盘点
还没有评论,快来抢沙发吧!