📄 os_cpu_a.asm
字号:
/*************************************************************************
* Point RTOS(51) *
* The Real-Time Kernel(For Keil c51) *
* *
* (c) Copyright 2005, PenGH *
* All Rights Reserved *
* *
* V0.9.1 *
* *
* File : OS_CPU_A.ASM *
* Author : 彭光红 *
* History : *
* 2005/08 By PenGH *
*************************************************************************/
/*----------------------------------------------------------------------*/
#include "..\include\OS_CFG.H"
#define SP_ADD_BYTE 2
NAME OS_CPU_A
?PR?TimeInt0?OS_CPU_A SEGMENT CODE
?PR?OSCtxSw?OS_CPU_A SEGMENT CODE
?PR?_OSTaskStkInit?OS_CPU_A SEGMENT CODE
EXTRN CODE (OSMapTbl)
EXTRN DATA (OSTaskID)
EXTRN DATA (OSNextTaskID)
EXTRN DATA (OSTaskStackBotton)
EXTRN DATA (OSWaitTick)
EXTRN DATA (OSTaskRuning)
PUBLIC TimeInt0
PUBLIC _OSTaskStkInit
PUBLIC OSCtxSw
PUBLIC STACK
;*************************************************************************
; 堆栈空间定义
?STACK SEGMENT IDATA
RSEG ?STACK
STACK: ;堆栈
DS 1
CSEG AT 000BH
LJMP TimeInt0
/*定时器中断使用函数*/
RSEG ?PR?TimeInt0?OS_CPU_A
TimeInt0:
USING 0
PUSH AR2
PUSH AR1
PUSH AR0
PUSH ACC
MOV TL0,#0BFH
MOV TH0,#0FCH
MOV R2,#(OS_MAX_TASKS+1)
MOV A,#OSWaitTick
MOV R0,A
MOV R1,#1
TimeInt0Loop:
MOV A,@R0
JZ TimeInt00
DEC A
MOV @R0,A
JNZ TimeInt00
MOV A,OSTaskRuning
CLR C
ADD A,R1;
MOV OSTaskRuning,A
TimeInt00:
INC R0
MOV A,R1
RL A
MOV R1,A
DJNZ R2,TimeInt0Loop
TimeInt0Ret:
POP ACC
POP AR0
POP AR1
POP AR2
reti
;*************************************************************************
;
; MODEL NAME : OSTaskStkInit
; DESCRIPTION : 任务堆栈初始
;
;*************************************************************************
RSEG ?PR?_OSTaskStkInit?OS_CPU_A
_OSTaskStkInit:
; MOV A,#LOW (OSTaskStackBotton+1) ;取得任务栈底
; ADD A,R3;
; MOV R1,A; //将指针保存到R1;
; CJNE R3,#OS_MAX_TASKS,StkInit0
; SJMP StkInit2
;StkInit0:
; MOV A,#OS_MAX_TASKS
; CLR C
; SUBB A,R3
; MOV R2,A
;
;StkInit1:
; MOV A,#SP_ADD_BYTE
; ADD A,@R1;
; MOV @R1,A
; INC R1;
; DJNZ R2,StkInit1;
StkInit2:
MOV A,SP;
MOV R0,A
CLR C
ADD A,#SP_ADD_BYTE
MOV SP,A
MOV R1,A
MOV R2,#(SP_ADD_BYTE+2)
MovData:
MOV A,@R0;
MOV @R1,A
DEC R1
DEC R0
DJNZ R2,MovData;
MOV A,R6
MOV @R1,A
MOV A,R7
DEC R1
MOV @R1,A
ret
;*************************************************************************
;
; MODEL NAME : OSCtxSW
; DESCRIPTION : 任务切换,放弃CPU并保存环境
;
;*************************************************************************
RSEG ?PR?OSCtxSw?OS_CPU_A
OSCtxSw:
CLR C
MOV A,OSNextTaskID
SUBB A,OSTaskID
JC StkMov0
LJMP StkMov1
StkMov0:
CPL A
INC A
MOV R6,A
MOV A,#LOW (OSTaskStackBotton+1) ;取得下个下级任务的堆栈地址
CLR C
ADD A,OSNextTaskID;
MOV R1,A
MOV A,@R1
MOV R4,A ;
MOV A,SP
DEC A
MOV R0,A
DEC R0
CLR C
SUBB A,R4
MOV R2,A
MOV R3,A
MOV A,#LOW (OSTaskStackBotton+1) ;取得当前下级任务的堆栈地址
CLR C
ADD A,OSTaskID;
MOV R1,A
MOV A,@R1
DEC A
MOV R1,A ;
SUBB A,R0
MOV R5,A
ONE:
MOV A,@R0
MOV @R1,A
DEC R0
DEC R1
DJNZ R2,ONE
MOV A,SP
MOV R0,A
CLR C
SUBB A,R3
MOV SP,A
;;;;;;;;;;;;;;;;;
MOV R1,A
MOV A,@R0
MOV @R1,A
DEC R0
DeC R1
MOV A,@R0
MOV @R1,A
; MOV R2,#2
;TWO:
; MOV A,@R0
; MOV @R1,A
; DEC R1
; DEC R0
; DJNZ R2,TWO
;;;;;;;;;;;;;;
MOV A,#LOW (OSTaskStackBotton+1) ;取得下一个任务的下级堆栈地址
CLR C
ADD A,OSNextTaskID
MOV R1,A
MOVStkThree:
MOV A,@R1
CLR C
ADD A,R5
MOV @R1,A
INC R1
DJNZ R6,MOVStkThree
MOV OSTaskID,OSNextTaskID
ret
StkMov1:
MOV R6,A
MOV A,#LOW (OSTaskStackBotton+1) ;取得当前任务的下级堆栈地址
CLR C
ADD A,OSTaskID;
MOV R0,A
MOV A,@R0
MOV R3,A ;当前任务的堆栈
MOV A,#LOW (OSTaskStackBotton+1) ;取得下个任务的堆栈地址
CLR C
ADD A,OSNextTaskID;
MOV R1,A
MOV A,@R1
MOV R4,A ;
CLR C
SUBB A,R3
MOV R2,A
MOV R5,#2
MOV A,SP
MOV R1,A
CLR C
ADD A,R2
MOV SP,A
MOV R0,A
MOVStkFour: ;向后移动堆栈
MOV A,@R1
MOV @R0,A
DEC R0
DEC R1
DJNZ R5,MOVStkFour
MOV A,R4
DEC A
MOV R1,A
MOVStkFive: ;切换堆栈空间
MOV A,@R1
MOV @R0,A
DEC R1
DEC R0
DJNZ R2,MOVStkFive
MOV A,R1
CLR C
SUBB A,R0
MOV R5,A ;保存更新值即减数
MOV A,#LOW (OSTaskStackBotton+1) ;取得下个任务的堆栈地址
CLR C
ADD A,OSTaskID;
MOV R0,A
MOVStkSix:
MOV A,@R0
CLR C
SUBB A,R5
MOV @R0,A
INC R0
DJNZ R6,MOVStkSix
MOV OSTaskID,OSNextTaskID
ret
END
; The end of file ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -