⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irq.s

📁 Rabbit 32Bit RTOS源代码
💻 S
字号:
;*********************************************************************
;*                  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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -