gzyueqian
13352868059

粤嵌科技讲解怎么处理arm中的异常返回地址

更新时间: 2020-03-23 16:49:40来源: 粤嵌教育浏览量:5981

      如果说想要学习嵌入式的话,那么arm是大家必须要掌握好的了,嵌入式这么对于动手能力要求非常强的行业,不管是细节上面还是大体上面要求都是非常的严格的。那么在学习嵌入式的时候是会经常遇到arm中出现的异常返回的,这个要怎么处理呢?下面粤嵌科技的嵌入式培训讲师就来给大家讲解下:

  FIQ与RIQ异常:


  FIQ与RIQ异常返回处理是一样的,当处理器执行完当前指令后才去查询中断且查看是否允许中断,如果处理器产生了中断,这时PC的值已经更新,即PC指向了当前指令后第三条指令的位置(被中断指令地址加12),产生FIQ与RIQ异常后处理器将PC-4的值保存到了对应模式下的LR,而它指向的是当前被中断指令的后面的第二条指令,因此在返回时我们需要人为的将LR中保存的值自减4以得到正确的返回地址。

 

  预取指中止异常:


  在指令预取时如果地址是非法的,该指令就被标记为有问题的指令,流水线上该指令之前的指令继续执行,当执行被标记为有问题的指令的时候,处理器就会产生异常。产生该异常终返回时需要返回到被标记的指令处重新读取并执行该指令,因此异常返回时需要返回到该指令处而不是该指令的下一条指令。所以在中断返回时我们需要人为的对LR中保存的值自减4。


  指令未定义异常:


  指令未定义异常由当前正在执行的指令产生,即产生异常时PC的值还没有更新,PC的值指向当前指令后面第二条指令,产生异常后LR中保存的指令是当前指令的下一条指令的地址,所以异常返回时直接把LR的值给PC即可不许人为的去修正返回地址。


  软中断异常:

  软中断异常与指令未定义异常一样,也是当前指令在执行过程中就产生了异常,所以LR中保存的返回地址是当前软中断指令的下一条指令的地址,不需要人为的去修正,返回时直接将LR的值赋给PC即可。


  数据中止异常:


  产生该异常的时候程序要返回到有问题的指令处重新访问该数据,因此应该返回到产生异常的指令处而不是产生异常指令的下一条指令处。当异常产生时PC的值已经更新,所以PC指向的是异常产生指令的后面的第三条指令,而LR中保存的是PC-4的值即异常产生指令的后面的第二条指令的地址。所以在返回时我们需人为的对LR中的值进行自减8的处理。以保证异常正确的返回。


  上述每一种异常发生时,返回地址都要根据具体的异常类型进行重新修正。如果说在学习或者是工作的时候会出现以上粤嵌科技的嵌入式培训讲师给大家整理的这些异常的话,大家只要按照以上的做法就可以恢复正常了。想要了解更多关于嵌入式的技术问题的话,可以点击我们文章下面的获取试听资格按钮来获取我们的嵌入式课程免费试听资格,来和我们的讲师进行面对面的交流。

免费预约试听课