在ARM程序的开发过程中,对中断的处理是很普遍的、也是相当重要的。Realview MDK使用的RVCT编译器提供了__irq关键字,用此关键字修饰的函数被作为中断来函数编译,即在编译的过程中,编译器会自动添加中断处理过程中现场保护和恢复的代码,减小程序的开发难度,加快软件的开发过程。
在理解__irq关键字的作用之前,先看一下ARM核对异常的处理过程。当产生异常时, ARM核拷贝CPSR寄存器的内容SPSR_<mode>寄存器中,同时设置适当的CPSR 位、改变处理器状态进入ARM 态和处理器模式,从而进入相应的异常模式。在设置中断禁止位禁止相应中断(如果需要)后,ARM核保存返回地址到LR_<mode>,同时设置PC为相应的异常向量。当异常返回时, 异常处理需要从SPSR_<mode>寄存器中恢复CPSR的值,同时从LR_<mode>恢复PC,具体的异常返回指令如下:
Ø 从SWI和Undef异常返回时使用:
Ø 从FIQ、IRQ和预取终止返回时使用:
Ø 从数据异常返回时使用:
在使用上述指令异常返回时,如果LR之前被压栈的话使用LDM “∧”, 例如:
退出异常处理
SWI和未定义指令异常中断是由当前执行的指令自身产生的。当SWI和未定义指令异常中断产生时,程序计数器PC的值还未更新,它指向当前指令后面第2条指令(对于ARM指令来说+8字节;对于Thumb指令来说+4字节的位置)。当SWI和未定义指令异常中断产生时,处理器将值(PC-4)保存到异常模式下的寄存器LR_mode中。这时(PC-4)即指向当前指令的下一条指令地址。因此返回操作可以通过下面的指令来实现:MOV PC,LR
该指令将寄存器LR中的值复制到程序计数器PC中实现程序返回,同时将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。
在指令预取时,如果目标地址是非法的,该指令将被标记成有问题的指令。这时,流水线上该指令之前的指令继续执行。当执行到该被标记成有问题的指令时,处理器产生指令预取中止异常中断。
当发生指令预取中止异常中断时,程序要返回到该有问题的指令处,重新读取并执行该指令。因此指令预取中止异常中断程序应该返回到产生该指令预取中止异常中断的指令处,而不是返回到发生中断的指令的下一条指令。
指令预取中止异常中断是由当前执行的指令自身产生的,当指令预取中止异常中断产生时,程序计数器PC的值还未更新,它指向当前指令后面第2条指令(对于ARM指令来说,它指向当前指令地址加8个字节的w位置;对于Thumb指令来说,它指向当前指令地址加4个字节的位置)。当指令预取中止异常中断产生时,处理器将(PC-4)值保存到异常模式下的寄存器LR_mode中。这时(PC-4)即指向当前指令的下一条指令。因此返回操作可以通过下面的指令来实现:SUBS PC,LR,#4
该指令将寄存器LR中的值减4后,复制到程序计数器PC中,实现程序返回,同时将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。
发生数据访问异常中断时,程序要返回到该有问题的指令处,重新访问该数据,因此数据访问异常中断应该返回到产生该数据访问中止异常中断的指令处,而不是当前指令的下一条指令。
数据访问异常中断由当前执行的指令自身产生,当数据访问异常中断发生时,程序计数器pc的值已经更新,它指向当前指令后面第3条指令(对于ARM指令,它指向当前指令地址加12字节的位置;对于Thumb指令,它指向当前指令地址加6字节的位置)。此时处理器将值(pc-4)保存到lr_abt中,它指向当前指令后面第2条指令,所以返回操作可以通过下面指令实现:subs pc, lr, #8
该指令将lr中的值减8后传给程序计数器pc中,实现程序返回,同时将SPSR_abt寄存器内容复制到当前程序状态寄存器CPSR中;
通常处理器执行完当前指令后,查询IRQ中断引脚,并查看是否允许IRQ中断,如果某个中断引脚有效,并且系统允许该中断产生,处理器将产生IRQ异常中断,当IRQ异常中断产生时,程序计数器pc的值已经更新,它指向当前指令后面第3条指令(对于ARM指令,它指向当前指令地址加12字节的位置;对于Thumb指令,它指向当前指令地址加6字节的位置),当IRQ异常中断产生时,处理器将值(pc-4)保存到IRQ异常模式下的寄存器lr_irq中,它指向当前指令之后的第2条指令,因此返回操作可以通过下面指令实现:subs pc, lr, #4
与IRQ异常中断一样,处理器执行完当前指令后,查询FIQ中断引脚,并查看是否允许FIQ中断,如果中断引脚有效,并且系统允许该中断产生,处理器将产生FIQ异常中断,当FIQ异常中断产生时,程序计数器pc的值已经更新,它指向当前指令后面第3条指令(对于ARM指令,它指向当前指令地址加12字节的位置;对于Thumb指令,它指向当前指令地址加6字节的位置),当FIQ异常中断产生时,处理器将值(pc-4)保存到IRQ异常模式下的寄存器lr_fiq中,它指向当前指令之后的第2条指令,因此返回操作可以通过下面指令实现:subs pc, lr, #4
相关推荐
### Linux 2.6.26 内核中 ARM 中断实现详解 #### 一、中断注册方法 在 Linux 内核中,处理中断的核心函数是 `request_irq()`,该函数用于请求并注册一个硬件中断。`request_irq()` 的定义位于 `Kernel/irq/manage....
以下将详细介绍ARM中断、异常处理流程、AAPCS(ARM Procedure Call Standard)以及如何在没有第三方工具或特定编译器支持的情况下进行backtrace。 1. ARM中断和异常处理流程: 在ARM架构中,中断和异常是处理器响应...
本文档是一本关于ARM架构下Linux内核情景分析的补充手册,主要针对Linux内核在ARM处理器上的特殊性进行了讨论,特别是中断处理的不同部分。手册通过详细分析中断现场的保存和恢复、进程与线程的创建、uclinux内存...
软件开发方面,手册提供ABI(应用程序二进制接口)和AAPCS(ARM应用程序调用规范),这些规定了函数调用约定、参数传递、返回值处理以及堆栈管理规则。 最后,手册可能还包括调试信息格式和调试接口的描述,这对于...
3. **函数调用约定**:在ARM中,函数调用的参数传递和返回值的处理有特定的规则,理解这些规则对于在汇编中正确实现函数调用至关重要。例如,小的整数和浮点数通常在寄存器中传递,而大对象可能需要在内存中分配。 ...
实际项目中,ARM汇编常用于系统初始化、中断服务程序、硬件驱动开发等对效率要求极高的场景。了解如何将汇编语言与操作系统接口结合,能够提升系统运行效率和响应速度。 总之,ARM汇编语言是嵌入式开发的基础技能,...
ARM处理器通常有多个通用寄存器(如R0-R15),它们用于存储临时数据、函数参数和返回值。此外,还有程序计数器(PC)、链接寄存器(LR)和堆栈指针(SP)等特殊用途寄存器。 在编写汇编代码时,还需要了解如何进行...
2. **寄存器**: ARM处理器有多个通用寄存器,如R0到R15,其中R13作为堆栈指针,R14作为链接寄存器,R15作为程序计数器(PC)。理解这些寄存器的用途对于编写高效代码至关重要。 3. **寻址模式**: ARM汇编支持多种...
APCS定义了ARM架构下调用约定的标准,包括参数传递方式、返回值的处理、以及寄存器的使用规范等。遵循APCS有助于提高程序间的兼容性和可移植性。 #### 编写安全的32-bit代码的基本规则 编写高效的ARM程序需要注意...
- ATPCS是ARM架构的调用约定,规定了函数参数传递、返回值、堆栈使用等方面的标准,确保跨函数的兼容性。 6. **第7章 ARM程序和Thumb程序混合使用** - ARM处理器能在运行时切换ARM和Thumb模式,允许程序在性能和...
本文将深入探讨基于ARM11开发板的精简BootLoader设计,重点分析启动过程中的关键环节——中断向量表的作用及其设计方法。 #### 开发环境与背景 本研究基于三星公司的S3C6410开发板进行,该开发板采用ARM11微处理器...
覆盖了嵌入式系统的多个方面,包括但不限于任务管理、RISC架构特点、内存存储格式、中断管理与处理、I/O操作、嵌入式操作系统的特性、嵌入式系统与PC系统的区别、ARM指令集与寄存器以及缓存管理等内容,旨在帮助读者...
《申延超_嵌入式Linux应用开发完全手册笔记_常用 ARM 汇编指令及 ATPCS 规则》这份资料主要聚焦于嵌入式系统中的Linux应用开发,特别是涉及ARM架构下的汇编语言编程和ATPCS(ARM Thumb Procedure Call Standard)...
在嵌入式系统和ARM技术领域,Windows CE操作系统在处理异常和中断服务程序方面具有特定的机制。本文主要探讨了Windows CE中ARM架构下中断/异常向量的装入和执行方式,以及异常/中断服务程序的工作原理。 首先,中断...
根据ARM Thumb过程调用标准,R0-R3和R12被保留用于参数传递和返回值,因此在调用前后不需要特别保护。而R4-R11可以被调用者自由使用,如果调用者想要保持其值不变,就需要在调用前后进行保护。 #### 7. 超出操作...
三、ARM指令集的条件码和中断方式 * 条件码:15 种 * 后缀:S, B, H, ! * 中断方式:中断优先级、中断向量表 * ATPCS:寄存器使用规则、堆栈使用规则、函数参数传递规则 四、算法和程序设计 * 数组(块数据)处理...