加入收藏 | 设为首页 | 会员中心 | 我要投稿 | RSSRSS-巴斯仪表网
您当前的位置:首页 > 电子发烧 > 单片机学习

S3C2410 中断程序的实现

时间:2013-09-02  来源:123485.com  作者:9stone
    S3C2410(IRQ)中断处理过程:
 
    在此要注意的是区别中断向量表和异常向量表。中断发生后总是从IRQ 或者FIQ 异常入口处进入,然后跳转到相应的异常处理程序处执行,这个异常处理程序一般都是进行查找中断向量表的操作,然后调用中断处理程序。
    以下是在应用中中断处理实现的过程:从中不难体会到中断的处理过程。
定义中断向量表的物理地址:
代码
  1. .equ pISR_DABORT , (_ISR_STARTADDRESS+0x10)   
  2. .equ pISR_RESERVED, (_ISR_STARTADDRESS+0x14)   
  3. .equ pISR_IRQ , (_ISR_STARTADDRESS+0x18)   
  4. .equ pISR_FIQ , (_ISR_STARTADDRESS+0x1c) //异常向量表   
  5. ……………………………………………………………………   
  6. .equ pISR_EINT0 , (_ISR_STARTADDRESS+0x20) //中断向量表   
  7. .equ pISR_EINT1 , (_ISR_STARTADDRESS+0x24)   
  8. .equ pISR_EINT2 , (_ISR_STARTADDRESS+0x28)   
  9. .equ pISR_EINT3 , (_ISR_STARTADDRESS+0x2c)  
将中断处理程序入口地址放入中断向量表:
代码
  1. pISR_EINT0 = (unsigned int)isrEINT0; // isrEINT0 中断处理程序   
  2. pISR_EINT1 = (unsigned int)isrEINT1;  
定义中断处理程序:
代码
  1. .extern Interrupt_Rbutton   
  2. .global isrEINT0   
  3. isrEINT0:   
  4. IRQHandle Interrupt_Rbutton  
定义异常向量表:
代码
  1. b HandlerUndef /* handler for Undefined mode */  
  2. b HandlerSWI /* handler for SWI interrupt */  
  3. b HandlerPabort /* handler for PAbort */  
  4. b HandlerDabort /* handler for DAbort */  
  5. .long FileIDTable /* id */  
  6. b HandlerIRQ /* handler for IRQ interrupt */  
  7. b HandlerFIQ  
定义异常处理函数:
代码
  1. HandlerFIQ: HANDLER HandleFIQ   
  2. HandlerIRQ: HANDLER HandleIRQ   
  3. HandlerUndef: HANDLER HandleUndef   
  4. HandlerSWI: HANDLER HandleSWI   
  5. HandlerDabort: HANDLER HandleDabort   
  6. HandlerPabort: HANDLER HandlePabort  
异常处理宏HANDLER的定义:
代码
  1. .macro HANDLER HandleLabel   
  2. sub sp,sp,#4 /* decrement sp(to store jump address) */  
  3. stmfd sp!,{r0} /* PUSH the work register to stack(lr does't push bec  
  4. ause it return to original address) */  
  5. ldr r0,=HandleLabel /* load the address of HandleXXX to r0 */  
  6. ldr r0,[r0] /* load the contents(service routine start address) of  
  7. HandleXXX */  
  8. str r0,[sp,#4] /* store the contents(ISR) of HandleXXX to stack */  
  9. ldmfd sp!,{r0,pc} /* POP the work register and pc(jump to ISR) */  
  10. .endm  
定义IRQ 中断处理宏IRQHandle:
代码
  1. .macro IRQHandle isrHandle:   
  2. stmdb sp!, {r0-r11, ip, lr} /* save r0-r11, ip, lr */  
  3. ldr r0, =isrHandle   
  4. mov lr, pc   
  5. bx r0 /* jump to user_handle(void) */  
  6. ldmia sp!, {r0-r11, ip, lr} /* restore r0, ip, lr */  
  7. subs pc, r14, #4 /* return from interrupt */  
  8. .endm  
申明IRQ 异常的服务程序为:IsrIRQ,即,发生IRQ 异常时,执行“b HandlerIRQ”即是
运行IsrIRQ代码:
代码
  1. ldr r0,=HandleIRQ @ This routine is needed   
  2. ldr r1,=IsrIRQ @ if there isn't 'subs pc,lr,#4' at 0x18, 0x1c   
  3. str r1,[r0]  
IRQ 异常处理程序:
代码
  1. IsrIRQ:   
  2. sub sp,sp,#4 @ reserved for PC   
  3. stmfd sp!,{r8-r9}   
  4. ldr r9,=INTOFFSET   
  5. ldr r9,[r9]   
  6. ldr r8,=HandleEINT0   
  7. add r8,r8,r9,lsl #2   
  8. ldr r8,[r8]   
  9. str r8,[sp,#8]   
  10. ldmfd sp!,{r8-r9,pc}  
    由上可以知道,当一个IRQ 中断发生时,CPU将从0X18(IRQ 异常入口地址)取指执行,在这一步PC 的跳转是有硬件实现的。在入口0x18 地址处放的是一条跳转指令,这条指令将跳到IRQ 异常处理程序运行,IRQ 异常处理程序主要是根据中断源查找中断向量表。获得中断入口地址后,接着CPU 跳转中断处理程序运行。
    在嵌入式系统中异常向量表和中断向量表都是存于FLASH起始的一段空间中。而异常处理和中断处理程序都是运行在RAM中的。
分享到:
来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
栏目导航->单片机学习
  • 电子应用基础
  • 电源技术
  • 无线传输技术
  • 信号处理
  • PCB设计
  • EDA技术
  • 单片机学习
  • 电子工具设备
  • 技术文章
  • 精彩拆解欣赏
  • 推荐资讯
    使用普通运放的仪表放大器
    使用普通运放的仪表放
    3V与5V混合系统中逻辑器接口问题
    3V与5V混合系统中逻辑
    数字PID控制及其改进算法的应用
    数字PID控制及其改进
    恶劣环境下的高性价比AD信号处理数据采集系统
    恶劣环境下的高性价比
    栏目更新
    栏目热门