⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_cpu_a.asm

📁 网上也有地方有源码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;********************************************************************************************************
;                                               uC/OS-II
;                                         The Real-Time Kernel
;
;                             (c) Copyright 2000, Jean J. Labrosse, Weston, FL
;                                          All Rights Reserved
;
;
;                                       80x86/80x88 Specific code
;                                           HUGE MEMORY MODEL
;
;                                           Borland C/C++ V4.51
;                                       (IBM/PC Compatible Target)
;
; File         : OS_CPU_A.ASM
; By           : Jean J. Labrosse
; Port Version : V1.00
;********************************************************************************************************

               .186
               
OS_CPU_A_TEXT  SEGMENT BYTE PUBLIC 'CODE'
OS_CPU_A_TEXT  ENDS

UCOS_II_DATA   SEGMENT WORD PUBLIC 'FAR_DATA'
UCOS_II_DATA   ENDS

OS_CPU_C_DATA  SEGMENT WORD PUBLIC 'FAR_DATA'
OS_CPU_C_DATA  ENDS


               ASSUME  CS:OS_CPU_A_TEXT,DS:UCOS_II_DATA

OS_CPU_A_TEXT  SEGMENT BYTE PUBLIC 'CODE'

               PUBLIC _OSTickISR
               PUBLIC _OSStartHighRdy
               PUBLIC _OSCtxSw
               PUBLIC _OSIntCtxSw

               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

               PAGE                                  ; /*$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 PROC FAR
;
                CALL   FAR PTR _OSTaskSwHook          ; Call user defined task switch hook
;
                MOV    AX, UCOS_II_DATA               ; Reload DS
                MOV    DS, AX
                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
                PUSH   ES                               
                PUSH   DS                               
;
                MOV    AX, UCOS_II_DATA                ; Reload DS
                MOV    DS, AX
;
                LES    BX, DWORD PTR DS:_OSTCBCur      ; OSTCBCur->OSTCBStkPtr = SS:SP
                MOV    ES:[BX+2], SS                    
                MOV    ES:[BX+0], SP                    
;
                CALL   FAR PTR _OSTaskSwHook           ; Call user defined task switch hook
;
                MOV    AX, UCOS_II_DATA                ; Reload DS in case it was altered by OSTaskSwHook()
                MOV    DS, AX
                MOV    AX, WORD PTR DS:_OSTCBHighRdy+2 ; OSTCBCur = OSTCBHighRdy
                MOV    DX, WORD PTR DS:_OSTCBHighRdy   
                MOV    WORD PTR DS:_OSTCBCur+2, AX     
                MOV    WORD PTR DS:_OSTCBCur, DX       
;
                MOV    AL, BYTE PTR DS:_OSPrioHighRdy  ; OSPrioCur = OSPrioHighRdy
                MOV    BYTE PTR DS:_OSPrioCur, AL      
;
                LES    BX, DWORD PTR DS:_OSTCBHighRdy  ; SS:SP = OSTCBHighRdy->OSTCBStkPtr
                MOV    SS, ES:[BX+2]                    
                MOV    SP, ES:[BX]                      
;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -