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

📄 os_cpu_a.asm

📁 嵌入式系统基础课件
💻 ASM
字号:
; File         : OS_CPU_A.ASM
; By           : Dan Lewis
;*****************************************************************************
;
;		       Intel x86 Specific code
;		  Protected Mode, Flat Memory Model
;
;			    DJGPP and NASM
;		      (IBM/PC Compatible Target)
;
;*****************************************************************************

	SECTION	.data

	EXTERN  _OSIntNesting
	EXTERN  _OSPrioHighRdy
	EXTERN  _OSPrioCur
	EXTERN  _OSRunning
	EXTERN  _OSTCBCur
	EXTERN  _OSTCBHighRdy
	EXTERN  _OldTickISR

	SECTION	.text
	ALIGN	16
	BITS	32

	GLOBAL _OSTickISR
	GLOBAL _OSStartHighRdy
	GLOBAL _OSCtxSw
	GLOBAL _OSIntCtxSw

	EXTERN  _OSIntExit
	EXTERN  _OSTimeTick
	EXTERN  _OSTaskSwHook

; --------------------------------------------------------------------
_OSStartHighRdy:	; START MULTITASKING
; --------------------------------------------------------------------
	CALL   _OSTaskSwHook          ; Call user defined task switch hook
	MOV    BYTE [_OSRunning], 1   ; Indicate that multitasking has started
	MOV    EAX, [_OSTCBHighRdy]   ; ESP = OSTCBHighRdy->OSTCBStkPtr
	MOV    ESP, [EAX]
	POPA                          ; Load task's context
	IRET                          ; Run task

; --------------------------------------------------------------------
_OSCtxSw:		; PERFORM A CONTEXT SWITCH (From task level)
; --------------------------------------------------------------------
	PUSHA				; Save current task's context
	MOV    EAX, [_OSTCBCur]		; OSTCBCur->OSTCBStkPtr = ESP
	MOV    [EAX], ESP

	; Fall through to _OSInCtxSw...

; --------------------------------------------------------------------
_OSIntCtxSw:		; PERFORM A CONTEXT SWITCH (From an ISR)
; --------------------------------------------------------------------
	CALL   _OSTaskSwHook		; Call user defined task switch hook
	MOV    AL, [_OSPrioHighRdy]	; OSPrioCur = OSPrioHighRdy
	MOV    [_OSPrioCur], AL
	MOV    EAX, [_OSTCBHighRdy]	; OSTCBCur = OSTCBHighRdy
	MOV    [_OSTCBCur], EAX
	MOV    ESP, [EAX]		; ESP = OSTCBHighRdy->OSTCBStkPtr
	POPA
	IRET				; Return to new task

; --------------------------------------------------------------------
_OSTickISR:
; --------------------------------------------------------------------
	PUSHA				; Save interrupted task's context
	INC	BYTE [_OSIntNesting]	; Notify uC/OS-II of ISR
	CMP	BYTE [_OSIntNesting], 1	; if (OSIntNesting == 1)
	JNE	SHORT _OSTickISR1             
	MOV	EAX, [_OSTCBCur]	;     OSTCBCur->OSTCBStkPtr = ESP
	MOV	[EAX], ESP
_OSTickISR1:
	PUSHF
	PUSH	CS
	CALL	DWORD [_OldTickISR]
	CALL	_OSTimeTick		; Process system tick
	CALL	_OSIntExit		; Notify uC/OS-II of end of ISR
	POPA
	IRET				; Return to interrupted task

	END

⌨️ 快捷键说明

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