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 + -
显示快捷键?