os_cpu_a.asm

来自「8052小型操作系统, 用Keil C编译器, 能进行任务切换, 信号量管理.」· 汇编 代码 · 共 143 行

ASM
143
字号
;*************************************************************************
;                                 uC/OS-16
;                           The Real-Time Kernel
;                                  MCS51
; File  : OS_CPU_A.asm
; By    : Zhang Xian
; Date  : 2006-11-26
;*************************************************************************

#include  "OS_CFG.h"

Seg_OS_CPU_A  SEGMENT CODE

           RSEG   Seg_OS_CPU_A
;*************************************************************************
;                       PUBLIC AND EXTERNAL DECLARATIONS
;*************************************************************************
           EXTRN  DATA (OSTaskID       )
           EXTRN  DATA (OSNextTaskID   )
           EXTRN  DATA (OSIntNesting   )
           EXTRN  DATA (OSIdleCnt      )
           EXTRN  DATA (OSISRStack     )
           EXTRN  DATA (OSStackPtr     )
;*************************************************************************
PUSHALL    MACRO
           PUSH   ACC
           PUSH   B
           PUSH   DPH
           PUSH   DPL
           PUSH   PSW
           PUSH   0       ; INC SP ; MOV  [SP], R0
           PUSH   1
           PUSH   2
           PUSH   3
           PUSH   4
           PUSH   5
           PUSH   6
           PUSH   7
           ENDM

POPALL     MACRO
           POP    7
           POP    6
           POP    5
           POP    4
           POP    3
           POP    2
           POP    1
           POP    0       ; MOV  R0, [SP];  DEC  SP
           POP    PSW
           POP    DPL
           POP    DPH
           POP    B
           POP    ACC
           ENDM
;*************************************************************************
SaveTaskSP MACRO
           MOV       A,   OSTaskID
           ADD       A,   #OSStackPtr
           MOV       R0,  A
           MOV       @R0, SP
           ENDM
;*************************************************************************
LoadTaskSP MACRO
           MOV       A,   OSTaskID
           CJNE      A,   #OS_MAX_TASKS,  __Normal_task
OS_Idle:
           inc       OSIdleCnt
           mov       SP,   #OSISRStack-1
           setb      EA
           ORL       PCON, #0x01
           ajmp      OS_Idle
           
__Normal_task:
           MOV       A,   OSTaskID
           ADD       A,   #OSStackPtr
           MOV       R0,  A
           MOV       SP,  @R0
           ENDM
;*************************************************************************
;*** void  OSIntEnter( void );
;*************************************************************************
           PUBLIC    OSIntEnter
OSIntEnter:
           MOV       OSIntNesting, #1
           POP       OSISRStack + 1
           POP       OSISRStack
           MOV       A,   #OS_MAX_TASKS-2
           CLR       C
           SUBB      A,   OSTaskID
           JC        __OS_Idle_No_Save
           SaveTaskSP
__OS_Idle_No_Save:
           MOV       SP,  #OSISRStack + 1
           RET
;********************************************************************************************************
;                                     TASK LEVEL CONTEXT SWITCH
;
; Description: This function is called by OS_Sched() to perform a task level context switch.
;
;********************************************************************************************************
           PUBLIC    OSCtxSw
           PUBLIC    OSIntCtxSw
OSCtxSw:
           MOV       A, OSIntNesting
           CJNE      A, #0, OSIntCtxSw
           CLR       EA
           PUSHALL
           SaveTaskSP
OSIntCtxSw:
           CLR       EA
           mov       A, OSNextTaskID
           mov       OSTaskID, A
;*************************************************************************
;*** void  OSIntExit(void);
;*************************************************************************
           PUBLIC    OSIntExit
OSIntExit:
           CLR       A
           mov       OSIntNesting, A
           LoadTaskSP
           POPALL
           SETB      EA
           RETI
;********************************************************************************************************
;*** unsigned char FindBitNum(OS_SIZE OSBitTaskS);
;********************************************************************************************************
           PUBLIC    _FindBitNum
_FindBitNum:
           clr       A
           xch       A, R7
           setb      C
__Scan_Next_Bit:
           rrc       A
           jc        __Found_BitNum
           inc       R7
           ajmp      __Scan_Next_Bit
__Found_BitNum:
           ret
;********************************************************************************************************
           END
;********************************************************************************************************

⌨️ 快捷键说明

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