os_time.lis
来自「将本站的UCOSFORAVR128V276版本升级到了280版」· LIS 代码 · 共 648 行 · 第 1/2 页
LIS
648 行
0168 4FEF ldi R20,255
016A 5FEF ldi R21,255
016C 60E0 ldi R22,0
016E 70E0 ldi R23,0
0170 FE01 movw R30,R28
0172 2080 ldd R2,z+0
0174 3180 ldd R3,z+1
0176 4280 ldd R4,z+2
0178 5380 ldd R5,z+3
017A 2422 and R2,R20
017C 3522 and R3,R21
017E 4622 and R4,R22
0180 5722 and R5,R23
0182 FE01 movw R30,R28
0184 2082 std z+0,R2
0186 3182 std z+1,R3
0188 4282 std z+2,R4
018A 5382 std z+3,R5
018C .dbline 116
018C ; OSTimeDly((INT16U)ticks);
018C FE01 movw R30,R28
018E 0081 ldd R16,z+0
0190 1181 ldd R17,z+1
0192 36DF xcall _OSTimeDly
0194 09C0 xjmp L8
0196 L7:
0196 .dbline 117
0196 .dbline 118
0196 00E0 ldi R16,32768
0198 10E8 ldi R17,128
019A 32DF xcall _OSTimeDly
019C .dbline 119
019C 00E0 ldi R16,32768
019E 10E8 ldi R17,128
01A0 2FDF xcall _OSTimeDly
01A2 .dbline 120
01A2 C501 movw R24,R10
01A4 0197 sbiw R24,1
01A6 5C01 movw R10,R24
01A8 .dbline 121
01A8 L8:
01A8 .dbline 117
01A8 ; while (loops > 0) {
01A8 AA20 tst R10
01AA A9F7 brne L7
01AC BB20 tst R11
01AE 99F7 brne L7
01B0 X2:
01B0 .dbline 122
01B0 ; OSTimeDly((INT16U)32768u);
01B0 ; OSTimeDly((INT16U)32768u);
01B0 ; loops--;
01B0 ; }
01B0 ; return (OS_NO_ERR);
01B0 0027 clr R16
01B2 .dbline -2
01B2 L6:
01B2 2496 adiw R28,4
01B4 0E940000 xcall pop_gset4
01B8 .dbline 0 ; func end
01B8 0895 ret
01BA .dbsym l ticks 0 l
01BA .dbsym r loops 10 i
01BA .dbsym l milli 14 i
01BA .dbsym l seconds 12 c
01BA .dbsym r minutes 12 c
01BA .dbsym r hours 10 c
01BA .dbend
01BA .dbfunc e OSTimeDlyResume _OSTimeDlyResume fc
01BA .dbstruct 0 8 os_event
01BA .dbfield 0 OSEventType c
01BA .dbfield 1 OSEventPtr pV
01BA .dbfield 3 OSEventCnt i
01BA .dbfield 5 OSEventGrp c
01BA .dbfield 6 OSEventTbl A[2:2]c
01BA .dbend
01BA .dbstruct 0 18 os_tcb
01BA .dbfield 0 OSTCBStkPtr pc
01BA .dbfield 2 OSTCBNext pS[os_tcb]
01BA .dbfield 4 OSTCBPrev pS[os_tcb]
01BA .dbfield 6 OSTCBEventPtr pS[os_event]
01BA .dbfield 8 OSTCBDly i
01BA .dbfield 10 OSTCBStat c
01BA .dbfield 11 OSTCBPendTO c
01BA .dbfield 12 OSTCBPrio c
01BA .dbfield 13 OSTCBX c
01BA .dbfield 14 OSTCBY c
01BA .dbfield 15 OSTCBBitX c
01BA .dbfield 16 OSTCBBitY c
01BA .dbfield 17 OSTCBDelReq c
01BA .dbend
01BA ; cpu_sr -> R20
01BA ; ptcb -> R22,R23
01BA ; prio -> R22
.even
01BA _OSTimeDlyResume::
01BA 0E940000 xcall push_gset2
01BE 602F mov R22,R16
01C0 .dbline -1
01C0 .dbline 153
01C0 ; }
01C0 ; #endif
01C0 ; /*$PAGE*/
01C0 ; /*
01C0 ; *********************************************************************************************************
01C0 ; * RESUME A DELAYED TASK
01C0 ; *
01C0 ; * Description: This function is used resume a task that has been delayed through a call to either
01C0 ; * OSTimeDly() or OSTimeDlyHMSM(). Note that you can call this function to resume a
01C0 ; * task that is waiting for an event with timeout. This would make the task look
01C0 ; * like a timeout occurred.
01C0 ; *
01C0 ; * Also, you cannot resume a task that has called OSTimeDlyHMSM() with a combined time that
01C0 ; * exceeds 65535 clock ticks. In other words, if the clock tick runs at 100 Hz then, you will
01C0 ; * not be able to resume a delayed task that called OSTimeDlyHMSM(0, 10, 55, 350) or higher:
01C0 ; *
01C0 ; * (10 Minutes * 60 + 55 Seconds + 0.35) * 100 ticks/second.
01C0 ; *
01C0 ; * Arguments : prio specifies the priority of the task to resume
01C0 ; *
01C0 ; * Returns : OS_NO_ERR Task has been resumed
01C0 ; * OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed
01C0 ; * (i.e. >= OS_LOWEST_PRIO)
01C0 ; * OS_TIME_NOT_DLY Task is not waiting for time to expire
01C0 ; * OS_TASK_NOT_EXIST The desired task has not been created or has been assigned to a Mutex.
01C0 ; *********************************************************************************************************
01C0 ; */
01C0 ;
01C0 ; #if OS_TIME_DLY_RESUME_EN > 0
01C0 ; INT8U OSTimeDlyResume (INT8U prio)
01C0 ; {
01C0 .dbline 156
01C0 ; OS_TCB *ptcb;
01C0 ; #if OS_CRITICAL_METHOD == 3 /* Storage for CPU status register */
01C0 ; OS_CPU_SR cpu_sr = 0;
01C0 4427 clr R20
01C2 .dbline 161
01C2 ; #endif
01C2 ;
01C2 ;
01C2 ;
01C2 ; if (prio >= OS_LOWEST_PRIO) {
01C2 6830 cpi R22,8
01C4 10F0 brlo L11
01C6 .dbline 161
01C6 .dbline 162
01C6 ; return (OS_PRIO_INVALID);
01C6 0AE2 ldi R16,42
01C8 62C0 xjmp L10
01CA L11:
01CA .dbline 164
01CA ; }
01CA ; OS_ENTER_CRITICAL();
01CA 0E940000 xcall _OS_CPU_SR_Save
01CE 402F mov R20,R16
01D0 .dbline 165
01D0 ; ptcb = OSTCBPrioTbl[prio]; /* Make sure that task exist */
01D0 82E0 ldi R24,2
01D2 869F mul R24,R22
01D4 F001 movw R30,R0
01D6 80E0 ldi R24,<_OSTCBPrioTbl
01D8 90E0 ldi R25,>_OSTCBPrioTbl
01DA E80F add R30,R24
01DC F91F adc R31,R25
01DE 6081 ldd R22,z+0
01E0 7181 ldd R23,z+1
01E2 .dbline 166
01E2 ; if (ptcb == (OS_TCB *)0) {
01E2 6030 cpi R22,0
01E4 6707 cpc R22,R23
01E6 29F4 brne L13
01E8 X3:
01E8 .dbline 166
01E8 .dbline 167
01E8 ; OS_EXIT_CRITICAL();
01E8 042F mov R16,R20
01EA 0E940000 xcall _OS_CPU_SR_Restore
01EE .dbline 168
01EE ; return (OS_TASK_NOT_EXIST); /* The task does not exist */
01EE 0BE0 ldi R16,11
01F0 4EC0 xjmp L10
01F2 L13:
01F2 .dbline 170
01F2 ; }
01F2 ; if (ptcb == (OS_TCB *)1) {
01F2 6130 cpi R22,1
01F4 E0E0 ldi R30,0
01F6 7E07 cpc R23,R30
01F8 29F4 brne L15
01FA .dbline 170
01FA .dbline 171
01FA ; OS_EXIT_CRITICAL();
01FA 042F mov R16,R20
01FC 0E940000 xcall _OS_CPU_SR_Restore
0200 .dbline 172
0200 ; return (OS_TASK_NOT_EXIST); /* The task does not exist */
0200 0BE0 ldi R16,11
0202 45C0 xjmp L10
0204 L15:
0204 .dbline 174
0204 ; }
0204 ; if (ptcb->OSTCBDly == 0) { /* See if task is delayed */
0204 FB01 movw R30,R22
0206 2084 ldd R2,z+8
0208 3184 ldd R3,z+9
020A 2220 tst R2
020C 39F4 brne L17
020E 3320 tst R3
0210 29F4 brne L17
0212 X4:
0212 .dbline 174
0212 .dbline 175
0212 ; OS_EXIT_CRITICAL();
0212 042F mov R16,R20
0214 0E940000 xcall _OS_CPU_SR_Restore
0218 .dbline 176
0218 ; return (OS_TIME_NOT_DLY); /* Indicate that task was not delayed */
0218 00E5 ldi R16,80
021A 39C0 xjmp L10
021C L17:
021C .dbline 179
021C ; }
021C ;
021C ; ptcb->OSTCBDly = 0; /* Clear the time delay */
021C 2224 clr R2
021E 3324 clr R3
0220 FB01 movw R30,R22
0222 3186 std z+9,R3
0224 2086 std z+8,R2
0226 .dbline 180
0226 ; if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {
0226 FB01 movw R30,R22
0228 8285 ldd R24,z+10
022A 8773 andi R24,55
022C 51F0 breq L19
022E .dbline 180
022E .dbline 181
022E ; ptcb->OSTCBStat &= ~OS_STAT_PEND_ANY; /* Yes, Clear status flag */
022E CB01 movw R24,R22
0230 0A96 adiw R24,10
0232 FC01 movw R30,R24
0234 8081 ldd R24,z+0
0236 887C andi R24,200
0238 8083 std z+0,R24
023A .dbline 182
023A ; ptcb->OSTCBPendTO = TRUE; /* Indicate PEND timeout */
023A 81E0 ldi R24,1
023C FB01 movw R30,R22
023E 8387 std z+11,R24
0240 .dbline 183
0240 03C0 xjmp L20
0242 L19:
0242 .dbline 183
0242 ; } else {
0242 .dbline 184
0242 ; ptcb->OSTCBPendTO = FALSE;
0242 2224 clr R2
0244 FB01 movw R30,R22
0246 2386 std z+11,R2
0248 .dbline 185
0248 ; }
0248 L20:
0248 .dbline 186
0248 ; if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
0248 FB01 movw R30,R22
024A 2284 ldd R2,z+10
024C 3324 clr R3
024E 23FC sbrc R2,3
0250 1AC0 rjmp L21
0252 .dbline 186
0252 .dbline 187
0252 ; OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make ready */
0252 FB01 movw R30,R22
0254 2088 ldd R2,z+16
0256 30900000 lds R3,_OSRdyGrp
025A 3228 or R3,R2
025C 30920000 sts _OSRdyGrp,R3
0260 .dbline 188
0260 ; OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
0260 80E0 ldi R24,<_OSRdyTbl
0262 90E0 ldi R25,>_OSRdyTbl
0264 FB01 movw R30,R22
0266 2684 ldd R2,z+14
0268 3324 clr R3
026A 280E add R2,R24
026C 391E adc R3,R25
026E FB01 movw R30,R22
0270 4784 ldd R4,z+15
0272 F101 movw R30,R2
0274 5080 ldd R5,z+0
0276 5428 or R5,R4
0278 5082 std z+0,R5
027A .dbline 189
027A ; OS_EXIT_CRITICAL();
027A 042F mov R16,R20
027C 0E940000 xcall _OS_CPU_SR_Restore
0280 .dbline 190
0280 ; OS_Sched(); /* See if this is new highest priority */
0280 0E940000 xcall _OS_Sched
0284 .dbline 191
0284 03C0 xjmp L22
0286 L21:
0286 .dbline 191
0286 ; } else {
0286 .dbline 192
0286 ; OS_EXIT_CRITICAL(); /* Task may be suspended */
0286 042F mov R16,R20
0288 0E940000 xcall _OS_CPU_SR_Restore
028C .dbline 193
028C ; }
028C L22:
028C .dbline 194
028C ; return (OS_NO_ERR);
028C 0027 clr R16
028E .dbline -2
028E L10:
028E 0E940000 xcall pop_gset2
0292 .dbline 0 ; func end
0292 0895 ret
0294 .dbsym r cpu_sr 20 c
0294 .dbsym r ptcb 22 pS[os_tcb]
0294 .dbsym r prio 22 c
0294 .dbend
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?