- 1、本文档共29页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第五章 异常及编程 5.1 ARM的异常 5.2 复位及编程 5.3 SWI中断处理程序 5.4 FIQ和IRQ中断处理程序 5.1 ARM的异常 程序正常执行流程中,程序计数器在其地址范围内连续增加,还可以跳转至附近程序标号或跳转并链接到子程序。 当该常规执行流程被转向到启用处理器处理内部或外部资源产生的事件时,即发生了处理器异常。 外部产生的中断; 处理器试图执行一个未定义的指令; 访问有特权的操作系统函数。 处理此类异常时,有必要保护处理器先前的状态,以保证在完成相应的异常处理例程后能够恢复产生异常时程序运行的状态,使其继续执行。 ARM处理器模式 ARM异常处理过程 ARM产生异常时,在任何情况下处理异常的方法都是一样的,即: (1)通过将PC拷贝到R14_exc以及将CPSR拷贝SPSR_exc来保存当前的状态( exc表示异常类型) 。 (2)将处理器操作模式改变为适当的异常模式。 (3)禁用中断。 (4)将PC强制变为00H~1CH范围内某个与异常类型有关的特殊值(向量地址)。这个向量地址是指向异常处理程序的转移指令—也即开始执行异常处理程序。 从异常处理程序的返回 从异常返回的方法取决于该异常处理程序使用不使用堆栈操作。通常情况下,异常处理的返回必须: 从SPSR_exc恢复CPSR; 使用R14_exc(LR)中的返回地址恢复程序计数器PC。 不必从复位处理程序返回,因为复位处理程序直接执行主代码。 如果异常处理程序使用了堆栈,可以通过使用一条装载多个带^限定符的指令来返回。 LDMFD SP!,{ R0~R12,PC } ^ 限定符^指定从SPSR_exc恢复CPSR。 从SWI和未定义指令异常处理程序返回 SWI和未定义指令异常是由指令本身造成的,因此,处理异常时,处理器将(PC - 4)存储在R14_exc中。因而使R14_exc指向下一条要执行的指令。要从R14中恢复程序计数器,则使用: MOVS PC,R14 从处理程序返回控制权。 将返回地址推入堆中并在返回时将其弹出的处理程序入口和出口代码为: STMFD SP!,{ reglist,R14 } ;... LDMFD SP!,{ reglist,PC }^ 从FIQ和IRQ中断处理程序返回 执行完每一条指令后,处理器检测中断管脚是否为 LOW(电平),以及 CPSR中断禁用位是否为清除。结果,仅在程序计数器被更新后才发生 IRQ 或 FIQ 异常。处理器将 (PC - 4) 存储在R14_exc中。使R14_exc指向发生异常时尚未完成的一条指令。处理程序完成后,必须从 R14_exc指向的上一条指令处继续运行。 该继续执行地址较R14_exc中的地址少一个字(四个字节),因此,其返回指令为: SUBS PC, R14,#4 将返回地址压入栈中并在返回时将其弹出的处理程序入口和出口代码为: SUB R14,R14,#4 STMFD SP!,{ reglist,R14 } ;... LDMFD SP!,{ reglist,PC }^ 对于发生在 Thumb 状态下的异常,处理程序返回指令 (SUBS PC,R14,#4) 改变了程序计数器,将其指向下一条要执行指令的地址。由于程序计数器的更新是在处理异常之前完成,下一条指令应在 (PC - 4) 。因此,处理器存储在R14_exc的值为PC 。 安装异常处理程序 必须将任何新的异常处理程序安装在向量表中。安装完成后,不论什么时候产生相应的异常,都会执行新的处理程序。 在复位时安装处理程序 如果ROM是在存储器的0x00位置,则可在代码的起始处为每个向量分配一个跳转语句。如果FIQ处理程序是直接从0x1C运行的,则也可将FIQ处理程序包含在其中(见下面示例)。 示例展示了如果它们位于ROM的零地址时建立向量的代码。可替换装入的跳转语句。 Vector_Init_Block LDR PC,Reset_Addr LDR PC,Undefined_Addr LDR PC,SWI_Addr LDR PC,Prefetch_Addr LDR PC,Abort_Addr NOP ;Reserved vector LDR PC,IRQ_Addr LDR PC,FIQ_Addr Reset_Addr DCD Start_Boot Undefined_Addr DCD Undefined_Handler SWI_Addr DCD SWI_Handler Prefetch_Addr DCD Prefetch_Handler Abort_A
文档评论(0)