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

📄 os_cpu_a.s

📁 一个uC/OS-II的simplest edition
💻 S
字号:

	.text
	.code32

# 导出函数
	.global out_byte
	.global in_byte
	.global OSTickISR
	.global OSStartHighRdy
	.global OSCtxSw
	.global OSIntCtxSw



# ========================================================================
#                        void OSTickISR(void)
# ========================================================================
	# 导入的函数
	.extern OSTimeTick

OSTickISR:
	
	pushal				# 保护task现场
	
	movb	$0x20, %al		# send an end-of-int(EOI) to the i8259
	outb	%al, $0x20
	
	call	OSTimeTick
	
	popal
	
	iret


# ========================================================================
#                        void OSStartHighRdy(void)
# ========================================================================
	# 导入的全局变量
	.extern OSRunning		# INT32U
	.extern OSTCBHighRdy		# INT32U

OSStartHighRdy:

	movl	$1, OSRunning		# OSRunning = 1

	movl	OSTCBHighRdy, %eax	# Load OSTCBHighRdy->OSTCBStkPtr into ESP
	movl	(%eax), %esp		

	popal				# Pop all general regs from task stack

	iret


# ========================================================================
#                        void OSCtxSw(void)
# ========================================================================
	# 导入的全局变量
	.extern OSTCBHighRdy		# INT32U
	.extern OSTCBCur		# INT32U

OSCtxSw:
	
	pushal				# PUSH general regs to the current task's stack

	movl	OSTCBCur, %eax		# Save the esp into OSTCBCur->OSTCBStkPtr
	movl	%esp, (%eax)

	movl	OSTCBHighRdy, %eax	# OSTCBCur = OSTCBHighRdy
	movl	%eax, OSTCBCur

	movl	(%eax), %esp		# Load OSTCBHighRdy->OSTCBStkPtr into ESP

	popal				# Pop all general regs from task stack

	iret


# ========================================================================
#                        void OSIntCtxSw(void)
# ========================================================================
	# 导入的全局变量
	.extern OSTCBCur		# INT32U

OSIntCtxSw:

#	| PUSHAD			|  <-- task stack pointer 本该在的位置
#	| call to OSTimeTick		|
#	| xxx				|  <-- 编译器产生的 esp 使用
#	| yyy				|  <
#	| zzz				|  <
#	| OS_ENTER_CRITICAL() - PUSHF	|
#	| call to OSIntCtxSw		|  <-- esp 实际所在的位置

	addl	$(4*10), %esp		# Ignore calls to OSIntExit & PUSHF & OSIntCtxSw

	movl	OSTCBCur, %eax		# Save the esp into OSTCBCur->OSTCBStkPtr
	movl	%esp, (%eax)

	movl	OSTCBHighRdy, %eax	# OSTCBCur = OSTCBHighRdy
	movl	%eax, OSTCBCur
	
	movl	(%eax), %esp		# Load OSTCBHighRdy->OSTCBStkPtr into ESP

	popal				# Pop all general regs from task stack

	iret


# ========================================================================
#                  void out_byte(INT32U port, INT8U value);
# ========================================================================
out_byte:
	movl	4(%esp), %edx		# port
	movb	8(%esp), %al		# value
	out	%al, %dx
	rep
	nop				# 一点延迟
	ret

# ========================================================================
#                  INT8U in_byte(INT32U port);
# ========================================================================
in_byte:
	movl	4(%esp), %edx		# port
	xorl	%eax, %eax
	in	%dx, %al
	rep
	nop
	ret

⌨️ 快捷键说明

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