📄 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;; Borland Turbo Assembler 3.1; (IBM/PC Compatible Target);; File : OS_CPU_A.ASM; By : Jean J. Labrosse; Updated By : Miro Samek;********************************************************************************************************;********************************************************************************************************; PUBLIC and EXTERNAL REFERENCES;******************************************************************************************************** PUBLIC _OSTickISR PUBLIC _OSStartHighRdy PUBLIC _OSCtxSw PUBLIC _OSIntCtxSw PUBLIC _OSCPUDisable PUBLIC _OSCPUEnable PUBLIC _OSCPUSaveSR PUBLIC _OSCPURestoreSR EXTRN _OSIntExit:FAR EXTRN _OSTimeTick:FAR EXTRN _OSTaskSwHook:FAR EXTRN _OSIntNesting:BYTE EXTRN _OSTickDOSCtr:BYTE EXTRN _OSPrioHighRdy:BYTE EXTRN _OSPrioCur:BYTE EXTRN _OSRunning:BYTE EXTRN _OSTCBCur:DWORD EXTRN _OSTCBHighRdy:DWORD.MODEL LARGE.CODE.186 PAGE ; /*$PAGE*/;*********************************************************************************************************;; void OSCPUDisable(void);;*********************************************************************************************************_OSCPUDisable PROC FAR CLI ; clear the I flag RET ; return to the caller_OSCPUDisable ENDP;*********************************************************************************************************;; void OSCPUDisable(void);;*********************************************************************************************************_OSCPUEnable PROC FAR STI ; set the I flag RET ; return to the caller_OSCPUEnable ENDP;*********************************************************************************************************;; int OSCPUSaveSR(void);;*********************************************************************************************************_OSCPUSaveSR PROC FAR PUSHF ; push the flags POP AX ; pop the flags into the return value AX CLI ; clear the I flag RET ; return to the caller_OSCPUSaveSR ENDP;*********************************************************************************************************;; void OSCPURestoreSR(int key);;*********************************************************************************************************_OSCPURestoreSR PROC FAR PUSH BP MOV BP,SP MOV AX, WORD PTR[BP+6] PUSH AX POPF POP BP RET_OSCPURestoreSR ENDP;*********************************************************************************************************; 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 PROC FAR MOV AX, SEG _OSTCBHighRdy ; Reload DS MOV DS, AX ;; CALL FAR PTR _OSTaskSwHook ; Call user defined task switch hook; MOV AL, 1 ; OSRunning = TRUE; MOV BYTE PTR DS:_OSRunning, AL ; (Indicates that multitasking has started); LES BX, DWORD PTR DS:_OSTCBHighRdy ; SS:SP = OSTCBHighRdy->OSTCBStkPtr MOV SS, ES:[BX+2] ; MOV SP, ES:[BX+0] ;; POP DS ; Load task's context POP ES ; POPA ;; IRET ; Run task_OSStartHighRdy ENDP PAGE ; /*$PAGE*/;*********************************************************************************************************; 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 PROC FAR; PUSHA ; Save current task's context
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -