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

📄 os_cpu_a.s

📁 ~{WwU_J9SC5D~}ucos~{T4Bk#,1`RkA4=S5wJT>y?IRT#,4x~}uart~{2bJT~}
💻 S
字号:
#;	Functions defined in this module:

.EQU	SwiV,			0x08
.EQU	IrqV,			0x18
.EQU	FiqV,			0x1C
.EQU	NoInt,			0x80

.EQU	OSEnterSWI,		0x00
.EQU	OS_EnterOS,		0xff


#; External symbols we need the addresses of
			.extern	OSTCBCur
			.extern	OSTCBHighRdy
			.extern	OSPrioCur
			.extern	OSPrioHighRdy
			.extern	OSTaskSwHook
			.extern	OSRunning


	.extern OSTaskSwHook
	.extern	OSTimeTick
	.extern OSIntEnter
	.extern OSIntExit


	.global OSTickISR
	.global	ARMDisableInt
	.global	ARMEnableInt
	.global	ARMIsDisableInt
	.global	OSStartHighRdy
	.global OS_TASK_SW
	.global OSIntCtxSw

.text

OSTickISR:
	MOV		ip, sp
	STMDB	sp!, {fp, ip, lr, pc}
	SUB		fp, ip, #4	

#	BL		OSIntEnter
	BL		OSTimeTick
#	BL		OSIntExit

	LDMDB     	fp, {fp, sp, pc}
#--------------------------------------------------------------------------------------



ARMDisableInt:
	STMDB	sp!, {r0}
	MRS		r0, CPSR
	ORR		r0, r0, #NoInt
	MSR		CPSR_cxsf, r0
	LDMIA	sp!, {r0}
	MOV		pc, lr
#--------------------------------------------------------------------------------------



ARMEnableInt:
	STMDB	sp!, {r0}
	MRS		r0, CPSR
	BIC		r0, r0, #NoInt
	MSR		CPSR_cxsf, r0
	LDMIA	sp!, {r0}
	MOV		pc, lr
#--------------------------------------------------------------------------------------



ARMIsDisableInt:
	MRS		a1, CPSR
	AND		a1, a1, #NoInt
	MOV		pc, lr
#--------------------------------------------------------------------------------------



OSStartHighRdy:
	SWI		OS_EnterOS
	BL		OSTaskSwHook
	MOV		R0, #1
	LDR		R1, =OSRunning
	STRB	R0, [R1]
	LDR		R1, =OSTCBHighRdy
	LDR		R1, [R1]
	LDR		R0, [R1, #0]	
	LDMFD	R0!, {R1, R14}
	MSR		SPSR_all, R1
	LDMFD	R0, {R0-R14}^
	NOP
	MOVS	PC,R14		
#--------------------------------------------------------------------------------------



OS_TASK_SW:
	MOV		R2, R14
	MRS		R1, CPSR	
	BIC		R0, R1, #0x1f
	ORR		R0, R0, #0x92
	MSR		CPSR_all, R0
	NOP
	MSR		SPSR_all, R1
	ADD		R14, R2, #0
	#; Now in a state just like as if at 0x18
	B		OSCtxSw
#--------------------------------------------------------------------------------------



OSCtxSw:
	STMFD	R13!, {R14}				

	#; Save current task context
	STMDB	R13, {R13}^
	LDMDB	R13, {R14}
	STMFD	R14, {R0-R14}^
	MRS		R1, SPSR
	SUB		R0, R14, #15*4
	LDMFD	R13!, {R14}
	STMFD	R0!, {R1, R14}

	LDR		R1, =OSTCBCur
	LDR		R1, [R1]
	STR		R0, [R1, #0]			

	BL		OSTaskSwHook

	LDR		R2, =OSTCBHighRdy
	LDR		R3, =OSTCBCur
	LDR		R4, =OSPrioHighRdy
	LDR		R5, =OSPrioCur
	LDR		R0, [R2]
	LDRB	R1, [R4]
	STR		R0, [R3]
	STRB	R1, [R5]

	LDR		R1, =OSTCBHighRdy
	LDR		R1, [R1]
	LDR		R0, [R1,#0]
	LDMFD	R0!, {R1, R14}
	MSR		SPSR_all, R1
	LDMFD	R0, {R0-R14}^
	NOP
	MOVS	PC, R14
#--------------------------------------------------------------------------------------



OSIntCtxSw:
	LDMDB	fp, {fp, sp, lr}
	LDMDB	fp, {fp, sp, lr}
#	LDMDB	fp, {fp, sp, lr}
	LDMFD	sp!, {r0-r12, lr}  
	SUB		lr, lr, #4

	#; Perform normal task swap
	B		OSCtxSw
#--------------------------------------------------------------------------------------
#	END

⌨️ 快捷键说明

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