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

📄 cpu_a.i

📁 一个小型化的嵌入式实时操作系统源代码
💻 I
字号:
# 1 "../832/cpu_a.s"
 


















# 1 "../include/bsp.h" 1
 
















 











 











 


 





 






 







 










# 20 "../832/cpu_a.s" 2

# 1 "../include/cpu.h" 1
 















 
















# 21 "../832/cpu_a.s" 2


	.extern _OSTCBCur,4
	.extern _OSTCBHighRdy,4
 
	.extern _debval1,4
	.extern _debval2,4
	.extern _debval3,4
	.extern _debval4,4
 

	.text
	.align 4
 









	.globl _IRQTrap
_IRQTrap:






	rd		%psr, %l0
	 
	or		%l0, 0x0F00, %l0
	wr		%l0, %g0, %psr

	 
	sub		%sp, 104, %sp		

	 
	mov		%wim, %l4
	srl		%l4, %l0, %l5		 
	cmp		%l5, 1
	bne		CPU_window_fine		 
	nop
	
	 



	mov		%g1, %l6		 
	srl		%l4, 1, %g1		 
	tst		%g1
	bg		CPU_good_wim	 
	nop

	 




	not		%g1				 
	mov		%g1, %wim		 
	nop
	nop
	nop
	mov		%wim, %g1	 
	inc		%g1				 
	srl		%g1, 1, %g1		 
	mov		%g0, %wim		 
	nop						 
	nop
	nop

CPU_good_wim:
	save					 
	mov		%g1, %wim		 

	std		%l0, [%sp + 0 * 4]	 
	std		%l2, [%sp + 2 * 4]	 
	std		%l4, [%sp + 4 * 4]	 
	std		%l6, [%sp + 6 * 4]

	std		%i0, [%sp + 8 * 4]
	std		%i2, [%sp + 10 * 4]
	std		%i4, [%sp + 12 * 4]
	std		%i6, [%sp + 14 * 4]

	restore					 
	mov		%l6, %g1		 

CPU_window_fine:

	mov		%tbr, %l3			 
	and		%l3, 0x0FF0, %l3		 
	srl		%l3, 4, %l3
	sub		%l3, 16, %o0			 

	 
	mov		1,%l3
	sll		%l3,%o0,%l3				 
	set		(0x00000000 ), %l4
	add		%l4, 0x0C, %l4        	 
	sta     %l3, [%l4] 7 		 

	 
	set		(0x00000000 ), %l4
	add     %l4, 0x14, %l4        	 
	set     (0x00100000 >>16), %l3 	 
	sta     %l3, [%l4] 7 
	lda		[%l4] 7 , %l3		 

	 
	andn	%l0, 0x0F00, %o1		 
	or		%o1, 0x0020, %o1		 
	wr		%o1, %g0, %psr
	nop
	nop

	 
	call	_CPUDispatchIRQ			 	
	nop

	 
	or		%l0, 0x0F00, %o1		 
	wr      %o1, %g0, %psr

	cmp		%o0, 0
	be		CPU_NoTaskSwitch
	nop
	call	_OSCtxSw				 
	nop

	 
CPU_NoTaskSwitch:

	 
	andn	%l0, 0x0F20, %o1		 
	wr		%o1, %g0, %psr

	or		%g0, 0x1, %l3			 
	or		%g0, 0x10, %l4			 
	sta		%l3, [%l4] 1			 

	jmpl	%l1, %g0				 
	rett	%l2

 





	.globl	_OSDisableInt
_OSDisableInt:
	rd      %psr, %o0
	or		%o0, 0x0F00, %o0	 
	wr      %o0, %g0, %psr
	retl						 
	nop

 





	.globl	_OSEnableInt
_OSEnableInt:
	rd		%psr, %o0
	andn	%o0, 0x0F00, %o0	 
	wr		%o0, %g0, %psr
	retl						 
	nop

 







	.globl	_IRQSetIntLevel
_IRQSetIntLevel:
	sll		%o0, 8, %o1			 	
	rd		%psr, %o0			 
	andn	%o0, 0x0F00, %o2	 
	or		%o1, %02, %o2
	wr		%o2, %g0, %psr
	and		%o0, 0x0F00, %o0
	retl
	srl		%o0, 8, %o0			 

 







	.globl IRQIntEnable
IRQIntEnable:
	set     (0x00000000 ), %o4
	add     %o4, 0x14, %o3        	 
	add     %o4, 0x0C, %o4        	 

	srl		%o1, 4, %o1				 
	sub		%o1, 16, %o1
	mov		1, %o2
	sll		%o2, %o1, %o2			 
	sta     %o2, [%o4] 7 		 

	set     (0x00100000 >>16), %o1 	 
	sta     %o1, [%o3] 7 

	lda		[%o4] 7 , %o1		 
	nop
	nop

	lda		[%o3] 7 , %o1
	nop
	nop

	retl
	nop

 






	.globl	_OSCtxSw
_OSCtxSw:

	 
	sub		%sp, 144, %sp		 

	std		%o6, [%sp + 30 * 4]	 
	std		%o4, [%sp + 28 * 4]
	std		%o2, [%sp + 26 * 4]
	std		%o0, [%sp + 24 * 4]

	std		%g6, [%sp + 22 * 4]
	std		%g4, [%sp + 20 * 4]
	std		%g2, [%sp + 18 * 4]
	st		%g1, [%sp + 17 * 4]

	mov		%wim, %g2
	mov		%psr, %g3
	mov		%tbr, %g4
	mov		%y, %g5
	std		%g2, [%sp + 34 * 4] 	 
	std		%g4, [%sp + 32 * 4] 	 

	 
	sethi	%hi(_OSTCBCur), %g1
	ld		[%lo(_OSTCBCur) + %g1], %g3	 
	st		%sp, [%g3]

	 



	mov		%g2, %g1		 
	sll		%g1, 8, %g1
	or		%g1, %g2, %g1	 
	mov		1, %g3
	mov		%psr, %g4
	sll		%g3, %g4, %g3	 
							 
	mov		%g0, %wim		 
save_current_registers:
	 


	std		%i6, [%sp + 14 * 4]
	std		%i4, [%sp + 12 * 4]
	std		%i2, [%sp + 10 * 4]
	std		%i0, [%sp + 8 * 4]

	std		%l6, [%sp + 6 * 4]
	std		%l4, [%sp + 4 * 4]
	std		%l2, [%sp + 2 * 4]
	std		%l0, [%sp + 0 * 4]

	 	
	restore
	sll		%g3, 1, %g3
	andcc	%g1, %g3, %g0
	be		save_current_registers
	nop
CPU_all_windows_saved:
	save
	mov		%g2, %wim

	 

 





	.globl	_OSStartHighRdy
_OSStartHighRdy:
	 
	sethi	%hi(_OSTCBHighRdy), %l0
	ld		[%lo(_OSTCBHighRdy) + %l0], %l1  
	sethi	%hi(_OSTCBCur), %l0
	st		%l1, [%lo(_OSTCBCur) + %l0]	 
	ld		[%l1], %l1				 
	mov		%l1, %sp				 
	nop
	nop

	 
	ld		[%sp + 31 * 4], %o7	 
	ldd		[%sp + 28 * 4], %o4
	ldd		[%sp + 26 * 4], %o2
	ldd		[%sp + 24 * 4], %o0

	ldd		[%sp + 22 * 4], %g6
	ldd		[%sp + 20 * 4], %g4
	ldd		[%sp + 18 * 4], %g2
	ld		[%sp + 17 * 4], %g1

	ldd		[%sp + 14 * 4], %i6
	ldd		[%sp + 12 * 4], %i4
	ldd		[%sp + 10 * 4], %i2
	ldd		[%sp + 8 * 4], %i0

	ldd		[%sp + 6 * 4], %l6
	ldd		[%sp + 4 * 4], %l4
	ldd		[%sp + 2 * 4], %l2	 
	 

	ldd		[%sp + 32 * 4], %l0 	 
	mov		%l0, %tbr		 
	mov		%l1, %y

	 
	sethi	%hi(preserveg1), %l0
	st		%g1, [%lo(preserveg1) + %l0]  
	rd      %psr, %g1
	and		%g1, 0xFFFFF0BF, %g1	 
	ld		[%sp + 35 * 4], %l1 	 
	and		%l1, 0x0FC0, %l1		 
	or		%l1, %g1, %g1			 
		 
		 

	 




	and		%g1, 0x0007, %l0		 
	add		%l0, 1, %l0				 
	and		%l0, 0x0007, %l0		 
	mov		1, %l1
	sll		%l1, %l0, %l1	
	mov		%l1, %wim				 

	 
	ldd		[%sp], %l0
	add		%sp, 144, %sp			 

	 
	mov		%g1, %psr
	sethi	%hi(preserveg1), %g1
	retl							 
	ld		[%lo(preserveg1) + %g1], %g1  

 

 





	.globl	_CPUDebugWriteMem
	.reserve debugwritearea, 0x400, "bss", 8 
_CPUDebugWriteMem:
	sethi	%hi(debugptr), %o1
	ld		[%lo(debugptr) + %o1], %o2 	 
	stb		%o0,[%o2]						 
	inc		%o2								 
	retl						 
	st		%o2,[%lo(debugptr) + %o1] 

	.data
curIRQlevel: 
	.word  -1
preserveg1:
	.word	0
debugptr:
	.word	debugwritearea
dplace:
	.word	debugwritearea
	.text

⌨️ 快捷键说明

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