www.pudn.com > GOS.rar > OsHal.s


	IMPORT pOsNextThread 
	IMPORT pOsCurThread 
	IMPORT _ISR_STARTADDRESS 
	EXPORT HAL_CreateThread 
	EXPORT SoftSchedule 
	EXPORT IntSchedule 
	 
    AREA    Hal,CODE,READONLY 
HAL_CreateThread 
	stmfd r2!,{r3} ;相同于pc 
	stmfd r2!,{r0,r1,r3-r13} ;相同于{r0-r12} 
	mrs r1,cpsr 
	stmfd r2!,{r1,lr} ;相同于cpsr,lr; 
	str r2, [r0] ;把sp写入TCB中 
	mov pc,lr 
     
IntSchedule 
	;保存IRA IRA=*(sp+20);*(sp+20)=IntSche; 
	ldr	r0,[sp,#20] 
	ldr r1,=_ISR_STARTADDRESS 
	str	r0,[r1]; 
	ldr r0,=IntSche 
	add	r0,r0,#4 
	str	r0,[sp,#20] 
	mov pc,lr 
IntSche 
	; sp-=4;//for IRA 
	sub sp ,sp,#4 
	;Save Registers; 
	stmfd sp!,{r0-r12} 
	mrs r0,cpsr 
	stmfd sp!,{r0,lr} 
	;*(sp+_60)=IRA; 
	ldr r0,=_ISR_STARTADDRESS 
	ldr	r0,[r0] 
	sub	r0,r0,#4 
	str r0,[sp,#60] 
	b	Sche_Run 
SoftSchedule 
	;save all register and pc 
	sub sp ,sp,#4 
	stmfd sp!,{r0-r12} 
	mrs r0,cpsr 
	stmfd sp!,{r0,lr} 
	ldr r0,=Sche_end 
	str r0,[sp,#60] 
Sche_Run 
	;pOsCurThread=pOsNextThread; 
	ldr 	r0,=pOsCurThread 
	ldr 	r1,[r0] 
	ldr 	r2,=pOsNextThread 
	ldr 	r2,[r2] 
	str 	r2,[r0] 
	;pOldCurThread.sp=sp; 
	str 	sp,[r1] 
	;sp=pOsNextThread.sp; 
	ldr		sp,[r2] 
	;restore all resisters; 
	ldmfd sp!,{r0,lr} 
	msr cpsr_fsxc,r0 
	ldmfd sp!,{r0-r12} 
	ldmfd sp!,{pc} 
Sche_end 
	mov pc,lr 
 
	END