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

📄 irq.s

📁 44b0+s6b0724包括系统初始化
💻 S
字号:
;/*
;*********************************************************************************************************
;* 文件: IRQ.S
;* 描述: IRQ 中断入口函数, 具体 IRQ 中断服务功能函数在相应服务函数中实现(参考 OSTickISR 函数).
;        采用了一个宏做为向量服务程序的入口, 所以必须将入口值设置为 ISR 的具体地址值.
;        未用的向量中断均指向 RStartup 处(即软复位).
;* 编写: kaka (sn.kaka@yahoo.com).
;*********************************************************************************************************
;*/
        IMPORT  OSTCBCur                            ; 指向当前任务TCB的指针
        IMPORT  OSTCBHighRdy                        ; 指向将要运行的任务TCB的指针
        IMPORT  __OSIntCtxSw                        ; 中断级任务切换函数.
        IMPORT  OsEnterSum

        AREA    IRQMACRO,CODE,READONLY
        CODE32

        MACRO
$HandlerT   HANDLER   $ISR_Function
        IMPORT  $ISR_Function
        EXPORT  $HandlerT
$HandlerT
        SUB     LR,     LR, #4                      ; 计算返回地址.
        STMFD   SP!,    {R0-R12, LR}

        LDR     R0,     =OsEnterSum
        LDR     R1,     =0x01                       ; 避免中断嵌套.
        STR     R1,     [R0]

        LDR     LR,     =IRQ_Return+4               ; 因为 ISR 采用了 __irq 关键字.

        MRS     R0,     SPSR
        STMFD   SP!,    {R0}                        ; 保存 SPSR.
        MRS     R0,     CPSR
        MSR     SPSR_cxsf,  R0

        LDR     PC,     =$ISR_Function              ; IRQ 中断矢量跳转至服务程序.
        MEND

;// ************************************************
IRQ_Return
        LDMFD   SP!,    {R0}
        MSR     SPSR_cxsf,  R0                      ; 恢复 SPSR.

        LDR     R0,     =OsEnterSum
        LDR     R1,     =0x00
        STR     R1,     [R0]

        LDR     R0,     =OSTCBHighRdy               ; 判断是否需要切换任务.
        LDR     R0,     [R0]
        LDR     R1,     =OSTCBCur
        LDR     R1,     [R1]
        CMP     R0,     R1
        LDMEQFD SP!,    {R0-R12, PC}^               ; 不进行任务切换.

        LDMFD   SP!,    {R0-R12, LR}
        LDR     PC,     =__OSIntCtxSw               ; 进行中断级任务切换.

;// ********************************************************************************************************
HandlerIRQ      HANDLER     ISR_IRQ                 ; 非向量中断.
HandlerEINT0    HANDLER     IRQ_Error
HandlerEINT1    HANDLER     IRQ_Error
HandlerEINT2    HANDLER     IRQ_Error
HandlerEINT3    HANDLER     IRQ_Error
HandlerEINT4567 HANDLER     IRQ_Error
HandlerTICK     HANDLER     IRQ_Error
HandlerZDMA0    HANDLER     IRQ_Error
HandlerZDMA1    HANDLER     IRQ_Error
HandlerBDMA0    HANDLER     IRQ_Error
HandlerBDMA1    HANDLER     IRQ_Error
HandlerWDT      HANDLER     IRQ_Error
HandlerUERR01   HANDLER     IRQ_Error
HandlerTIMER0   HANDLER     IRQ_Error
HandlerTIMER1   HANDLER     IRQ_Error
HandlerTIMER2   HANDLER     IRQ_Error
HandlerTIMER3   HANDLER     IRQ_Error
HandlerTIMER4   HANDLER     IRQ_Error
HandlerTIMER5   HANDLER     ISR_Timer5              ; 作为系统节拍发生器使用.
HandlerURXD0    HANDLER     IRQ_Error
HandlerURXD1    HANDLER     IRQ_Error
HandlerIIC      HANDLER     IRQ_Error
HandlerSIO      HANDLER     IRQ_Error
HandlerUTXD0    HANDLER     ISR_UTXD0               ; UART0 接收/发送中断.
HandlerUTXD1    HANDLER     IRQ_Error
HandlerRTC      HANDLER     IRQ_Error
HandlerADC      HANDLER     IRQ_Error

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

⌨️ 快捷键说明

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