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

📄 irq.inc

📁 SmartARM2400系列开发板全套资料
💻 INC
字号:
;/***************************************Copyright (c)****************************************************
;**                            Guangzhou ZHIYUAN electronics Co.,LTD.
;**                                      
;**                                 http://www.embedtools.com
;**
;**-------------File Info---------------------------------------------------------------------------------
;** File name:               IRQ.inc
;** Latest modified Date:    2007-11-20
;** Latest Version:          1.0
;** Descriptions:            定义uC/OS-II中IRQ汇编接口代码宏
;**
;**-------------------------------------------------------------------------------------------------------
;** Created by:              Chenmingji
;** Created date:            2007-11-20
;** Version:                 1.0
;** Descriptions:            The original version
;**
;**-------------------------------------------------------------------------------------------------------
;** Modified by:             
;** Modified date:           
;** Version:                 
;** Descriptions:            
;**
;********************************************************************************************************/

;/********************************************************************************************************
; 宏定义
;********************************************************************************************************/
OSNoInt       EQU 0x80
OSSYS32Mode   EQU 0x1f
OSIRQ32Mode   EQU 0x12

;/********************************************************************************************************
; 引入的外部标号在这声明
;********************************************************************************************************/
        IMPORT  OSIntCtxSw                                              ;   任务切换函数
        IMPORT  OSIntExit                                               ;   中断退出函数
        IMPORT  OSTCBCur
        IMPORT  OSTCBHighRdy
        IMPORT  OSIntNesting                                            ;   中断嵌套计数器
        IMPORT  GulOsEnterSum

    MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function
        EXPORT  $IRQ_Label                                              ;   输出的标号
$IRQ_Label
        SUB     LR, LR, #4                                              ;   计算返回地址
        STMFD   SP!, {R0-R3, R12, LR}                                   ;   保存任务环境
        MRS     R3, SPSR                                                ;   保存状态
        STMFD   SP, {R3, SP, LR}^                                       ;   保存用户状态的R3,SP,LR,
                                                                        ;   注意不能回写
                                                                        ;   如果回写,结果未知
        LDR     R2, =GulOsEnterSum
        MOV     R1, #1
        STR     R1, [R2]

        LDR     R2,  =OSIntNesting                                      ;   OSIntNesting++
        LDRB    R1, [R2]
        CMP     R1, #0xff
        ADDLO   R1, R1, #1
        STRLOB  R1, [R2]
        SUB     SP, SP, #4*3
        MSR     CPSR_c, #(OSNoInt | OSSYS32Mode)                        ;   切换到系统模式
        CMP     R1, #1
        LDREQ   SP, =StackUsr
        ISR     $IRQ_Exception_Function                                 ;   实际的IRQ处理程序
        MSR     CPSR_c, #(OSNoInt | OSSYS32Mode)                        ;   切换到系统模式
        LDR     R2, =GulOsEnterSum                                      ;   GulOsEnterSum,使OSIntExit退出时
                                                                        ;   中断关闭

        MOV     R1, #1
        STR     R1, [R2]
        BL		OSIntExit 
        LDR     R2, =GulOsEnterSum                                      ;   因为中断服务程序要退出,
                                                                        ;   所以GulOsEnterSum=0

        MOV     R1, #0
        STR     R1, [R2]

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

        LDR     R0, =OSTCBHighRdy
        LDR     R0, [R0]
        LDR     R1, =OSTCBCur
        LDR     R1, [R1]
        CMP     R0, R1
        ADD     SP, SP, #4*3
        MSR     SPSR_cxsf, R3
        LDMEQFD SP!, {R0-R3, R12, PC}^                                  ;   不进行任务切换
        LDR     PC, =OSIntCtxSw                                         ;   进行任务切换
    MEND

    END
;/********************************************************************************************************
; END FILE
;********************************************************************************************************/

⌨️ 快捷键说明

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