;*********************************************************************
;* Copyright (c) 2011-2012,李士伟
;* All rights reserved.
;*文 件 名:irq.s
;*描 述:irq中断处理汇编代码
;* IRQ_HANDLER 该宏用于声明符合ATPCS规则的ISR_Func例程
;*当前版本:V1.00
;*作 者:李士伟
;*创建日期:2011.09.26
;*********************************************************************
; 汇编代码使用到的与处理器相关的宏定义
GET arch\lpc2103\asm_cpu.inc
;引入的外部 函数标号
IMPORT __OS_IntCtxSw ; 中断级任务切换函数
IMPORT OS_IntExit ; 通知系统退出中断函数
;引入的外部 常数标号
IMPORT __SYS_Stack_Bottom
;引入的外部 变量标号
IMPORT OSTCBCur
IMPORT OSTCBHighRdy
IMPORT OSIntNesting ;中断嵌套计数器
IMPORT OSEnterSum
CODE32
PRESERVE8
AREA IRQ,CODE,READONLY
;*************************************************************
;* 可嵌套IRQ中断宏,使用该宏的ISR_Func必须符合ATPCS规则
;*************************************************************
MACRO
$IRQ_Label IRQ_HANDLER $ISR_Func
EXPORT $IRQ_Label
IMPORT $ISR_Func
$IRQ_Label
SUB LR, LR, #4
STMFD SP!, {R0-R3, R12, LR}
LDR R0, =OSIntNesting
LDR R1, [R0]
; 若中断嵌套层数大于等于3,不响应中断
CMP R1, #3
LDMGEFD SP!,{R0-R3, R12, PC}^
; OSIntNesting++
ADD R1, R1, #1
STR R1, [R0]
MRS R3, SPSR
STMFD SP, {R3, SP, LR}^ ; 保存断点处CPSR_usr,SP_usr,LR_usr
SUB SP, SP, #3*4
;使能中断嵌套前,保存系统模式的SP,LR
MSR CPSR_c, #(I_Bit | SYS32_MODE); 切换到系统模式,关中断禁止中断嵌套
CMP R1, #1
LDREQ SP, =__SYS_Stack_Bottom ; 保证ISR使用系统栈
; 进入中断服务程序,并使能中断嵌套
MSR CPSR_c, #SYS32_MODE ; 开中断,使能中断嵌套
BL $ISR_Func ; 调用C语言中断服务程序
MSR CPSR_c, #(I_Bit | SYS32_MODE); 禁中断,关闭中断嵌套
; OSEnterSum++; 防止OS_IntExit退出临界段时开中断
LDR R2, =OSEnterSum
LDR R1, [R2]
ADD R1, R1, #1
STR R1, [R2]
BL OS_IntExit ; 第一层中断系统会更新OSTCBHighRdy
; 指向优先级最高的就绪任务TCB
; OSEnterSum--;
LDR R2, =OSEnterSum
LDR R1, [R2]
SUB R1, R1, #1
STR R1, [R2]
MSR CPSR_c, #(I_Bit | IRQ32_MODE) ; 切回IRQ模式,并禁止中断
LDMFD SP, {R3, SP, LR}^
ADD SP, SP, #3*4
MSR SPSR_cxsf, R3
; 检查是否有新的高优先级任务
LDR R0, =OSTCBHighRdy
LDR R0, [R0]
LDR R1, =OSTCBCur
LDR R1, [R1]
CMP R0, R1
LDMEQFD SP!, {R0-R3, R12, PC}^ ; 不进行任务切换
LDR PC, =__OS_IntCtxSw ; 进行任务切换
MEND
;*************************************************************
;* 声明符合ATPCS规则的中断服务例程
;*************************************************************
IRQ_Default IRQ_HANDLER ISR_Default
Timer0_Handler IRQ_HANDLER Timer0_ISR
UART0_Handler IRQ_HANDLER UART0_ISR
;RTC_Handler IRQ_HANDLER RTC_ISR
I2C0_Handler IRQ_HANDLER I2C0_ISR
END