### LPC2000系列中断嵌套设计及处理机制详解 #### 一、中断服务程序的编译器支持 LPC2000系列微控制器是基于ARM内核的高性能微控制器,其强大的中断处理能力使得它在工业控制、通信等领域得到广泛应用。ARM编译器提供了特殊的语法支持来帮助开发者更方便地编写中断服务程序(ISR),特别是针对Fast Interrupt Request (FIQ)和Interrupt Request (IRQ)类型的中断。 ##### 关键字的应用 在Keil ARM编译器环境下,开发者可以通过使用特定的关键字(如`__irq`)来标记中断服务程序。例如: ```c void IRQ_Handler__irq() { // 清除中断源 // 其他操作 // 更新VIC向量地址寄存器 } ``` 使用`__irq`关键字时,编译器会在函数前后自动添加必要的汇编指令以保护和恢复寄存器,例如: 1. **函数入口**:压栈保护工作寄存器(包括ATPCS敏感寄存器)。 2. **函数返回**:出栈恢复寄存器。 3. **返回指令**:使用`SUB SP!, R14, #4`恢复PC和CPSR。 需要注意的是,使用该关键字时SPSR_irq不会被保存,这导致了中断嵌套处理的一些问题。 #### 二、使用关键字处理中断嵌套的问题 在处理嵌套中断时,主要面临以下两个问题,均与LR_irq和SPSR_irq这两个寄存器有关: 1. **LR_irq的问题**:如果一个中断服务程序重新使能中断并调用一个子程序,在子程序执行过程中发生更高优先级的中断,则LR_irq中的返回地址会被破坏,导致原中断服务程序无法正确返回。 示例代码如下: ```c void IRQ_Handler__irq() { // 重新使能中断 foo(); // 返回地址A } ``` 当调用`foo()`时,LR_irq中原本存储的返回地址被覆盖,若此时发生更高优先级中断,则LR_irq将再次被覆盖,从而破坏原返回地址。 2. **SPSR_irq未保存**:使用编译器关键字时,SPSR_irq不会被保存,这对于需要保持IRQ模式状态信息的可重入中断服务程序来说是个问题。正确的做法是在进入系统模式前保存当前模式的状态信息。 #### 三、中断嵌套处理方法 为了解决上述问题,可以采用以下步骤来实现中断嵌套: 1. **保护寄存器**:保存ISR中将使用的寄存器和SPSR_irq。 2. **清除中断**:确保当前中断已被正确处理。 3. **切换至系统模式**:为了利用LR_sys寄存器,建议切换至系统模式。 4. **保存系统模式下的寄存器**:保存LR_sys和其他被调用函数不会保存的寄存器。 5. **调用C中断处理函数**:执行具体的中断处理逻辑。 6. **恢复系统模式的寄存器**:在C中断处理函数返回后恢复系统模式下的寄存器。 7. **恢复现场**:恢复工作寄存器和SPSR_irq。 8. **返回中断处理程序**:从IRQ中断处理程序中返回。 #### 四、LPC2000系列中断嵌套的具体实现 由于ARM的中断管理方式与传统的8051系列微控制器不同,因此需要手动编写代码来保护中断寄存器和现场,以及之后的恢复现场。ZLG提供的代码示例展示了如何进行现场保护: ```assembly NoInt EQU 0x80 USR32Mode EQU 0x10 SVC32Mode EQU 0x13 SYS32Mode EQU 0x1f IRQ32Mode EQU 0x12 FIQ32Mode EQU 0x11 CODE32 AREA IRQ, CODE, READONLY MACRO $IRQ_Label HANDLER $IRQ_Exception_Function EXPORT $IRQ_Label IMPORT $IRQ_Exception_Function $IRQ_Label SUB LR, LR, #4 ; 计算返回地址 STMFD SP!, {R0-R3, R12, LR} ; 保存任务环境 MRS R3, SPSR ; 保存状态 STMFD SP, {R3, LR}^ ; 保存SPSR和用户状态的SP NOP SUB SP, SP, #4*2 MSR CPSR_c, NoInt | SVC32Mode ... ``` 上述代码片段中,通过一系列汇编指令实现了对现场的保护,包括保存寄存器、状态寄存器等,为后续的中断嵌套处理打下了基础。在实际开发中,根据具体需求调整上述流程,即可实现高效的中断嵌套处理。 LPC2000系列微控制器的中断嵌套处理涉及多个方面,包括编译器支持、中断嵌套问题解决策略以及具体的实现细节。掌握这些内容对于开发高性能、高可靠性的嵌入式系统至关重要。
剩余6页未读,继续阅读
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助