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

📄 irq.inc

📁 一个小型的实时操作系统 对理解操作系统有很好的帮助
💻 INC
字号:
;/*********************************************************************************************************
;**                                        Small RTOS
;**                                   The Real-Time Kernel
;**                           (c) Copyright 2004-2004, chenmingji
;**                                     All Rights Reserved
;**--------------文件信息--------------------------------------------------------------------------------
;**文   件   名: irq.inc
;**创   建   人: 陈明计
;**最后修改日期: 2005年6月10日
;**描        述: Small RTOS V1.50在ARM7上的IRQ接口部分,用ADS1.2编译
;**
;**--------------历史版本信息----------------------------------------------------------------------------
;** 创建人: 陈明计
;** 版  本: V1.0
;** 日 期:  2005年6月10日
;** 描 述: 原始版
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 
;** 版  本: 
;** 日 期: 
;** 描 述: 
;**
;**--------------当前版本修订------------------------------------------------------------------------------
;** 修改人: 
;** 日 期:
;** 描 述:
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/

NoInt       EQU 0x80

USR32Mode   EQU 0x10
SVC32Mode   EQU 0x13
SYS32Mode   EQU 0x1f
IRQ32Mode   EQU 0x12
FIQ32Mode   EQU 0x11

;引入的外部标号在这声明
        IMPORT  __OSIntCtxSw                    ;中断中任务切换函数
        IMPORT  OSIntNesting                    ;中断嵌套计数器
;        IMPORT  OsEnterSum                      ;禁止中断嵌套计数器
        IMPORT  OSIntExit                       ;中断退出处理程序


    MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function

        EXPORT  $IRQ_Label                      ; 输出的标号
        IMPORT  $IRQ_Exception_Function         ; 引用的外部标号

$IRQ_Label
        SUB     LR, LR, #4                      ; 计算返回地址
        STMFD   SP!, {R0-R3, R12, LR}           ; 保存任务环境
        MRS     R3, SPSR                        ; 保存状态
        STMFD   SP, {R3, SP, LR}^               ; 保存用户状态的R3,SP,LR,注意不能回写
                                                ; 如果回写的是用户的SP,所以后面要调整SP
        LDR     R2,  =OSIntNesting              ; OSIntNesting++
        LDRB    R1, [R2]
        ADD     R1, R1, #1
        STRB    R1, [R2]

        SUB     SP, SP, #4*3

        MSR     CPSR_c, #(NoInt | SYS32Mode)    ; 切换到系统模式
        CMP     R1, #1
        LDREQ   SP, =StackIrq1
        
        BL      $IRQ_Exception_Function         ; 调用c语言的中断处理程序
        BL      OSIntExit                       ; 调用中断退出处理程序

        MSR     CPSR_c, #(NoInt | IRQ32Mode)    ; 切换回irq模式
        LDMFD   SP, {R3, SP, LR}^               ; 恢复用户状态的R3,SP,LR,注意不能回写
                                                ; 如果回写的是用户的SP,所以后面要调整SP
        CMP     R0, #0

        ADD     SP, SP, #4*3                    ; 
        MSR     SPSR_cxsf, R3

;        LDR     R3,  =OsEnterSum                ; OsEnterSum = 0
;        MOV     R0, #0
;        STRB    R0, [R3]

        LDMEQFD SP!, {R0-R3, R12, PC}^          ; 不进行任务切换
        LDR     PC, =__OSIntCtxSw               ; 进行任务切换
    MEND

;/*********************************************************************************************************/
    AREA    IRQ_Stack,DATA, NOINIT, ALIGN=2
StackIrq1
    
    END
;/*********************************************************************************************************
;**                            End Of File
;********************************************************************************************************/

⌨️ 快捷键说明

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