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

📄 os_cpu_a.asm

📁 Quantum Platform(QP) is a family of very lightweight, state machine-based frameworks for embedded sy
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;********************************************************************************************************;                                               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 + -