📄 os_time.src
字号:
MOV A,R7
PUSH ACC
MOV DPTR,#milli?144
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
MOV A,R7
ADD A,#0AH
MOV R7,A
CLR A
ADDC A,R6
MOV R6,A
CLR A
RLC A
MOV R5,A
CLR A
RLC A
MOV R4,A
CLR A
MOV R3,#032H
MOV R2,A
MOV R1,A
MOV R0,A
LCALL ?C?LMUL
CLR A
MOV R3,#0E8H
MOV R2,#03H
MOV R1,A
MOV R0,A
LCALL ?C?ULDIV
POP ACC
MOV R3,A
POP ACC
MOV R2,A
POP ACC
MOV R1,A
POP ACC
MOV R0,A
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 DPTR,#ticks?145
LCALL ?C?LSTXDATA
; loops = (INT16U)(ticks / 65536L); /* Compute the integral number of 65536 tick delays */
; SOURCE LINE # 97
CLR A
MOV R3,A
MOV R2,A
MOV R1,#01H
MOV R0,A
MOV DPTR,#ticks?145
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,#loops?146
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 # 98
MOV DPTR,#ticks?145
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
MOV DPTR,#ticks?145
LCALL ?C?LSTXDATA
; OSTimeDly((INT16U)ticks);
; SOURCE LINE # 99
MOV DPTR,#ticks?145
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 # 100
SETB C
MOV DPTR,#loops?146+01H
MOVX A,@DPTR
SUBB A,#00H
MOV DPTR,#loops?146
MOVX A,@DPTR
SUBB A,#00H
JC ?C0011
; OSTimeDly(32768);
; SOURCE LINE # 101
MOV R7,#00H
MOV R6,#080H
LCALL _OSTimeDly
; OSTimeDly(32768);
; SOURCE LINE # 102
MOV R7,#00H
MOV R6,#080H
LCALL _OSTimeDly
; loops--;
; SOURCE LINE # 103
MOV DPTR,#loops?146+01H
MOVX A,@DPTR
ADD A,#0FFH
MOVX @DPTR,A
MOV DPTR,#loops?146
MOVX A,@DPTR
ADDC A,#0FFH
MOVX @DPTR,A
; }
; SOURCE LINE # 104
SJMP ?C0010
?C0011:
; return (OS_NO_ERR);
; SOURCE LINE # 105
MOV R7,#00H
RET
; }
; SOURCE LINE # 106
?C0004:
; return (OS_TIME_ZERO_DLY);
; SOURCE LINE # 107
MOV R7,#054H
; }
; SOURCE LINE # 108
?C0007:
RET
; END OF _OSTimeDlyHMSM
; #endif
; /*$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
; *********************************************************************************************************
; */
;
; #if OS_TIME_DLY_RESUME_EN > 0
; INT8U OSTimeDlyResume (INT8U prio)
RSEG ?PR?_OSTimeDlyResume?OS_TIME
_OSTimeDlyResume:
USING 0
; SOURCE LINE # 136
;---- Variable 'prio?247' assigned to Register 'R7' ----
; {
; SOURCE LINE # 137
;
; OS_TCB *ptcb;
;
;
; if (prio >= OS_LOWEST_PRIO) {
; SOURCE LINE # 142
MOV A,R7
CLR C
SUBB A,#0CH
JC ?C0012
; return (OS_PRIO_INVALID);
; SOURCE LINE # 143
MOV R7,#02AH
RET
; }
; SOURCE LINE # 144
?C0012:
; OS_ENTER_CRITICAL();
; SOURCE LINE # 145
CLR EA
; ptcb = (OS_TCB *)OSTCBPrioTbl[prio]; /* Make sure that task exist */
; SOURCE LINE # 146
MOV A,R7
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 DPTR,#ptcb?248
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 # 147
MOV DPTR,#ptcb?248
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
JZ ?C0014
; if (ptcb->OSTCBDly != 0) { /* See if task is delayed */
; SOURCE LINE # 148
MOV DPTR,#ptcb?248
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R1,A
MOV DPTR,#09H
LCALL ?C?ILDOPTR
ORL A,B
JZ ?C0015
; ptcb->OSTCBDly = 0; /* Clear the time delay */
; SOURCE LINE # 149
MOV DPTR,#09H
CLR A
MOV B,A
LCALL ?C?ISTOPTR
; if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* See if task is ready to run */
; SOURCE LINE # 150
MOV DPTR,#0BH
LCALL ?C?CLDOPTR
JB ACC.3,?C0016
; OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */
; SOURCE LINE # 151
MOV DPTR,#OSRdyGrp
MOVX A,@DPTR
MOV R7,A
MOV DPTR,#ptcb?248
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 # 152
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 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 # 153
SETB EA
; OS_Sched(); /* See if this is new highest priority */
; SOURCE LINE # 154
LCALL OS_Sched
; } else {
; SOURCE LINE # 155
SJMP ?C0017
?C0016:
; OS_EXIT_CRITICAL(); /* Task may be suspended */
; SOURCE LINE # 156
SETB EA
; }
; SOURCE LINE # 157
?C0017:
; return (OS_NO_ERR);
; SOURCE LINE # 158
MOV R7,#00H
RET
; } else {
; SOURCE LINE # 159
?C0015:
; OS_EXIT_CRITICAL();
; SOURCE LINE # 160
SETB EA
; return (OS_TIME_NOT_DLY); /* Indicate that task was not delayed */
; SOURCE LINE # 161
MOV R7,#050H
RET
; }
; SOURCE LINE # 162
; }
; SOURCE LINE # 163
?C0014:
; OS_EXIT_CRITICAL();
; SOURCE LINE # 164
SETB EA
; return (OS_TASK_NOT_EXIST); /* The task does not exist */
; SOURCE LINE # 165
MOV R7,#0BH
; }
; SOURCE LINE # 166
?C0013:
RET
; END OF _OSTimeDlyResume
; #endif
; /*$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
; *********************************************************************************************************
; */
;
; #if OS_TIME_GET_SET_EN > 0
; INT32U OSTimeGet (void)
RSEG ?PR?OSTimeGet?OS_TIME
OSTimeGet:
USING 0
; SOURCE LINE # 183
; {
; SOURCE LINE # 184
;
; INT32U ticks;
;
;
; OS_ENTER_CRITICAL();
; SOURCE LINE # 189
CLR EA
; ticks = OSTime;
; SOURCE LINE # 190
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
;---- Variable 'ticks?349' assigned to Register 'R4/R5/R6/R7' ----
; OS_EXIT_CRITICAL();
; SOURCE LINE # 191
SETB EA
; return (ticks);
; SOURCE LINE # 192
; }
; SOURCE LINE # 193
?C0019:
RET
; END OF OSTimeGet
; #endif
;
; /*
; *********************************************************************************************************
; * 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
; *********************************************************************************************************
; */
;
; #if OS_TIME_GET_SET_EN > 0
; void OSTimeSet (INT32U ticks)
RSEG ?PR?_OSTimeSet?OS_TIME
_OSTimeSet:
USING 0
; SOURCE LINE # 209
;---- Variable 'ticks?450' assigned to Register 'R4/R5/R6/R7' ----
; {
; SOURCE LINE # 210
;
;
;
; OS_ENTER_CRITICAL();
; SOURCE LINE # 214
CLR EA
; OSTime = ticks;
; SOURCE LINE # 215
MOV DPTR,#OSTime
LCALL ?C?LSTXDATA
; OS_EXIT_CRITICAL();
; SOURCE LINE # 216
SETB EA
; }
; SOURCE LINE # 217
RET
; END OF _OSTimeSet
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -