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

📄 os_cpu_a.s

📁 ucos在s3c44b0上的移植
💻 S
字号:

      AREA	|subr|, CODE, READONLY



	EXPORT 	OSStartHighRdy
	IMPORT	OSTaskSwHook
	IMPORT  OSTCBHighRdy 
	IMPORT  OSRunning
OSStartHighRdy
        BL 	OSTaskSwHook             ; Call user-defined hook function

        LDR 	r4,=OSRunning            ; Indicate that multitasking has started
        MOV 	r5, #1                   
        STRB 	r5, [r4]                 ; OSRunning = true

        LDR 	r4, =OSTCBHighRdy        ; Get highest priority task TCB address
        LDR 	r4, [r4]                 ; get stack pointer
        LDR 	sp, [r4]                 ; switch to the new stack
        LDMFD 	sp!, {r4}                ; pop new task s psr
        MSR 	cpsr_cxsf, r4
        LDMFD 	sp!, {r0-r12,lr,pc}      ; pop new task s r0-r12,lr & pc

 	

        EXPORT 	OSCtxSw
        IMPORT	OSPrioCur
        IMPORT	OSPrioHighRdy
        IMPORT	OSTCBCur
        IMPORT	OSTaskSwHook
        IMPORT	OSTCBHighRdy
        
OSCtxSw
        STMFD 	sp!, {lr}                ; push pc (lr is actually be pushed in place of PC)
        STMFD 	sp!, {r0-r12,lr}         ; push lr & register file

        MRS 	r4, cpsr
        STMFD 	sp!, {r4}
                      
        LDR     r4,=OSTCBCur
        LDR     r5,[r4]
        STR     sp,[r5]
        LDR     r4,=OSTCBHighRdy
        LDR     r4,[r4]
        LDR     r5,=OSTCBCur
        STR     r4,[r5]
        ;LDR     sp,[r5]
        LDR     r5,=OSPrioCur
        LDR     r6,=OSPrioHighRdy
        LDR     r6,[r6]
        STRB     r6,[r5]
        LDR     sp,[r4]
        LDMFD   sp!,{r4}
        MSR     cpsr_cxsf,r4
        LDMFD   sp!,{r0-r12,lr,pc} 
        ;LDR 	r4, =OSTCBCur            ; Get current task TCB address
        ;LDR		r5, [r4]
        ;STR 	sp, [r5]   
        ;LDR		r4, =OSTCBHighRdy
		;LDR		r4, [r4]
		;LDR		r5, =OSTCBCur
		;STR		r4, [r5]				 ; OSTCBCur = OSTCBHighRdy

	    ;LDR		r6, =OSPrioHighRdy
		;LDRB	r6, [r6]
		;LDR		r5, =OSPrioCur
		;STRB	r6, [r5]				 ; OSPrioCur = OSPrioHighRdy

		;LDR		sp, [r4]
		;LDMFD 	sp!, {r4}				 ; pop new task cpsr
		;MSR 	cpsr_cxsf, r4
		;LDMFD 	sp!, {r0-r12,lr,pc}		 ; pop new task r0-r12,lr & pc
                 



        EXPORT OSIntCtxSw
		IMPORT OSTaskSwHook
OSIntCtxSw	
		BL		OSTaskSwHook
		
		LDR		r4, =OSTCBHighRdy
		LDR		r4, [r4]
		LDR		r5, =OSTCBCur
		STR		r4, [r5]				 ; OSTCBCur = OSTCBHighRdy

		LDR		r6, =OSPrioHighRdy
		LDRB	r6, [r6]
		LDR		r5, =OSPrioCur
		STRB	r6, [r5]				 ; OSPrioCur = OSPrioHighRdy

		LDR		sp, [r4]
		LDMFD 	sp!, {r4}				 ; pop new task cpsr
		MSR 	cpsr_cxsf, r4
		LDMFD 	sp!, {r0-r12,lr,pc}		 ; pop new task r0-r12,lr & pc


	EXPORT 	OSTickISR
	IMPORT	OSIntEnter
	IMPORT	OSTimeTick
	IMPORT	OSTimeTickHook	
	IMPORT	OSIntExit
	
	
LINK_SAVE	DCD		0
PSR_SAVE	DCD		0

OSTickISR

	STMFD	sp!, {r4}
	
	LDR		r4, =LINK_SAVE
	STR		lr, [r4]				 ; LINK_SAVE = lr_irq

	MRS		lr,	spsr
	STR		lr, [r4, #4]			 ; PSR_SAVE = spsr_irq
	
	LDMFD	sp!, {r4}
		
	ORR		lr, lr,	#0x80			 ; Mask irq for context switching before 
	MSR		cpsr_cxsf, lr 			 ; returning back from irq mode.

	SUB		sp, sp, #4				 ; Space for PC
	STMFD	sp!, {r0-r12, lr}

	LDR		r4, =LINK_SAVE 
	LDR		lr, [r4, #0]
	SUB		lr, lr, #4				 ; lr = LINK_SAVE - 4,
	STR		lr, [sp, #(14*4)]			 ; the return address for pc.

	LDR		r4, [r4, #4]			 ; r4 = PSR_SAVE,
	STMFD	sp!, {r4}		         ; CPSR of the task
 
	LDR		r4, =OSTCBCur
	LDR		r4, [r4]
	STR		sp, [r4]				 ; OSTCBCur -> stkptr = sp
	BL	OSTimeTickHook
	BL	OSIntEnter
	BL 	OSTimeTick
	BL	OSIntExit
	LDMFD 	sp!, {r4}                ; pop new task cpsr
	MSR 	cpsr_cxsf, r4
	LDMFD 	sp!, {r0-r12,lr,pc}      ; pop new task r0-r12,lr & pc

        EXPORT 	ARMDisableInt
ARMDisableInt
	STMFD	sp!, {r0}	
	MRS	r0, cpsr
	ORR	r0, r0, #0xC0
	MSR	cpsr_c, r0		 ; disable IRQ Int s
	LDMFD	sp!, {r0}
	MOV	pc, lr

        EXPORT 	ARMEnableInt
ARMEnableInt
	STMFD	sp!, {r0}
	MRS	r0, CPSR
	BIC r0, r0, #0x80
	MSR	CPSR_c, r0
	LDMFD	sp!, {r0}
	MOV	pc, lr
	


		EXPORT	DmpStk
DmpStk
		LDR		r0, =Dump_Pool
		MOV		r1, sp
		MOV		r2, sp
		ADD		r2, r2, #64
DmpLoop
		LDR		r3, [r1]
		STR		r3, [r0]
		ADD		r0, r0, #4
		ADD		r1, r1, #4
		CMP		r1, r2
		BNE		DmpLoop
		MOV		pc, lr

		ALIGN
Dump_Pool	DCD		0
			DCD		0
			DCD		0
			DCD		0
			DCD		0
			DCD		0
			DCD		0
			DCD		0
			DCD		0
			DCD		0
			DCD		0
			DCD		0
			DCD		0
			DCD		0
			DCD		0
			DCD		0
			DCD		0
			DCD		0
			DCD		0
		END
	

⌨️ 快捷键说明

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