📄 swi_artx.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 + -