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

📄 swi_artx.s

📁 Keil开发环境下ARM7内核单片机的ARTX RTOS内核源代码
💻 S
字号:
/*----------------------------------------------------------------------------
 *      A R T X  -  K e r n e l
 *----------------------------------------------------------------------------
 *      Name:    SWI_ARTX.S
 *      Purpose: Pre-defined vectored interrupt handler SWI interrupt
 *      Rev.:    V2.00 / 19-oct-2005
 *----------------------------------------------------------------------------
 *      This code is part of the ARTX-ARM kernel package of Keil Software.
 *      Copyright (c) 2004-2005 Keil Software. All rights reserved. 
 *---------------------------------------------------------------------------*/

AREA ?C?SWI, CODE, READONLY, ALIGN=2

/* Offsets from the 'struct OS_TCB' */
TCB_FCTX        SET     33
TCB_TSTACK      SET     36

EXTERN DATA (os_runtask)

PUBLIC SWI_Handler?A, ?SWI?Table, ?SWI?Empty

/*-------------------------- SWI handler -----------------------------------*/
/* SWI-0 is reserved for context task switch. 'os_switch_tasks()' prolog    */
/* and epilog are implemented here in this module.                          */

SWI_Handler?A    PROC CODE32
        MRS     R8,SPSR
        TST     R8,#0x20           ; SWI call from 
        LDRNEH  R8,[LR,#-2]        ; Thumb: Load halfword instruction
        ANDNE   R8,R8,#0xFF        ;        extract SWI number
        LDREQ   R8,[LR,#-4]        ; ARM:   Load word     instruction
        BICEQ   R8,R8,#0xFF000000  ;        extract SWI number
                                   ; R8 now contains SWI number

        CMP     R8,#0              ; os_switch_tasks?
        BNE     User_swi

        /*------------------- os_switch_tasks ------------------------*/

        STMDB   SP,{SP}^           ; Save reduced context
        LDMDB   SP,{R1}            ; User SP
        MRS     R12,SPSR           ; User CPSR
        STMDB   R1!,{R4-R7,R12,LR} ; push PC, CPSR, R7-R4
        LDR     R4,=os_runtask     ; os_runtask->tsk_stack
        LDR     R4,[R4,#0x0]
        STR     R1,[R4,#TCB_TSTACK]
        MOV     R4,R0              ; R4 = p_new

        ADR     R12,?SWI?Table+4
        LDR     R12,[R12,#0x0]     ; SWI function address
        MOV     LR,PC              ; Return address
        BX      R12                ; Call SWI function

        LDR     LR,[R4,#TCB_TSTACK]; p_new->tsk_stack
        LDRB    R0,[R4,#TCB_FCTX]  ; p_new->full_ctx
        CMP     R0,#0x0
        BNE     Full_ctx

        LDMIA   LR!,{R4-R8,R12}    ; Restore Reduced context
        MSR     SPSR_cxsf,R8
        STMDB   SP,{LR}            ; Set User SP
        LDMDB   SP,{SP}^
        MOVS    PC,R12             ; RETI

Full_ctx:
        ADD     R0,LR,#64
        LDMDB   R0,{R1-R3}         ; LR, CPSR (R3=dummy)
        MSR     SPSR_cxsf,R2       ; Set User CPSR
        STMDB   SP,{R0-R1}
        LDMDB   SP,{SP,LR}^        ; Set User SP,LR
        NOP                        ; required for generic ARM7TDMI support
        LDMIA   LR,{R0-R12}        ; Restore R12-R0
        LDR     LR,[LR,#60]        ; PC
        MOVS    PC,LR              ; RETI

        /*------------------- User SWI -------------------------------*/

User_swi:
        ADR     R12,?SWI?Table
        LDR     R12,[R12]          ; load last SWI-Function-number

        CMP     R8,R12                                             
        BGT     ?SWI?Empty         ; overflow
        ADR     R12,?SWI?Table+4
        LDR     R12,[R12,R8,LSL #2]; SWI function address
        STMFD   SP!,{LR}           ; Store LR register
        MOV     LR,PC              ; Return address
        BX      R12                ; Call SWI function

        LDMFD   SP!,{PC}^          ; Return

?SWI?Empty:
        B       $                  ; no existing SWI

; *** DO NOT MODIFY THIS PORTION OF THE FILE ***
?SWI?Table:                        ; Marker for LA Linker
; 
; The LA Linker inserts at this label
;       DD      0                  ; <last SWI function number>
;       DD      ?SWI?Empty         ; <entry for SWI function 0>
;       DD      <SWI entry 1>
;       DD      <SWI entry 2>
;       DD           :
; For non-existing SWI functions DD ?SWI?Empty is inserted

        ENDP

        END

/*----------------------------------------------------------------------------
 * end of file
 *---------------------------------------------------------------------------*/

⌨️ 快捷键说明

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