📄 os_cpu_a.asm
字号:
;********************************************************************************************************
; uC/OS-II
; The Real-Time Kernel
;
; (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
; All Rights Reserved
;
;
; 80x86/80x88 Specific code
; LARGE MEMORY MODEL
;
; Pacific Hi-Tech C Compiler
; (IBM/PC Compatible Target)
;
; File : OS_CPU_A.ASM
; By : Jean J. Labrosse
; Modified by : Tony Richardson
;********************************************************************************************************
;********************************************************************************************************
; PUBLIC and EXTERNAL REFERENCES
;********************************************************************************************************
.GLOBL _OSTickISR ; Public
.GLOBL _OSStartHighRdy ; Public
.GLOBL _OSCtxSw ; Public
.GLOBL _OSIntCtxSw ; Public
.GLOBL _OSFPSave ; Public
.GLOBL _OSFPRestore ; Public
.GLOBL _OSIntExit ; External, Far
.GLOBL _OSTimeTick ; External, Far
.GLOBL _OSTaskSwHook ; External, Far
.GLOBL _OSIntNesting ; External, Byte
.GLOBL _OSTickDOSCtr ; External, Byte
.GLOBL _OSPrioHighRdy ; External, Byte
.GLOBL _OSPrioCur ; External, Byte
.GLOBL _OSRunning ; External, Byte
.GLOBL _OSTCBCur ; External, Dword
.GLOBL _OSTCBHighRdy ; External, Dword
.186
.PSECT _TEXT
;*********************************************************************************************************
; START MULTITASKING
; void OSStartHighRdy(void)
;
; The stack frame is assumed to look as follows:
;
; OSTCBHighRdy->OSTCBStkPtr --> DS (Low memory)
; ES
; DI
; SI
; BP
; SP
; BX
; DX
; CX
; AX
; OFFSET of task code address
; SEGMENT of task code address
; Flags to load in PSW
; OFFSET of task code address
; SEGMENT of task code address
; OFFSET of 'pdata'
; SEGMENT of 'pdata' (High memory)
;
; Note : OSStartHighRdy() MUST:
; a) Call OSTaskSwHook() then,
; b) Set OSRunning to TRUE,
; c) Switch to the highest priority task.
;*********************************************************************************************************
_OSStartHighRdy:
MOV AX, #SEG _OSTCBHighRdy ; Reload DS
MOV DS, AX ;
;
CALLF _OSTaskSwHook ; Call user defined task switch hook
;
MOV AL, #1 ; OSRunning = TRUE;
MOV DS:_OSRunning, AL ; (Indicates that multitasking has started)
;
LES BX, DS:_OSTCBHighRdy ; SS:SP = OSTCBHighRdy->OSTCBStkPtr
MOV SS, ES:2[BX] ;
MOV SP, ES:[BX] ;
;
POP DS ; Load task's context
POP ES ;
POPA ;
;
IRET ; Run task
;*********************************************************************************************************
; PERFORM A CONTEXT SWITCH (From task level)
; void OSCtxSw(void)
;
; Note(s): 1) Upon entry,
; OSTCBCur points to the OS_TCB of the task to suspend
; OSTCBHighRdy points to the OS_TCB of the task to resume
;
; 2) The stack frame of the task to suspend looks as follows:
;
; SP -> OFFSET of task to suspend (Low memory)
; SEGMENT of task to suspend
; PSW of task to suspend (High memory)
;
; 3) The stack frame of the task to resume looks as follows:
;
; OSTCBHighRdy->OSTCBStkPtr --> DS (Low memory)
; ES
; DI
; SI
; BP
; SP
; BX
; DX
; CX
; AX
; OFFSET of task code address
; SEGMENT of task code address
; Flags to load in PSW (High memory)
;*********************************************************************************************************
_OSCtxSw:
;
PUSHA ; Save current task's context
PUSH ES ;
PUSH DS ;
;
MOV AX, #SEG _OSTCBCur ; Reload DS in case it was altered
MOV DS, AX ;
;
LES BX, DS:_OSTCBCur ; OSTCBCur->OSTCBStkPtr = SS:SP
MOV ES:2[BX], SS ;
MOV ES:[BX], SP ;
;
CALLF _OSTaskSwHook ; Call user defined task switch hook
;
MOV AX, DS:_OSTCBHighRdy+2 ; OSTCBCur = OSTCBHighRdy
MOV DX, DS:_OSTCBHighRdy ;
MOV DS:_OSTCBCur+2, AX ;
MOV DS:_OSTCBCur, DX ;
;
MOV AL, DS:_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
MOV DS:_OSPrioCur, AL ;
;
LES BX, DS:_OSTCBHighRdy ; SS:SP = OSTCBHighRdy->OSTCBStkPtr
MOV SS, ES:2[BX] ;
MOV SP, ES:[BX] ;
;
POP DS ; Load new task's context
POP ES ;
POPA ;
;
IRET ; Return to new task
;
;*********************************************************************************************************
; PERFORM A CONTEXT SWITCH (From an ISR)
; void OSIntCtxSw(void)
;
; Note(s): 1) Upon entry,
; OSTCBCur points to the OS_TCB of the task to suspend
; OSTCBHighRdy points to the OS_TCB of the task to resume
;
; 2) The stack frame of the task to suspend looks as follows:
;
; OSTCBCur->OSTCBStkPtr ------> DS (Low memory)
; ES
; DI
; SI
; BP
; SP
; BX
; DX
; CX
; AX
; OFFSET of task code address
; SEGMENT of task code address
; Flags to load in PSW (High memory)
;
;
; 3) The stack frame of the task to resume looks as follows:
;
; OSTCBHighRdy->OSTCBStkPtr --> DS (Low memory)
; ES
; DI
; SI
; BP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -