📄 os_time.src
字号:
LCALL ?C?ULDIV
POP AR3
POP AR2
POP AR1
POP AR0
MOV A,R3
ADD A,R7
MOV R7,A
MOV A,R2
ADDC A,R6
MOV R6,A
MOV A,R1
ADDC A,R5
MOV R5,A
MOV A,R0
ADDC A,R4
MOV R4,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
LCALL ?C?LSTXDATA
; loops = ticks / 65536L; /* Compute the integral number of 65536 tick delays */
; SOURCE LINE # 95
CLR A
MOV R3,A
MOV R2,A
MOV R1,#01H
MOV R0,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
LCALL ?C?ULDIV
MOV DPTR,#04H
LCALL ?C?XBPOFF
MOV A,R6
MOVX @DPTR,A
INC DPTR
MOV A,R7
MOVX @DPTR,A
; ticks = ticks % 65536L; /* Obtain the fractional number of ticks */
; SOURCE LINE # 96
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
PUSH DPH
PUSH DPL
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
CLR A
MOV R5,A
MOV R4,A
POP DPL
POP DPH
LCALL ?C?LSTXDATA
; OSTimeDly(ticks);
; SOURCE LINE # 97
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
LCALL _?OSTimeDly
?C0010:
; while (loops > 0) {
; SOURCE LINE # 98
MOV DPTR,#04H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
SETB C
SUBB A,#00H
MOV A,R6
SUBB A,#00H
JC ?C0011
; OSTimeDly(32768);
; SOURCE LINE # 99
MOV R6,#080H
MOV R7,#00H
LCALL _?OSTimeDly
; OSTimeDly(32768);
; SOURCE LINE # 100
MOV R6,#080H
MOV R7,#00H
LCALL _?OSTimeDly
; loops--;
; SOURCE LINE # 101
MOV DPTR,#04H
LCALL ?C?XBPOFF
MOV A,#0FFH
MOV B,A
LCALL ?C?IILDX
; }
; SOURCE LINE # 102
SJMP ?C0010
?C0011:
; return (OS_NO_ERR);
; SOURCE LINE # 103
MOV R7,#00H
SJMP ?C0007
; } else {
; SOURCE LINE # 104
?C0004:
; return (OS_TIME_ZERO_DLY);
; SOURCE LINE # 105
MOV R7,#054H
; }
; SOURCE LINE # 106
; }
; SOURCE LINE # 107
?C0007:
MOV DPTR,#0BH
LJMP ?C?ADDXBP
; END OF _?OSTimeDlyHMSM
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * RESUME A DELAYED TASK
; *
; * Description: This function is used resume a task that has been delayed through a call to either
; * OSTimeDly() or OSTimeDlyHMSM(). Note that you MUST NOT call this function to resume a
; * task that is waiting for an event with timeout. This situation would make the task look
; * like a timeout occurred (unless you desire this effect). Also, you cannot resume a task
; * that has called OSTimeDlyHMSM() with a combined time that exceeds 65535 clock ticks. In
; * other words, if the clock tick runs at 100 Hz then, you will not be able to resume a
; * delayed task that called OSTimeDlyHMSM(0, 10, 55, 350) or higher.
; *
; * (10 Minutes * 60 + 55 Seconds + 0.35) * 100 ticks/second.
; *
; * Arguments : prio specifies the priority of the task to resume
; *
; * Returns : OS_NO_ERR Task has been resumed
; * OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed
; * (i.e. >= OS_LOWEST_PRIO)
; * OS_TIME_NOT_DLY Task is not waiting for time to expire
; * OS_TASK_NOT_EXIST The desired task has not been created
; *********************************************************************************************************
; */
;
; INT8U OSTimeDlyResume (INT8U prio) reentrant
RSEG ?PR?_?OSTimeDlyResume?OS_TIME
_?OSTimeDlyResume:
USING 0
; SOURCE LINE # 133
MOV DPTR,#0FFFFH
LCALL ?C?ADDXBP
MOV A,R7
MOVX @DPTR,A
MOV DPTR,#0FFFDH
LCALL ?C?ADDXBP
; {
; OS_TCB *ptcb;
;
;
; if (prio >= OS_LOWEST_PRIO) {
; SOURCE LINE # 138
MOV DPTR,#03H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R6,A
CLR C
SUBB A,#01CH
JC ?C0013
; return (OS_PRIO_INVALID);
; SOURCE LINE # 139
MOV R7,#02AH
LJMP ?C0014
; }
; SOURCE LINE # 140
?C0013:
; OS_ENTER_CRITICAL();
; SOURCE LINE # 141
CLR EA
; ptcb = (OS_TCB *)OSTCBPrioTbl[prio]; /* Make sure that task exist */
; SOURCE LINE # 142
MOV A,R6
MOV B,#03H
MUL AB
ADD A,#LOW (OSTCBPrioTbl)
MOV DPL,A
CLR A
ADDC A,#HIGH (OSTCBPrioTbl)
MOV DPH,A
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
XCH A,R1
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
; if (ptcb != (OS_TCB *)0) {
; SOURCE LINE # 143
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
ORL A,R2
ORL A,R3
JNZ $ + 5H
LJMP ?C0015
; if (ptcb->OSTCBDly != 0) { /* See if task is delayed */
; SOURCE LINE # 144
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
MOV DPTR,#09H
LCALL ?C?ILDOPTR
ORL A,B
JZ ?C0016
; ptcb->OSTCBDly = 0; /* Clear the time delay */
; SOURCE LINE # 145
MOV DPTR,#09H
CLR A
MOV B,A
LCALL ?C?ISTOPTR
; if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) { /* See if task is ready to run */
; SOURCE LINE # 146
MOV DPTR,#0BH
LCALL ?C?CLDOPTR
JB ACC.3,?C0017
; OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */
; SOURCE LINE # 147
MOV DPTR,#OSRdyGrp
MOVX A,@DPTR
MOV R7,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
MOV DPTR,#010H
LCALL ?C?CLDOPTR
MOV R6,A
MOV A,R7
ORL A,R6
MOV DPTR,#OSRdyGrp
MOVX @DPTR,A
; OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
; SOURCE LINE # 148
MOV DPTR,#0EH
LCALL ?C?CLDOPTR
ADD A,#LOW (OSRdyTbl)
MOV DPL,A
CLR A
ADDC A,#HIGH (OSRdyTbl)
MOV DPH,A
PUSH DPH
PUSH DPL
MOVX A,@DPTR
MOV R7,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
MOV DPTR,#0FH
LCALL ?C?CLDOPTR
MOV R6,A
MOV A,R7
ORL A,R6
POP DPL
POP DPH
MOVX @DPTR,A
; OS_EXIT_CRITICAL();
; SOURCE LINE # 149
SETB EA
; OSSched(); /* See if this is new highest priority */
; SOURCE LINE # 150
LCALL _?OSSched
; } else {
; SOURCE LINE # 151
SJMP ?C0018
?C0017:
; OS_EXIT_CRITICAL(); /* Task may be suspended */
; SOURCE LINE # 152
SETB EA
; }
; SOURCE LINE # 153
?C0018:
; return (OS_NO_ERR);
; SOURCE LINE # 154
MOV R7,#00H
SJMP ?C0014
; } else {
; SOURCE LINE # 155
?C0016:
; OS_EXIT_CRITICAL();
; SOURCE LINE # 156
SETB EA
; return (OS_TIME_NOT_DLY); /* Indicate that task was not delayed */
; SOURCE LINE # 157
MOV R7,#050H
SJMP ?C0014
; }
; SOURCE LINE # 158
; } else {
; SOURCE LINE # 159
?C0015:
; OS_EXIT_CRITICAL();
; SOURCE LINE # 160
SETB EA
; return (OS_TASK_NOT_EXIST); /* The task does not exist */
; SOURCE LINE # 161
MOV R7,#0BH
; }
; SOURCE LINE # 162
; }
; SOURCE LINE # 163
?C0014:
MOV DPTR,#04H
LJMP ?C?ADDXBP
; END OF _?OSTimeDlyResume
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * GET CURRENT SYSTEM TIME
; *
; * Description: This function is used by your application to obtain the current value of the 32-bit
; * counter which keeps track of the number of clock ticks.
; *
; * Arguments : none
; *
; * Returns : The current value of OSTime
; *********************************************************************************************************
; */
;
; INT32U OSTimeGet (void) reentrant
RSEG ?PR?_?OSTimeGet?OS_TIME
_?OSTimeGet:
USING 0
; SOURCE LINE # 178
MOV DPTR,#0FFFCH
LCALL ?C?ADDXBP
; {
; INT32U ticks;
;
;
; OS_ENTER_CRITICAL();
; SOURCE LINE # 183
CLR EA
; ticks = OSTime;
; SOURCE LINE # 184
MOV DPTR,#OSTime
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
LCALL ?C?LSTXDATA
; OS_EXIT_CRITICAL();
; SOURCE LINE # 185
SETB EA
; return (ticks);
; SOURCE LINE # 186
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
; }
; SOURCE LINE # 187
?C0021:
MOV DPTR,#04H
LJMP ?C?ADDXBP
; END OF _?OSTimeGet
;
; /*
; *********************************************************************************************************
; * SET SYSTEM CLOCK
; *
; * Description: This function sets the 32-bit counter which keeps track of the number of clock ticks.
; *
; * Arguments : ticks specifies the new value that OSTime needs to take.
; *
; * Returns : none
; *********************************************************************************************************
; */
;
; void OSTimeSet (INT32U ticks) reentrant
RSEG ?PR?_?OSTimeSet?OS_TIME
_?OSTimeSet:
USING 0
; SOURCE LINE # 201
MOV DPTR,#0FFFCH
LCALL ?C?ADDXBP
LCALL ?C?LSTXDATA
; {
; OS_ENTER_CRITICAL();
; SOURCE LINE # 203
CLR EA
; OSTime = ticks;
; SOURCE LINE # 204
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
MOV DPTR,#OSTime
LCALL ?C?LSTXDATA
; OS_EXIT_CRITICAL();
; SOURCE LINE # 205
SETB EA
; }
; SOURCE LINE # 206
MOV DPTR,#04H
LJMP ?C?ADDXBP
; END OF _?OSTimeSet
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -