?? 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 WITH FLOATING-POINT
; Borland C/C++ V4.51
;
; File : OS_CPU_A.ASM
; By : Jean J. Labrosse
;********************************************************************************************************
; .include "lf2407a.h"
; .include "F2407REGS.H"
.global _OSTickISR
.global _OSStartHighRdy
.global _OSCtxSw
.global _OSIntCtxSw
.global _OSIntEnter
.global _OSIntExit
.global _OSTimeTick
.global _OSTaskSwHook
.global _OSIntNesting
.global _OSTickDOSCtr
.global _OSPrioHighRdy
.global _OSPrioCur
.global _OSRunning
.global _OSTCBCur
.global _OSTCBHighRdy
.global I$$SAVE
.global I$$REST
.global PVECTORS
; /*$PAGE*/
;*********************************************************************************************************
; 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:
call _OSTaskSwHook,ar1
ldpk _OSRunning
splk #1,_OSRunning
ldpk _OSTCBHighRdy
nop
nop
lar AR1,*
nop
nop
b I$$REST
;*********************************************************************************************************
; 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:
call I$$SAVE
_OSCtxSw_0:
call _OSTaskSwHook
ldpk _OSPrioCur
bldd #_OSPrioHighRdy,_OSPrioCur
lar AR2,#_OSTCBCur
mar *,AR2
lar AR0,*,AR0
sar AR1,*
lar AR0,#_OSTCBHighRdy
lar AR0,*
lar AR1,*,AR2
sar AR0,*,AR1
b I$$REST
_OSIntCtxSw:
POP ;彈出調用_OSIntCtxSw時的返回地址
SBRK 3 ;調整堆棧指針,清除調用OSIntExit時保存的返回地址和幀指針
B _OSCtxSw_0 ;執行與OSCtxSw函數一樣的代碼
;*********************************************************************************************************
; 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
; SP
; BX
; DX
; CX
; AX
; OFFSET of task code address
; SEGMENT of task code address
; Flags to load in PSW (High memory)
;*********************************************************************************************************
;*********************************************************************************************************
; RESTORE FPU REGISTERS
; void OSFPRestore(void *pblk)
;
; Description : This function is called to restore the contents of the FPU registers during a context
; switch. It is assumed that a pointer to a storage area for the FPU registers is placed
; in the task's TCB (i.e. .OSTCBExtPtr).
; Arguments : pblk is passed to this function when called.
; Note(s) : 1) The stack frame upon entry looks as follows:
;
; SP + 0 -> OFFSET of caller (Low memory)
; + 2 SEGMENT of caller
; + 4 OFFSET of pblk
; + 6 SEGMENT of pblk (High memory)
;*********************************************************************************************************
;*********************************************************************************************************
; SAVE FPU REGISTERS
; void OSFPSave(void *pblk)
;
; Description : This function is called to save the contents of the FPU registers during a context
; switch. It is assumed that a pointer to a storage area for the FPU registers is placed
; in the task's TCB (i.e. .OSTCBExtPtr).
; Arguments : pblk is passed to this function when called.
; Note(s) : 1) The stack frame upon entry looks as follows:
;
; SP + 0 -> OFFSET of caller (Low memory)
; + 2 SEGMENT of caller
; + 4 OFFSET of pblk
; + 6 SEGMENT of pblk (High memory)
;*********************************************************************************************************
;*********************************************************************************************************
; HANDLE TICK ISR
;
; Description: This function is called 199.99 times per second or, 11 times faster than the normal DOS
; tick rate of 18.20648 Hz. Thus every 11th time, the normal DOS tick handler is called.
; This is called chaining. 10 times out of 11, however, the interrupt controller on the PC
; must be cleared to allow for the next interrupt.
;
; Arguments : none
;
; Returns : none
;
; Note(s) : The following C-like pseudo-code describe the operation being performed in the code below.
;
; Save all registers on the current task's stack;
; OSIntNesting++;
; if (OSIntNesting == 1) {
; OSTCBCur->OSTCBStkPtr = SS:SP
; }
; OSTickDOSCtr--;
; if (OSTickDOSCtr == 0) {
; OSTickDOSCtr = 11;
; INT 81H; Chain into DOS every 54.925 mS
; (Interrupt will be cleared by DOS)
; } else {
; Send EOI to PIC; Clear tick interrupt by sending an End-Of-Interrupt to the 8259
; PIC (Priority Interrupt Controller)
; }
; OSTimeTick(); Notify uC/OS-II that a tick has occured
; OSIntExit(); Notify uC/OS-II about end of ISR
; Restore all registers that were save on the current task's stack;
; Return from Interrupt;
;*********************************************************************************************************
;_OSTickISR:
; call I$$SAVE
;
; ldpk _OSIntNesting
; lacc _OSIntNesting
; add #1
; sacl _OSIntNesting
; ldp #232
; splk #0001h,_EVIFRB
; clrc INTM
; call _OSTimeTick
; call _OSIntExit
;;
; b I$$REST
;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -