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 + -
显示快捷键?