📄 ix86s_a.asm
字号:
;********************************************************************************************************
; uC/OS
; The Real-Time Kernel
;
; (c) Copyright 1992, 1993, Jean J. Labrosse, Plantation, FL
; All Rights Reserved
;
;
; 80x86/80x88 Specific code
; SMALL MEMORY MODEL
;
; File : Ix86S_A.ASM
; By : Jean J. Labrosse
;********************************************************************************************************
PUBLIC _OSTickISR
PUBLIC _OSStartHighRdy
PUBLIC _OSCtxSw
PUBLIC _OSIntCtxSw
EXTRN _OSIntEnter:NEAR
EXTRN _OSIntExit:NEAR
EXTRN _OSTimeTick:NEAR
EXTRN _OSTCBCur:WORD
EXTRN _OSTCBHighRdy:WORD
.MODEL SMALL
.CODE
.186
;*********************************************************************************************************
; START MULTITASKING
; void OSStartHighRdy(void)
;
; Total execution time : 134 bus cycles
;*********************************************************************************************************
_OSStartHighRdy PROC NEAR
MOV BX, [_OSTCBHighRdy] ; 9~, Point to TCB of highest priority task ready to run
;
MOV SS, [BX+2] ; 9~, SS:SP = OSTCBHighRdy->OSTCBStkPtr
MOV SP, [BX] ; 9~,
;
POP DS ; 8~, Load task's context
POP ES ; 8~
POPA ; 51~
;
IRET ; 28~, Run task
_OSStartHighRdy ENDP
PAGE ; /*$PAGE*/
;*********************************************************************************************************
; PERFORM A CONTEXT SWITCH (From task level)
; void OSCtxSw(void)
;
; Total execution time : 225 bus cycles
;*********************************************************************************************************
_OSCtxSw PROC FAR
;
PUSHA ; 36~, Save current task's context
PUSH ES ; 8~
PUSH DS ; 8~
;
MOV AX, SEG _OSTCBCur ; 4~, Reload DS in case it was altered
MOV DS, AX ; 2~
;
MOV BX, [_OSTCBCur] ; 9~, OSTCBCur->OSTCBStkPtr = SS:SP
MOV [BX+2], SS ; 12~
MOV [BX], SP ; 12~
;
MOV BX, [_OSTCBHighRdy] ; 9~, OSTCBCur = OSTCBHighRdy
MOV [_OSTCBCur], BX ; 12~
;
MOV SS, [BX+2] ; 9~, SS:SP = OSTCBHighRdy->OSTCBStkPtr;
MOV SP, [BX] ; 9~
;
POP DS ; 8~, Load new task's context
POP ES ; 8~
POPA ; 51~
;
IRET ; 28~, Return to new task
;
_OSCtxSw ENDP
PAGE ; /*$PAGE*/
;*********************************************************************************************************
; PERFORM A CONTEXT SWITCH (From an ISR)
; void OSIntCtxSw(void)
;
; Total execution time : 177 bus cycles
;*********************************************************************************************************
_OSIntCtxSw PROC NEAR
;
ADD SP,6 ; 4~, Ignore calls to OSIntExit and OSIntCtxSw
;
MOV AX, SEG _OSTCBCur ; 4~, Reload DS in case it was altered
MOV DS, AX ; 2~
;
MOV BX, [_OSTCBCur] ; 9~, OSTCBCur->OSTCBStkPtr = SS:SP
MOV [BX+2], SS ; 12~
MOV [BX], SP ; 12~
;
MOV BX, [_OSTCBHighRdy] ; 9~, OSTCBCur = OSTCBHighRdy
MOV [_OSTCBCur], BX ; 12~
;
MOV SS, [BX+2] ; 9~, SS:SP = OSTCBHighRdy->OSTCBStkPtr;
MOV SP, [BX] ; 9~
;
POP DS ; 8~, Restore context of task to run
POP ES ; 8~
POPA ; 51~
;
IRET ; 28~, Return to new task
;
_OSIntCtxSw ENDP
PAGE
;*********************************************************************************************************
; HANDLE TICK ISR
;*********************************************************************************************************
;
_OSTickISR PROC FAR
;
PUSHA ; Save interrupted task's context
PUSH ES
PUSH DS
;
INT 081H ; Chain into DOS's tick ISR
;
MOV AX, DGROUP ; Reload DS with DGROUP
MOV DS, AX
;
CALL _OSIntEnter ; Notify uC/OS about ISR
CALL _OSTimeTick ; Handle system tick
CALL _OSIntExit ; Exit uC/OS through scheduler if HPT ready
;
POP DS ; Restore interrupted task's context
POP ES
POPA
;
IRET ; Return to interrupted task
;
_OSTickISR ENDP
;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -