📄 rtx51tny.a51
字号:
SETB C
SUBB A,R7
JC ?C0020
INC SP
INC SP
?C0020:
; while (i > no) {
MOV A,R6
SETB C
SUBB A,R7
JC ?C0021
; p1 = i == current ? SP : STKP[i+1];
MOV A,#?RTX?TASKSP?S
ADD A,R6
MOV R0,A
INC R0
MOV A,@R0
MOV R1,A
MOV A,R6
CJNE A,?RTX_CURRENTTASK,?C0022
MOV R1,SP
?C0022:
; STKP[i] += 2;
DEC R0
INC @R0
INC @R0
; p2 = STKP[i];
MOV A,@R0
MOV R5,A
?C0024:
; while (p1 != p2) {
MOV A,R5
XRL A,R1
JZ ?C0025
; DBYTE[p1] = DBYTE[p1-2];
DEC R1
DEC R1
MOV A,@R1
INC R1
INC R1
MOV @R1,A
; p1--;
DEC R1
; }
SJMP ?C0024
?C0025:
; i--;
DEC R6
; }
SJMP ?C0020
?C0021:
;
; DWORD[STKP[no]] = ENTRY[no];
MOV A,R7
ADD A,#?RTX?TASKSP?S
MOV R0,A
MOV A,@R0
INC A
MOV R0,A
MOV A,R7
ADD A,R7
INC A
MOV DPTR,#?RTX?TASKENT?S
MOVC A,@A+DPTR
MOV @R0,A
INC R0
MOV A,R7
ADD A,R7
MOVC A,@A+DPTR
MOV @R0,A
; return (0);
MOV R7,#0
; }
RET
; os_wait (uchar typ, uchar timeout) {
_os_wait:
_OS_wait1: ; entry point for 1 parameter
_OS_wait2: ; entry point for 2 parameters
; uchar st = 0;
;---- Variable 'typ' assigned to Register 'R7' ----
;---- Variable 'timeout' assigned to Register 'R5' ----
;---- Variable 'st' assigned to Register 'R6' ----
MOV R6,#0FFH
;
;
MOV A,?RTX_CURRENTTASK
RL A
ADD A,#?RTX?TASKSTATE?S+1
MOV R0,A
; if (typ == 0) goto no_wait;
MOV A,R7
JZ no_wait
;
; if (typ & K_IVL) {
CLR ET0
JNB ACC.B_INTERVAL,??C0005
DEC R0
; STATE[current].timer += timeout;
MOV A,@R0
JZ ??C0006_
ADD A,R5
MOV @R0,A
; if (!CY) {
JZ ??C0006a ; zero means no wait
JC ??C0006
; st = TMO_EVENT;
??C0006a: MOV R6,#TMO_EVENT
; goto no_wait;
INC R0
SJMP no_wait;
; }
??C0006_:
MOV A,R5
MOV @R0,A
??C0006:
INC R0
; STATE[current].st |= K_TMO;
CLR EA
MOV A,@R0
ORL A,#K_TMO
MOV @R0,A
SETB EA
; }
??C0005:
; if (typ & K_TMO) {
MOV A,R7
JNB ACC.B_WAITTIM,??C0007
; if (timeout == 0) {
MOV A,R5
JNZ ??C0008
; st = TMO_EVENT;
MOV R6,#TMO_EVENT
; goto no_wait;
SJMP no_wait
; }
??C0008:
DEC R0
; STATE[current].timer = timeout;
MOV @R0,A
; STATE[current].st |= K_TMO;
INC R0
CLR EA
MOV A,@R0
ORL A,#K_TMO
MOV @R0,A
SETB EA
; }
??C0007:
; if (typ & K_SIG) {
MOV A,R7
JNB ACC.B_WAITSIG,??C0003
; if (STATE[current].st & SIG_EVENT) {
CLR EA
MOV A,@R0
JNB ACC.B_SIGNAL,??C0004
SETB EA
; st = SIG_EVENT;
MOV R6,#SIG_EVENT
; goto no_wait;
SJMP no_wait
; }
??C0004:
; STATE[current].st |= K_SIG;
ORL A,#K_SIG
ANL A,#NOT K_READY
MOV @R0,A
SETB EA
SJMP ??C0003A
; }
??C0003:
; switchnow (); /* Select Another Task */
CLR EA
MOV A,@R0
ANL A,#NOT K_READY
MOV @R0,A
SETB EA
??C0003A: SETB ET0
JMP SwitchNow
no_wait:
; STATE[current].st &= ~ (st | K_SIG | K_TMO);
; return (st);
MOV A,R6
MOV R7,A
ORL A,#K_SIG + K_TMO
CPL A
CLR EA
ANL A,@R0
MOV @R0,A
SETB EA
SETB ET0
RET
; }
_OS_send_signal:
_isr_send_signal:
; os_send_signal (uchar taskid) {
; uchar data *p;
;---- Variable 'taskid' assigned to Register 'R7' ----
;---- Variable 'p' assigned to Register 'R0' ----
; if (no > MAXTASKN) return (0xff);
MOV A,R7
SETB C
SUBB A,#?RTX_MAXTASKN
JC ??C0010
MOV R7,#0FFH
RET
??C0010:
; p = &STATE[taskid].st;
MOV A,R7
RL A
ADD A,#?RTX?TASKSTATE?S+1
MOV R0,A
CLR EA
MOV A,@R0
;
; if (*p & K_ACTIVE) {
JNB ACC.B_ACTIVE,?C0026
; if (*p & K_SIG) *p |= K_READY;
JNB ACC.B_WAITSIG,?C0026
SETB ACC.B_READY
; }
?C0026:
; *p |= SIG_EVENT;
SETB ACC.B_SIGNAL
XCH A,@R0
SETB EA
JB ACC.B_SIGNAL,SIG_PENDING
MOV R7,#0
RET
SIG_PENDING: MOV R7,#1
RET
; }
_OS_clear_signal:
; os_clear_signal (uchar taskid) {
; uchar data *p;
;---- Variable 'taskid' assigned to Register 'R7' ----
;---- Variable 'p' assigned to Register 'R0' ----
; if (no > MAXTASKN) return (0xff);
MOV A,R7
SETB C
SUBB A,#?RTX_MAXTASKN
JC _??C0010
MOV R7,#0FFH
RET
_??C0010:
; p = &STATE[taskid].st;
MOV A,R7
RL A
ADD A,#?RTX?TASKSTATE?S+1
MOV R0,A
CLR EA
MOV A,@R0
; *p &= SIG_EVENT;
CLR ACC.B_SIGNAL
XCH A,@R0
SETB EA
JB ACC.B_SIGNAL,_SIG_PENDING
MOV R7,#0
RET
_SIG_PENDING: MOV R7,#1
RET
; }
; uchar os_delete (uchar no) {
; uchar i;
; uchar last, first, check;
;
_OS_delete_task:
;---- Variable 'first' assigned to Register 'R1' ----
;---- Variable 'last' assigned to Register 'R5' ----
;---- Variable 'check' assigned to Register 'R4' ----
;---- Variable 'no' assigned to Register 'R7' ----
; if (no > MAXTASKN) return (0xff);
MOV A,R7
SETB C
SUBB A,#?RTX_MAXTASKN
JC ?C0030
?C0032: MOV R7,#0FFH
RET
?C0030:
; if (!(STATE[no].st & K_ACTIVE)) return (0xff);
MOV A,R7
RL A
ADD A,#?RTX_TASKSTATUS+1
MOV R0,A
MOV A,@R0
JNB ACC.B_ACTIVE,?C0032
; STATE[no].st &= ~(K_ACTIVE | K_READY | K_SIG | K_TMO | K_ROBIN);
CLR EA
MOV A,@R0
ANL A,#NOT (K_ACTIVE+K_READY+K_SIG+K_TMO+K_ROBIN)
MOV @R0,A
SETB EA
; if (current == no) {
MOV A,?RTX_CURRENTTASK
CJNE A,AR7,?C0033
; SP = STKP[no];
MOV A,#?RTX_TASKSP
ADD A,R7
MOV R0,A
MOV A,@R0
MOV SP,A
; switchnow ();
LJMP switchnow
; }
?C0033:
; if (current < no) {
JNC ?C0034
; last = (no == MAXTASKN) ? STACKTOP : STKP[no+1];
MOV A,#?RTX_TASKSP+1
ADD A,R7
MOV R0,A
MOV A,@R0
CJNE R7,#?RTX_MAXTASKN,?C0035
MOV A,#?RTX_RAMTOP
?C0035:
MOV R5,A
; first = STKP[no];
DEC R0
MOV A,@R0
MOV R1,A
?C0039:
; do {
; check = STKP[no];
MOV A,#?RTX_TASKSP
ADD A,R7
MOV R0,A
MOV R3,A ; save @STKP
MOV A,@R0
MOV R4,A
; while (first != check) {
?C0040:
MOV A,R1
XRL A,R4
JZ ?C0037
; DBYTE[last] = DBYTE[first];
; SOURCE LINE # 186
MOV R0,AR5
MOV A,@R1
MOV @R0,A
; last--;
DEC R5
; first--;
DEC R1
; }
SJMP ?C0040
?C0037:
; STKP[no] = last;
MOV R0,AR3 ; restore @STKP
MOV @R0,AR5
; no--;
DEC R7
; } while (current != no);
MOV A,?RTX_CURRENTTASK
CJNE A,AR7,?C0039
; return (0);
MOV R7,#0
RET
; }
?C0034:
; if (current > no) {
; last = STKP[no+1];
MOV A,#?RTX_TASKSP+1
ADD A,R7
MOV R0,A
MOV A,@R0
MOV R5,A
; first = STKP[no];
DEC R0
MOV AR1,@R0
?C0045:
; do {
; no++;
INC R7
; STKP[no] = first;
MOV A,#?RTX_TASKSP
ADD A,R7
MOV R0,A
MOV @R0,AR1
; check = (no == current) ? SP : STKP[no+1];
INC R0
MOV AR4,@R0
MOV A,?RTX_CURRENTTASK
CJNE A,AR7,?C0046
MOV R4,SP
?C0046:
; while (last != check) {
MOV A,R5
XRL A,R4
JZ ?C0043
; last++;
INC R5
; first++;
INC R1
; DBYTE[first] = DBYTE[last];
MOV R0,AR5
MOV A,@R0
MOV @R1,A
; }
SJMP ?C0046
; } while (current != no);
?C0043:
MOV A,?RTX_CURRENTTASK
CJNE A,AR7,?C0045
; SP = first;
MOV SP,R1
; return (0);
MOV R7,#0
; }
;}
?C0031:
RET
; Start RTX-51 Tiny Kernal
EXTRN CODE (?C_STARTUP)
PUBLIC MAIN
MAIN: MOV R0,#?RTX?TASKSP?S
MOV @R0,SP
MOV A,#?RTX_MAXTASKN
JZ main2
MOV R7,A
main1: INC R0
MOV @R0,#?RTX_RAMTOP
DJNZ R7,main1
main2: MOV R7,#?RTX_MAXTASKN+1
CLR A
MOV R0,#?RTX?TASKSTATE?S
main1x: MOV @R0,A
INC R0
MOV @R0,A
INC R0
DJNZ R7,main1x
MOV R0,#?RTX?TASKSTATE?S+1
MOV @R0,#K_ACTIVE+K_READY
MOV DPTR,#?RTX?TASKENT?S
MOV A,#1
MOVC A,@A+DPTR
PUSH ACC
CLR A
MOVC A,@A+DPTR
PUSH ACC
MOV ?RTX_RobinTime,#LOW ?RTX_TIMESHARING
ORL TMOD,#01H ; Timer 0 Mode 1
MOV TL0,#LOW (?RTX_CLOCK)
MOV TH0,#HIGH (?RTX_CLOCK)
SETB TR0
SETB EA
SETB ET0
RET ; Start Task 0
os_running_task_id:
MOV R7,?RTX_CURRENTTASK
RET
?RTX_TASKIDX: DB ?RTX_MAXTASKN ; for Debugging
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -