Rabbit 32Bit RTOS源代码

源代码在线查看: irq.s

软件大小: 120 K
上传用户: yxm_325
关键词: Rabbit RTOS Bit 32
下载地址: 免注册下载 普通下载 VIP

相关代码

				;*********************************************************************
				;*                  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			

相关资源