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

📄 vmcisrst.s

📁 VRTX操作系统
💻 S
字号:
****************************************************************************
*
* Copyright (c) 1997 MICROTEC RESEARCH INCORPORATED.
*
* All rights reserved. MICROTEC RESEARCH's source code is an unpublished
* work and the use of a copyright notice does not imply otherwise.
* This source code contains confidential, trade secret material of
* MICROTEC RESEARCH. Any attempt or participation in deciphering,
* decoding, reverse engineering or in any way altering the source code
* is strictly prohibited, unless the prior written consent of
* MICROTEC RESEARCH is obtained.
*
****************************************************************************


; Revisions of VMCISRST.S: 
; 1.0  P.Cumming  14/07/96  Initial version for PID7T demon

;
;	Generate Stubs for armsd development environment.
;

 IF :DEF:THUMB
	AREA    |C$$code|, CODE, INTERWORK, READONLY 
 ELSE
        AREA    |C$$code|, CODE, READONLY 
 ENDIF

      
EVN_0		EQU	0
EVN_1		EQU	0
EVN_2		EQU	0
EVN_3		EQU	4
EVN_4		EQU	8
EVN_5		EQU	0
EVN_6		EQU	4
EVN_7		EQU	4

;	use ui_enter_i & ui_exit_i for IRQ interrupts with sw stack check on
 IF :DEF:swst:LAND::DEF:IRQ = {TRUE}	;swst & IRQ only 
	IMPORT ui_enter_i
	IMPORT ui_exit_i
 ELSE
	IMPORT ui_enter
	IMPORT ui_exit
 ENDIF

	IMPORT vmc_stack
	
 IF :DEF:swst = {TRUE}	;only required if sw stack checking enabled
	IMPORT StackSlop
vmc_interrupt_stack_limit	DCD	vmc_stack + StackSlop
 ENDIF

vmc_interrupt_stack_addr	DCD	vmc_stack
vmc_interrupt_stacksize		DCD	vmc_istksize



;
;	Stub for VRTXmc timer interrupt
;
 	EXPORT	vmc_interrupt_stub


vmc_interrupt_stub
	sub	lr, lr, #EVN_7	;adjusted return addr

 IF :DEF:swst:LAND::DEF:IRQ = {TRUE}	;swst & IRQ only 
	stmfd	sp!, {r0-r3, sl, ip, lr}	;save scratch registers
	ldr	sl,vmc_interrupt_stack_limit	;get stack limit 
 ELSE				;no need to reload sl
	stmfd	sp!, {r0-r3, ip, lr};save scratch registers
 ENDIF

	mrs	lr, spsr		;get interrupted task status
	stmfd	sp!, {lr}		;save interrupted task status
	
 IF :DEF:swst:LAND::DEF:IRQ = {TRUE}
	bl	ui_enter_i		;call interrupt enter for swst IRQ
 ELSE
	bl	ui_enter		;call interrupt enter
 ENDIF

	adr	r1, vmc_interrupt_addr
	ldr	r0, [r1, #4]		;set interrupt handler argument
	ldr	lr, ui_exit_addr	;return address = ui_exit routine
 IF :DEF:THUMB
	ldr 	r1,[r1]	 		;get address of intrpt service routine
	bx 	r1			;call interrupt service routine
 ELSE
	ldr	pc, [r1]		;call interrupt service routine
 ENDIF


	IMPORT	InterruptHandler
	
vmc_interrupt_addr	DCD	InterruptHandler;timer interrupt handler
			DCD	0		;handler parameter

	
 IF :DEF:swst:LAND::DEF:IRQ = {TRUE}
ui_exit_addr	DCD	ui_exit_i	;ui_exit routine address save buffer
 ELSE
ui_exit_addr	DCD	ui_exit		;ui_exit routine address save buffer
 ENDIF



;
;	extern void InstallExceptionHandler(int  vector, 
;					    void (*handler)(void), 
;					    char *stack);
;

InstallExceptionHandler
;	Exception Handler Stack Initialization
	bics	a3, a3, #3		;stack word alignment
	moveq	pc, lr			;if stack size == 0, return
	adr	a4, ModeCPSRValue	;get CPSR value table base address
	ldr	a4, [a4, a1, LSL #2]	;get CPSR value of the mode
	mrs	a2, cpsr		;save CPSR
	msr	cpsr, a4		;change the mode
	mov	sp, a3			;change the stack

 IF :DEF:swst:LAND::DEF:FIQ = {TRUE} 
	ldr	sl, vmc_interrupt_stack_limit ;load stack limit in r10 (FIQ only)
 ENDIF

	msr	cpsr, a2		;change original mode
	mov	pc, lr

UserMode	EQU     &10		;User32 mode
FIQMode		EQU     &11		;FIQ32 mode
IRQMode		EQU     &12		;IRQ32 mode
SVCMode		EQU     &13		;Supervisor32 mode
AbortMode	EQU     &17		;Abort32 mode
UndefMode	EQU     &1b		;Undefined32 mode
NoInt		EQU     &c0		;IRQ & FIQ interrupt disbale

ModeCPSRValue	DCD	SVCMode+NoInt	;Reset
		DCD	UndefMode+NoInt	;Undefined Instruction
		DCD	SVCMode+NoInt	;Software Interrupt
		DCD	AbortMode+NoInt	;Abort - Prefetch
		DCD	AbortMode+NoInt	;Abort - Data
		DCD	SVCMode+NoInt	;Reserved
		DCD	IRQMode+NoInt	;IRQ interrupt
		DCD	FIQMode+NoInt	;FIQ interrupt

;
;	extern void vmc_InitializeExceptionHandlers(void);
;
	EXPORT	vmc_InitializeExceptionHandlers
	IMPORT  vmc_istksize

vmc_InitializeExceptionHandlers
	stmfd	sp!, {lr}		;save return address
;
;	Initialize interrupt
;
 IF :DEF:FIQ = {TRUE}
	mov	a1, #7			;set interrupt vector number FIQ
 ELSE				;default to IRQ
	mov	a1, #6			;set interrupt vector number IRQ
 ENDIF

	adr	a2, vmc_interrupt_stub	;set interrupt handler address
	ldr	a3, vmc_interrupt_stack_addr	;set interrupt stack address
	ldr	a4, vmc_interrupt_stacksize	;load stack size address
	ldr	a4,[a4]			;get stacksize
	add	a3,a4,a3		;calculate interrupt stackpointer

	bl	InstallExceptionHandler	;call install handler

 IF :DEF:THUMB
	ldmfd	sp!, {lr}		;
	bx	lr			;return
 ELSE
	ldmfd	sp!, {pc}		;return
 ENDIF




	END

⌨️ 快捷键说明

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