?? ix86l_a.asm
字號(hào):
;********************************************************************************************************
; uC/OS
; The Real-Time Kernel
;
; (c) Copyright 1992, 1993, Jean J. Labrosse, Plantation, FL
; All Rights Reserved
;
;
; 80x86/80x88 Specific code
; LARGE MEMORY MODEL
;
; File : Ix86L_A.ASM
; By : Jean J. Labrosse
;********************************************************************************************************
.MODEL LARGE
.186
.CODE
PUBLIC _OSStartHighRdy
PUBLIC _OSCtxSw
PUBLIC _OSIntCtxSw
PUBLIC _OSTickISR
EXTRN _OSIntEnter:FAR
EXTRN _OSIntExit:FAR
EXTRN _OSTimeTick:FAR
EXTRN _OSTCBCur:DWORD
EXTRN _OSTCBHighRdy:DWORD
PAGE ; /*$PAGE*/
;*********************************************************************************************************
; START MULTITASKING
; void OSStartHighRdy(void)
;
; Total execution time : 179 bus cycles
;*********************************************************************************************************
_OSStartHighRdy PROC FAR
;
MOV AX, DGROUP ; 4~, Reload DS
MOV DS, AX ; 2~
;
LES BX, DWORD PTR DS:_OSTCBHighRdy ; 18~, SS:SP = OSTCBHighRdy->OSTCBStkPtr;
MOV SS, ES:[BX+2] ; 9~
MOV SP, ES:[BX] ; 9~
;
POP DS ; 8~, Pop task's stack
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 : 277 bus cycles
;*********************************************************************************************************
_OSCtxSw PROC FAR
PUSHA ; 36~, Save current task's context
PUSH ES ; 8~
PUSH DS ; 8~
;
MOV AX, DGROUP ; 4~, Reload DS with DGROUP
MOV DS, AX ; 2~
;
LES BX, DWORD PTR DS:_OSTCBCur ; 18~, OSTCBCur->OSTCBStkPtr = SS:SP
MOV ES:[BX+2], SS ; 12~
MOV ES:[BX], SP ; 12~
;
MOV AX, WORD PTR DS:_OSTCBHighRdy+2 ; 9~, OSTCBCur = OSTCBHighRdy
MOV DX, WORD PTR DS:_OSTCBHighRdy ; 9~
MOV WORD PTR DS:_OSTCBCur+2, AX ; 12~,
MOV WORD PTR DS:_OSTCBCur, DX ; 12~
;
LES BX, DWORD PTR DS:_OSTCBHighRdy ; 18~, SS:SP = OSTCBHighRdy->OSTCBStkPtr;
MOV SS, ES:[BX+2] ; 9~
MOV SP, ES:[BX] ; 9~
;
POP DS ; 8~, Restore context of task to run
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 : 219 bus cycles
;*********************************************************************************************************
_OSIntCtxSw PROC FAR
;
ADD SP,10 ; 4~, Ignore calls to OSIntExit and OSIntCtxSw
;
MOV AX, DGROUP ; 4~, Reload DS with DGROUP
MOV DS, AX ; 2~
;
LES BX, DWORD PTR DS:_OSTCBCur ; 18~, OSTCBCur->OSTCBStkPtr = SS:SP
MOV ES:[BX+2], SS ; 12~
MOV ES:[BX], SP ; 12~
;
MOV AX, WORD PTR DS:_OSTCBHighRdy+2 ; 9~, OSTCBCur = OSTCBHighRdy
MOV DX, WORD PTR DS:_OSTCBHighRdy ; 9~
MOV WORD PTR DS:_OSTCBCur+2, AX ; 12~
MOV WORD PTR DS:_OSTCBCur, DX ; 12~
;
LES BX, DWORD PTR DS:_OSTCBHighRdy ; 18~, SS:SP = OSTCBHighRdy->OSTCBStkPtr;
MOV SS, ES:[BX+2] ; 9~
MOV SP, ES:[BX] ; 9~
;
;
POP DS ; 8~, Restore new task's context
POP ES ; 8~
POPA ; 51~
;
IRET ; 28~, Return to new task
_OSIntCtxSw ENDP
PAGE
;*********************************************************************************************************
; HANDLE TICK ISR
;*********************************************************************************************************
_OSTickISR PROC FAR
PUSHA ; Save 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 FAR PTR _OSIntEnter ; Notify uC/OS of ISR
CALL FAR PTR _OSTimeTick ; Process system tick
CALL FAR PTR _OSIntExit ; Notify uC/OS of end of ISR
;
POP DS ; Restore interrupted task's context
POP ES
POPA
;
IRET ; Return to interrupted task
_OSTickISR ENDP
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -