[飞凌]S3C2440中断处理流程

2010年07月13日 14:50    发布者:yanhong
本文转引自 飞凌嵌入式 S3C2440 技术讨论区 www.witech.com.cn
粗略写了一下S3C2440的中断处理流程(以飞凌2440开发板所用bootloader代码为例),给初学者看的,希望大家多多讨论,不断改进,使其最终成为一份完善的教程!
首先定义向量表堆栈  bootloader中取0x33ffff00
        ^   _ISR_STARTADDRESS                ; _ISR_STARTADDRESS=0x33FF_FF00
HandleReset                 #   4
HandleUndef                 #   4
HandleSWI                   #   4
HandlePabort                #   4
HandleDabort                #   4
HandleReserved              #   4
HandleIRQ                   #   4
HandleFIQ                   #   4
IRQ堆栈地址为0x33ffff18,这里放中断处理函数的入口地址。
ldr        r0,=HandleIRQ       ;This routine is needed
ldr        r1,=IsrIRQ          ;IsrIRQ就是中断处理函数的入口地址
str        r1,
中断发生后程序自动从该处取值并跳转
b        HandlerIRQ        ;handler for IRQ interrupt
HandlerIRQ      HANDLER HandleIRQ
这里跳转到了IsrIRQ
IsrIRQ
        sub        sp,sp,#4       ;sp-4,预留给pc。
        stmfd        sp!,{r8-r9}        ;保护r8 r9  一会儿要用。这里没有保持r14。
        ldr        r9,=INTOFFSET        
        ldr        r9,                ;获得中断号
        ldr        r8,=HandleEINT0        ;
        add        r8,r8,r9,lsl #2        ;通过中断偏移值计算中断源
        ldr        r8,                ;取出相应中断处理函数的入口地址值
        str        r8,        ;将其存在sp+8处,即刚才预留给pc的堆栈
        ldmfd        sp!,{r8-r9,pc}        ;还原r8 r9并跳转到中断处理函数
中断函数处理完后会从r14取值返回

网友评论

yanhong 2010年07月28日
飞凌嵌入式 S3C2440 技术讨论区 www.witech.com.cn