os_time.s
来自「将本站的UCOSFORAVR128V276版本升级到了280版」· S 代码 · 共 648 行 · 第 1/2 页
S
648 行
ldi R20,255
ldi R21,255
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
and R2,R20
and R3,R21
and R4,R22
and R5,R23
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 116
; OSTimeDly((INT16U)ticks);
movw R30,R28
ldd R16,z+0
ldd R17,z+1
xcall _OSTimeDly
xjmp L8
L7:
.dbline 117
.dbline 118
ldi R16,32768
ldi R17,128
xcall _OSTimeDly
.dbline 119
ldi R16,32768
ldi R17,128
xcall _OSTimeDly
.dbline 120
movw R24,R10
sbiw R24,1
movw R10,R24
.dbline 121
L8:
.dbline 117
; while (loops > 0) {
tst R10
brne L7
tst R11
brne L7
X2:
.dbline 122
; OSTimeDly((INT16U)32768u);
; OSTimeDly((INT16U)32768u);
; loops--;
; }
; return (OS_NO_ERR);
clr R16
.dbline -2
L6:
adiw R28,4
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym l ticks 0 l
.dbsym r loops 10 i
.dbsym l milli 14 i
.dbsym l seconds 12 c
.dbsym r minutes 12 c
.dbsym r hours 10 c
.dbend
.dbfunc e OSTimeDlyResume _OSTimeDlyResume fc
.dbstruct 0 8 os_event
.dbfield 0 OSEventType c
.dbfield 1 OSEventPtr pV
.dbfield 3 OSEventCnt i
.dbfield 5 OSEventGrp c
.dbfield 6 OSEventTbl A[2:2]c
.dbend
.dbstruct 0 18 os_tcb
.dbfield 0 OSTCBStkPtr pc
.dbfield 2 OSTCBNext pS[os_tcb]
.dbfield 4 OSTCBPrev pS[os_tcb]
.dbfield 6 OSTCBEventPtr pS[os_event]
.dbfield 8 OSTCBDly i
.dbfield 10 OSTCBStat c
.dbfield 11 OSTCBPendTO c
.dbfield 12 OSTCBPrio c
.dbfield 13 OSTCBX c
.dbfield 14 OSTCBY c
.dbfield 15 OSTCBBitX c
.dbfield 16 OSTCBBitY c
.dbfield 17 OSTCBDelReq c
.dbend
; cpu_sr -> R20
; ptcb -> R22,R23
; prio -> R22
.even
_OSTimeDlyResume::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 153
; }
; #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 can call this function to resume a
; * task that is waiting for an event with timeout. This would make the task look
; * like a timeout occurred.
; *
; * 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 or has been assigned to a Mutex.
; *********************************************************************************************************
; */
;
; #if OS_TIME_DLY_RESUME_EN > 0
; INT8U OSTimeDlyResume (INT8U prio)
; {
.dbline 156
; OS_TCB *ptcb;
; #if OS_CRITICAL_METHOD == 3 /* Storage for CPU status register */
; OS_CPU_SR cpu_sr = 0;
clr R20
.dbline 161
; #endif
;
;
;
; if (prio >= OS_LOWEST_PRIO) {
cpi R22,8
brlo L11
.dbline 161
.dbline 162
; return (OS_PRIO_INVALID);
ldi R16,42
xjmp L10
L11:
.dbline 164
; }
; OS_ENTER_CRITICAL();
xcall _OS_CPU_SR_Save
mov R20,R16
.dbline 165
; ptcb = OSTCBPrioTbl[prio]; /* Make sure that task exist */
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_OSTCBPrioTbl
ldi R25,>_OSTCBPrioTbl
add R30,R24
adc R31,R25
ldd R22,z+0
ldd R23,z+1
.dbline 166
; if (ptcb == (OS_TCB *)0) {
cpi R22,0
cpc R22,R23
brne L13
X3:
.dbline 166
.dbline 167
; OS_EXIT_CRITICAL();
mov R16,R20
xcall _OS_CPU_SR_Restore
.dbline 168
; return (OS_TASK_NOT_EXIST); /* The task does not exist */
ldi R16,11
xjmp L10
L13:
.dbline 170
; }
; if (ptcb == (OS_TCB *)1) {
cpi R22,1
ldi R30,0
cpc R23,R30
brne L15
.dbline 170
.dbline 171
; OS_EXIT_CRITICAL();
mov R16,R20
xcall _OS_CPU_SR_Restore
.dbline 172
; return (OS_TASK_NOT_EXIST); /* The task does not exist */
ldi R16,11
xjmp L10
L15:
.dbline 174
; }
; if (ptcb->OSTCBDly == 0) { /* See if task is delayed */
movw R30,R22
ldd R2,z+8
ldd R3,z+9
tst R2
brne L17
tst R3
brne L17
X4:
.dbline 174
.dbline 175
; OS_EXIT_CRITICAL();
mov R16,R20
xcall _OS_CPU_SR_Restore
.dbline 176
; return (OS_TIME_NOT_DLY); /* Indicate that task was not delayed */
ldi R16,80
xjmp L10
L17:
.dbline 179
; }
;
; ptcb->OSTCBDly = 0; /* Clear the time delay */
clr R2
clr R3
movw R30,R22
std z+9,R3
std z+8,R2
.dbline 180
; if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {
movw R30,R22
ldd R24,z+10
andi R24,55
breq L19
.dbline 180
.dbline 181
; ptcb->OSTCBStat &= ~OS_STAT_PEND_ANY; /* Yes, Clear status flag */
movw R24,R22
adiw R24,10
movw R30,R24
ldd R24,z+0
andi R24,200
std z+0,R24
.dbline 182
; ptcb->OSTCBPendTO = TRUE; /* Indicate PEND timeout */
ldi R24,1
movw R30,R22
std z+11,R24
.dbline 183
xjmp L20
L19:
.dbline 183
; } else {
.dbline 184
; ptcb->OSTCBPendTO = FALSE;
clr R2
movw R30,R22
std z+11,R2
.dbline 185
; }
L20:
.dbline 186
; if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
movw R30,R22
ldd R2,z+10
clr R3
sbrc R2,3
rjmp L21
.dbline 186
.dbline 187
; OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make ready */
movw R30,R22
ldd R2,z+16
lds R3,_OSRdyGrp
or R3,R2
sts _OSRdyGrp,R3
.dbline 188
; OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
ldi R24,<_OSRdyTbl
ldi R25,>_OSRdyTbl
movw R30,R22
ldd R2,z+14
clr R3
add R2,R24
adc R3,R25
movw R30,R22
ldd R4,z+15
movw R30,R2
ldd R5,z+0
or R5,R4
std z+0,R5
.dbline 189
; OS_EXIT_CRITICAL();
mov R16,R20
xcall _OS_CPU_SR_Restore
.dbline 190
; OS_Sched(); /* See if this is new highest priority */
xcall _OS_Sched
.dbline 191
xjmp L22
L21:
.dbline 191
; } else {
.dbline 192
; OS_EXIT_CRITICAL(); /* Task may be suspended */
mov R16,R20
xcall _OS_CPU_SR_Restore
.dbline 193
; }
L22:
.dbline 194
; return (OS_NO_ERR);
clr R16
.dbline -2
L10:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r cpu_sr 20 c
.dbsym r ptcb 22 pS[os_tcb]
.dbsym r prio 22 c
.dbend
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?