www.pudn.com > uCOS+GUI.rar > IRQ.S


;/* 
;********************************************************************************************************* 
;* 文件: IRQ.S 
;* 描述: IRQ 中断入口函数, 具体 IRQ 中断服务功能函数在相应服务函数中实现(参考 OSTickISR 函数). 
;        采用了一个宏做为向量服务程序的入口, 所以必须将入口值设置为 ISR 的具体地址值. 
;        未用的向量中断均指向 RStartup 处(即软复位). 
;* 编写: 深思 (001-12345@sohu.com). 
;********************************************************************************************************* 
;*/ 
        IMPORT  OSTCBCur                            ; 指向当前任务TCB的指针 
        IMPORT  OSTCBHighRdy                        ; 指向将要运行的任务TCB的指针 
        IMPORT  __OSIntCtxSw                        ; 中断级任务切换函数. 
        IMPORT  OsEnterSum 
 
        AREA    IRQMACRO,CODE,READONLY 
        CODE32 
 
        MACRO 
$HandlerT   HANDLER   $ISR_Function 
        IMPORT  $ISR_Function 
        EXPORT  $HandlerT 
$HandlerT 
        SUB     LR,     LR, #4                      ; 计算返回地址. 
        STMFD   SP!,    {R0-R12, LR} 
 
        LDR     R0,     =OsEnterSum 
        LDR     R1,     =0x01                       ; 避免中断嵌套. 
        STR     R1,     [R0] 
 
        LDR     LR,     =IRQ_Return+4               ; 因为 ISR 采用了 __irq 关键字. 
 
        MRS     R0,     SPSR 
        STMFD   SP!,    {R0}                        ; 保存 SPSR. 
        MRS     R0,     CPSR 
        MSR     SPSR_cxsf,  R0 
 
        LDR     PC,     =$ISR_Function              ; IRQ 中断矢量跳转至服务程序. 
        MEND 
 
;// ************************************************ 
IRQ_Return 
        LDMFD   SP!,    {R0} 
        MSR     SPSR_cxsf,  R0                      ; 恢复 SPSR. 
 
        LDR     R0,     =OsEnterSum 
        LDR     R1,     =0x00 
        STR     R1,     [R0] 
 
        LDR     R0,     =OSTCBHighRdy               ; 判断是否需要切换任务. 
        LDR     R0,     [R0] 
        LDR     R1,     =OSTCBCur 
        LDR     R1,     [R1] 
        CMP     R0,     R1 
        LDMEQFD SP!,    {R0-R12, PC}^               ; 不进行任务切换. 
 
        LDMFD   SP!,    {R0-R12, LR} 
        LDR     PC,     =__OSIntCtxSw               ; 进行中断级任务切换. 
 
;// ******************************************************************************************************** 
HandlerIRQ      HANDLER     ISR_IRQ                 ; 非向量中断. 
HandlerEINT0    HANDLER     IRQ_Error 
HandlerEINT1    HANDLER     IRQ_Error 
HandlerEINT2    HANDLER     IRQ_Error 
HandlerEINT3    HANDLER     IRQ_Error 
HandlerEINT4567 HANDLER     IRQ_Error 
HandlerTICK     HANDLER     IRQ_Error 
HandlerZDMA0    HANDLER     IRQ_Error 
HandlerZDMA1    HANDLER     IRQ_Error 
HandlerBDMA0    HANDLER     IRQ_Error 
HandlerBDMA1    HANDLER     IRQ_Error 
HandlerWDT      HANDLER     IRQ_Error 
HandlerUERR01   HANDLER     IRQ_Error 
HandlerTIMER0   HANDLER     IRQ_Error 
HandlerTIMER1   HANDLER     IRQ_Error 
HandlerTIMER2   HANDLER     IRQ_Error 
HandlerTIMER3   HANDLER     IRQ_Error 
HandlerTIMER4   HANDLER     IRQ_Error 
HandlerTIMER5   HANDLER     ISR_Timer5              ; 作为系统节拍发生器使用. 
HandlerURXD0    HANDLER     IRQ_Error 
HandlerURXD1    HANDLER     IRQ_Error 
HandlerIIC      HANDLER     IRQ_Error 
HandlerSIO      HANDLER     IRQ_Error 
HandlerUTXD0    HANDLER     ISR_UTXD0               ; UART0 接收/发送中断. 
HandlerUTXD1    HANDLER     IRQ_Error 
HandlerRTC      HANDLER     IRQ_Error 
HandlerADC      HANDLER     IRQ_Error 
 
;/* 
;********************************************************************************************************* 
        END 
;********************************************************************************************************* 
;*/