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

📄 os_cpu_a.s

📁 成功移植ucos2.85到s3c44b0的开发板
💻 S
字号:
;****************************************************************************
; Name		 : OS_CPU_A.S									                *
; Description: 用汇编语言编写与处理器相关的函数,至少包括以下四个函数:     *
;			   OSStartHighRdy();											*
;			   OSCtxSw():													*
;			   OSIntCtxSw();												*
;			   OSTickISR();													*
;****************************************************************************
NoInt		EQU	0xc0

BIT_TIMER0	EQU		(0x1<<13)
I_ISPC		EQU		0x1e00024

	AREA	|subr|, CODE, READONLY
	
	IMPORT	OSTCBCur
	IMPORT	OSTCBHighRdy
	IMPORT	OSPrioCur
	IMPORT	OSPrioHighRdy	
	IMPORT  OSRunning
	IMPORT	OSIntEnter
	IMPORT	OSIntExit
	IMPORT	OSTimeTick
	
	EXPORT	OSStartHighRdy
OSStartHighRdy
    
	LDR		r0, =OSRunning			; OSRunning = 1
	MOV		r1, #1
	STRB	r1, [r0]
	
	LDR		r5, =OSTCBHighRdy	    ; Get highest priority task TCB address
	LDR		r5, [r5]				; get stack pointer
	LDR		sp, [r5]				; switch to the new stack

	LDMFD	sp!, {r4}				; get new state from top of the stack
	MSR		CPSR_cxsf, r4			; CPSR should be SVC32Mode
	LDMFD	sp!, {r0-r12, lr, pc }	; start the new task

	

	EXPORT	OS_TASK_SW
OS_TASK_SW
	STMFD	sp!, {lr}				; save pc
	STMFD	sp!, {lr}				; save lr
	STMFD	sp!, {r0-r12}			; save register file and ret address
	MRS		r4, CPSR
	STMFD	sp!, {r4}				; save CPSR
		
	LDR		r4, =OSTCBCur		; 在当前任务的任务控制块中保存当前任务的堆栈指针
	LDR		r5, [r4]
	STR		sp, [r5]				; 

	LDR		r4, =OSPrioCur		; OSPrioCur = OSPrioHighRdy
	LDR		r5, =OSPrioHighRdy
	LDRB	r6, [r5]
	STRB	r6, [r4]
	
	LDR		r4, =OSTCBHighRdy	; OSTCBCur = OSTCBHighRdy
	LDR		r5, =OSTCBCur
	LDR		r4, [r4]
	STR		r4, [r5] 

	LDR		sp, [r4]				; 从新任务的任务控制块中弹出堆栈指针
	LDMFD	sp!, {r4}				; 
	MSR		CPSR_cxsf, r4			; 
	LDMFD	sp!, {r0-r12, lr, pc}	; 弹出处理器所有寄存器值



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

	
	LDR		r4, =OSTCBHighRdy	;OSTCBCur = OSTCBHighRdy
	LDR		r5, =OSTCBCur
	LDR		r4, [r4]
	STR		r4, [r5] 

	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



LINK_SAVE	DCD		0
PSR_SAVE	DCD		0

	EXPORT 	OSTickISR
OSTickISR
    
	STMFD	sp!, {r4}				 ; 先保存寄存器r4
	LDR		r4, =LINK_SAVE
	STR		lr, [r4]				 ; 将lr保存在LINK_SAVE中
	MRS		lr,	spsr				 ; lr = spsr
	STR		lr, [r4, #4]			 ; 将spsr_irq保存在PSR_SAVE中
	LDMFD	sp!, {r4}				 ; 寄存器r4出栈
	ORR		lr, lr,	#0x80			 ; 将spsr_irq中IRQ位禁止
	MSR		cpsr_cxsf, lr 			 ; 将当前程序状态寄存器CPSR中IRQ位禁止

	SUB		sp, sp, #4				 ; Space for PC寄存器
	STMFD	sp!, {r0-r12, lr}		 ; 将除PC外的所有处理器寄存器入栈
	LDR		r4, =LINK_SAVE
	LDR		lr, [r4, #0]
	SUB		lr, lr, #4				 ; lr中保存的值为PC+4
	STR		lr, [sp, #(14*4)]		 ; PC寄存器入栈
	LDR		r4, [r4, #4]			 ; r4 = PSR_SAVE,
	STMFD	sp!, {r4}		         ; spsr_irq最后入栈

	LDR		r4, =OSTCBCur		 ; 将保存好的堆栈指针保存到被中断任务的任务块中
	LDR		r4, [r4]
	STR		sp, [r4]

	LDR		r0, =I_ISPC				 ; 必须手动清除中断pending位
	LDR		r1, =BIT_TIMER0
	STR		r1, [r0]
		
	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	OSCPUSaveSR
		EXPORT	OSCPURestoreSR

OSCPUSaveSR
		MRS		R0,CPSR
		ORR		R1,R0,#0xc0
		MSR		CPSR_cxsf,R0
		MOV		PC,LR  
		

OSCPURestoreSR
		
		MSR		CPSR_cxsf,R0
		MOV		PC,LR  		      
		
	END
	

⌨️ 快捷键说明

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