预览加载中,请您耐心等待几秒...
1/8
2/8
3/8
4/8
5/8
6/8
7/8
8/8

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

WindowsCE异常和中断服务程序初探 简介:windowsCE异常和中断服务程序初探。阅读本文使您加深对windowsCE异常和中断服 务程序的认识 1。中断/异常相量的装入和执行方式。 中断和异常都是异步发生的事件,当该事件发生,系统将停止目前正在执行的代码转而执行事件响应的服 务程序。而事件服务程序的入口点就是中断/异常向量所在的位置。arm的中断向量可以是0x0开始的低 地址向量,也可以是在FFFF0000位置的高向量地址。winCE下使用高地址作为trap区,所以在CE下arm 使用高地址向量。下面我们来了解一下中断/异常向量的安装和执行过程。 在kernelStart的过程中通过程序将如下代码复制到ffff0000的位置. VectorInstructions ldrpc,[pc,#0x3E0-8];reset ldrpc,[pc,#0x3E0-8];undefinedinstruction ldrpc,[pc,#0x3E0-8];SVC ldrpc,[pc,#0x3E0-8];Prefetchabort ldrpc,[pc,#0x3E0-8];dataabort ldrpc,[pc,#0x3E0-8];unusedvectorlocation ldrpc,[pc,#0x3E0-8];IRQ ldrpc,[pc,#0x3E0-8];FIQ 而在ffff03e0的位置放上如下的数据,每一项(32bit)对应一个异常的跳转地址也就是winCE的异常/中 断向量跳转表。该表项的内容就是发生异常后将要执行的服务程序的入口地址。具体如下。 VectorTable DCD-1;reset DCDUndefException;undefinedinstruction DCDSWIHandler;SVC DCDPrefetchAbort;Prefetchabort IF:DEF:ARMV4T:LOR::DEF:armV4I DCDOEMDataAbortHandler;dataabort ELSE DCDDataAbortHandler;dataabort ENDIF DCD-1;unusedvector DCDIRQHandler;IRQ DCDFIQHandler;FIQ 在上面的这些代码/数据在内存空间上按照上述要求放置好以后,每次触发一个异常就自动运行到相应跳 转表项所对应的地址执行。 2.异常/中断服务程序 在arm下,由于有7种异常状态包括reset、Undefexception、softwareinterrupt(swi)、Prefech Abort、DataAbort、IRQ、FIQ七种异常/中断。reset仅在复位时发生,其他6种都是在系统运行时发 生。当任何一个异常发生并得到响应时,arm内核自动完成以下动作: 拷贝CPSR到SPSR_ 设置适当的CPSR位: 改变处理器状态进入arm状态 改变处理器模式进入相应的异常模式 设置中断禁止位禁止相应中断 更新LR_ 设置PC到相应的异常向量同时不管异常发生在ARM还是Thumb状态下,处理器都将自动进入ARM状 态。并且中断使能会自动被关闭。在这个时候由于部分通用寄存器是不同模式公用的,所以还需要保存这 些将会被破坏的寄存器,待到处理完成的时候恢复这些寄存器被中断前的状态。另外在进入异常模式后, lr的值不一定就是我们所需恢复执行的位置,该位置受到异常类型和流水线误差的影响。在SWI模式 下,LR就是返回值。在IRQ和FIQ中LR=LR-4,DataAbort下LR=LR-8;具体原因我们就不讨论了,有兴趣 可以参看<基于arm的嵌入式程序开发要点>一文。下面分别对这些服务程序进行分析。 2-1.undefexception服务程序 undefexception在执行到过非法的指令时产生,通常来模拟一些处理器不支持的功能,如浮点运算。简 单说一下undefexception的过程:当当前指令为一条处理器不支持的指令时,处理器会自动动将该指令 送交各协处理器(如MMU、FPU)处理,如果这些协处理器都无法识别这条指令的时候,就产生该异常。下 面开始看相应的代码。 NESTED_ENTRYUndefException sublr,lr,#4;(lr)=addressofundefinedinstruction stmdbsp,{r0-r3,lr} movr1,#ID_UNDEF_INSTR bCommonHandler ENTRY_ENDUndefException 上面就是undefException的服务程序的入口处(已经将不参与