首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM 异常处理过程讲解(1)

ARM 异常处理过程讲解(1)

近来翻了uOS-II官网给出来的ARM7-ARM9移植手册(AN-104),分析了在ARM中移植的问题,想想从来没有认真的学习过ARM的汇编,趁着这个机会复习复习吧。其实底层的东西才是创造力的心脏。
其中的移植代码中存在的很多问题比如中断的关闭和开启,任务级别的情景切换,中断到任务的情景切换都是我们在平时移植中讲到,我也不在此强调了。在官网中提供的移植过程中存在异常处理机制,这个本不是在移植过程中考虑的,但是文档中确实提供了一个比较好的处理方式。我在此对这一段时间的学习做一个总结。
首先需要了解ARM的异常处理机制,异常是每一种处理器都必须考虑的问题之一,关键在于如何让处理,返回地址在什么位置都是需要考虑的,
ARM中支持7种异常,其中包括复位、未定义指令异常、软中断异常、预取指令中止、数据中止、IRQIFQ。每一种异常运行在特定的处理器模式下。我在此逐一的分析。
一般异常发生后,CPU都会进行一系列的操作,这些操作有一部分是CPU自动完成,有一部分是需要我们程序员完成。
首先说明CPU会自动完成的部分,用ARM结构手册中的代码描述如下:
R14_<exception_mode> = return link                //这个可以参看寄存器的说明,两个作用
SPSR_< exception_mode > = CPSR
CPSR[4:0] = exception mode number
CPSR[5] = 0
;                     //AEM指令
If <exception_mode>==Reset or Fiq then    //只有在复位和FIQ模式下才会关闭FIQ中断
CPSR[6] = 1
;
CPSR[7] = 1
;                            //任何异常模式下都会关闭IRQ中断
PC = exception vector address
从上面的代码中我们可以发现CPU自动处理的过程包括如下:
1、  拷贝CPSRSPSR_<mode>
2、  设置适当的CPSR位:改变处理器状态进入ARM状态;改变处理器模式进入相应的异常模式;设置中断禁止位禁止相应中断。
3、  更新LR_<mode>,这个寄存器中保存的是异常返回时的链接地址
4、  设置PC到相应的异常向量
以上的操作都是CPU自动完成,异常的向量表如下:


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


可以看出该模式下的先对来说返回地址也比较简单,不需要做太多的描述。
未定义的指令异常:


[url=]返回的方式也比较简单:[/url]

MOVS  PC, R14
软中断异常:


返回的方式也比较简单:

MOVS  PC, R14
预取指令中止异常:


返回需要做下面的调整:
SUBS      PC, R14, #4
数据中止


返回地址需要做下面的调整:
如果需要重新访问数据则:
SUBS      PC, R14, #8
如果不需要重新访问数据则:
SUBS      PC, R14, #4
IRQ中断的处理过程:


返回地址需要做下面的调整:

SUBS PC,R14,#4
IFQ中断:


返回地址需要做下面的调整:

SUBS  PC, R14 ,#4
从上面的代码可以知道,对于每一种异常,保存的返回地址都是不一样的,一般都需要我们手动的跳转,当然调整的时机也需要我们选择,是在进入处理前跳转还是返回时调整都是需要我们程序员控制的。
ARM Developer Suite Developer Guide中对ARM处理器的异常处理操作提供能更加详细的解释,每一种异常下的处理方式如下文描述:
异常返回时另一个非常重要的问题是返回地址的确定,在前面曾提到进入异常时处理器会有一个保存LR的动作,但是该保存值并不一定是正确的返回地址,下面以一个简单的指令执行流水状态图来对此加以说明。


返回列表