os_task.lis

来自「将本站的UCOSFORAVR128V276版本升级到了280版」· LIS 代码 · 共 1,140 行 · 第 1/4 页

LIS
1,140
字号
 00FA           ; *                 the next instruction following the enable interrupt instruction is ignored.
 00FA           ; *              3) An ISR cannot delete a task.
 00FA           ; *              4) The lock nesting counter is incremented because, for a brief instant, if the current
 00FA           ; *                 task is being deleted, the current task would not be able to be rescheduled because it
 00FA           ; *                 is removed from the ready list.  Incrementing the nesting counter prevents another task
 00FA           ; *                 from being schedule.  This means that an ISR would return to the current task which is
 00FA           ; *                 being deleted.  The rest of the deletion would thus be able to be completed.
 00FA           ; *********************************************************************************************************
 00FA           ; */
 00FA           ; /*$PAGE*/
 00FA           ; #if OS_TASK_DEL_EN > 0
 00FA           ; INT8U  OSTaskDel (INT8U prio)
 00FA           ; {
 00FA                   .dbline 390
 00FA           ; #if OS_EVENT_EN
 00FA           ;     OS_EVENT     *pevent;
 00FA           ; #endif
 00FA           ; #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
 00FA           ;     OS_FLAG_NODE *pnode;
 00FA           ; #endif
 00FA           ;     OS_TCB       *ptcb;
 00FA           ;       INT8U         y;
 00FA           ; #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
 00FA           ;     OS_CPU_SR     cpu_sr = 0;
 00FA 4427              clr R20
 00FC                   .dbline 395
 00FC           ; #endif
 00FC           ; 
 00FC           ; 
 00FC           ; 
 00FC           ;     if (OSIntNesting > 0) {                                     /* See if trying to delete from ISR    */
 00FC 2224              clr R2
 00FE 30900000          lds R3,_OSIntNesting
 0102 2314              cp R2,R3
 0104 10F4              brsh L11
 0106                   .dbline 395
 0106                   .dbline 396
 0106           ;         return (OS_TASK_DEL_ISR);
 0106 0FE3              ldi R16,63
 0108 D8C0              xjmp L10
 010A           L11:
 010A                   .dbline 408
 010A           ;     }
 010A           ; #if OS_ARG_CHK_EN > 0
 010A           ;     if (prio == OS_IDLE_PRIO) {                                 /* Not allowed to delete idle task     */
 010A           ;         return (OS_TASK_DEL_IDLE);
 010A           ;     }
 010A           ;     if (prio >= OS_LOWEST_PRIO) {                               /* Task priority valid ?               */
 010A           ;         if (prio != OS_PRIO_SELF) {
 010A           ;             return (OS_PRIO_INVALID);
 010A           ;         }
 010A           ;     }
 010A           ; #endif
 010A           ;     OS_ENTER_CRITICAL();
 010A 0E940000          xcall _OS_CPU_SR_Save
 010E 402F              mov R20,R16
 0110                   .dbline 409
 0110           ;     if (prio == OS_PRIO_SELF) {                                 /* See if requesting to delete self    */
 0110 8A2D              mov R24,R10
 0112 8F3F              cpi R24,255
 0114 29F4              brne L13
 0116                   .dbline 409
 0116                   .dbline 410
 0116           ;         prio = OSTCBCur->OSTCBPrio;                             /* Set priority to delete to current   */
 0116 E0910000          lds R30,_OSTCBCur
 011A F0910100          lds R31,_OSTCBCur+1
 011E A484              ldd R10,z+12
 0120                   .dbline 411
 0120           ;     }
 0120           L13:
 0120                   .dbline 412
 0120           ;     ptcb = OSTCBPrioTbl[prio];
 0120 82E0              ldi R24,2
 0122 8A9D              mul R24,R10
 0124 F001              movw R30,R0
 0126 80E0              ldi R24,<_OSTCBPrioTbl
 0128 90E0              ldi R25,>_OSTCBPrioTbl
 012A E80F              add R30,R24
 012C F91F              adc R31,R25
 012E 6081              ldd R22,z+0
 0130 7181              ldd R23,z+1
 0132                   .dbline 413
 0132           ;     if (ptcb == (OS_TCB *)0) {                                  /* Task to delete must exist           */
 0132 6030              cpi R22,0
 0134 6707              cpc R22,R23
 0136 29F4              brne L15
 0138           X3:
 0138                   .dbline 413
 0138                   .dbline 414
 0138           ;         OS_EXIT_CRITICAL();
 0138 042F              mov R16,R20
 013A 0E940000          xcall _OS_CPU_SR_Restore
 013E                   .dbline 415
 013E           ;         return (OS_TASK_DEL_ERR);
 013E 0CE3              ldi R16,60
 0140 BCC0              xjmp L10
 0142           L15:
 0142                   .dbline 417
 0142           ;     }
 0142           ;     if (ptcb == (OS_TCB *)1) {                                  /* Must not be assigned to Mutex       */
 0142 6130              cpi R22,1
 0144 E0E0              ldi R30,0
 0146 7E07              cpc R23,R30
 0148 29F4              brne L17
 014A                   .dbline 417
 014A                   .dbline 418
 014A           ;         OS_EXIT_CRITICAL();
 014A 042F              mov R16,R20
 014C 0E940000          xcall _OS_CPU_SR_Restore
 0150                   .dbline 419
 0150           ;         return (OS_TASK_NOT_EXIST);
 0150 0BE0              ldi R16,11
 0152 B3C0              xjmp L10
 0154           L17:
 0154                   .dbline 421
 0154           ;     }
 0154           ;       y            =  ptcb->OSTCBY;
 0154 FB01              movw R30,R22
 0156 E684              ldd R14,z+14
 0158                   .dbline 422
 0158           ;       OSRdyTbl[y] &= ~ptcb->OSTCBBitX;
 0158 80E0              ldi R24,<_OSRdyTbl
 015A 90E0              ldi R25,>_OSRdyTbl
 015C 2E2C              mov R2,R14
 015E 3324              clr R3
 0160 280E              add R2,R24
 0162 391E              adc R3,R25
 0164 FB01              movw R30,R22
 0166 4784              ldd R4,z+15
 0168 4094              com R4
 016A F101              movw R30,R2
 016C 5080              ldd R5,z+0
 016E 5420              and R5,R4
 0170 5082              std z+0,R5
 0172                   .dbline 423
 0172           ;     if (OSRdyTbl[y] == 0) {                                     /* Make task not ready                 */
 0172 EE2D              mov R30,R14
 0174 FF27              clr R31
 0176 E80F              add R30,R24
 0178 F91F              adc R31,R25
 017A 2080              ldd R2,z+0
 017C 2220              tst R2
 017E 41F4              brne L19
 0180                   .dbline 423
 0180                   .dbline 424
 0180           ;         OSRdyGrp &= ~ptcb->OSTCBBitY;
 0180 FB01              movw R30,R22
 0182 2088              ldd R2,z+16
 0184 2094              com R2
 0186 30900000          lds R3,_OSRdyGrp
 018A 3220              and R3,R2
 018C 30920000          sts _OSRdyGrp,R3
 0190                   .dbline 425
 0190           ;     }
 0190           L19:
 0190                   .dbline 427
 0190           ; #if OS_EVENT_EN
 0190           ;     pevent = ptcb->OSTCBEventPtr;
 0190 FB01              movw R30,R22
 0192 C680              ldd R12,z+6
 0194 D780              ldd R13,z+7
 0196                   .dbline 428
 0196           ;     if (pevent != (OS_EVENT *)0) {                              /* If task is waiting on event         */
 0196 CC20              tst R12
 0198 19F4              brne X4
 019A DD20              tst R13
 019C 09F4              brne X6
 019E 1FC0              xjmp L21
 01A0           X6:
 01A0           X4:
 01A0                   .dbline 428
 01A0                   .dbline 429
 01A0           ;           pevent->OSEventTbl[y] &= ~ptcb->OSTCBBitX;
 01A0 C601              movw R24,R12
 01A2 0696              adiw R24,6
 01A4 2E2C              mov R2,R14
 01A6 3324              clr R3
 01A8 280E              add R2,R24
 01AA 391E              adc R3,R25
 01AC FB01              movw R30,R22
 01AE 4784              ldd R4,z+15
 01B0 4094              com R4
 01B2 F101              movw R30,R2
 01B4 5080              ldd R5,z+0
 01B6 5420              and R5,R4
 01B8 5082              std z+0,R5
 01BA                   .dbline 430
 01BA           ;         if (pevent->OSEventTbl[y] == 0) {                       /* ... remove task from ...            */
 01BA C601              movw R24,R12
 01BC 0696              adiw R24,6
 01BE EE2D              mov R30,R14
 01C0 FF27              clr R31
 01C2 E80F              add R30,R24
 01C4 F91F              adc R31,R25
 01C6 2080              ldd R2,z+0
 01C8 2220              tst R2
 01CA 49F4              brne L23
 01CC                   .dbline 430
 01CC                   .dbline 431
 01CC           ;             pevent->OSEventGrp &= ~ptcb->OSTCBBitY;             /* ... event ctrl block                */
 01CC C601              movw R24,R12
 01CE 0596              adiw R24,5
 01D0 FB01              movw R30,R22
 01D2 4088              ldd R4,z+16
 01D4 4094              com R4
 01D6 FC01              movw R30,R24
 01D8 5080              ldd R5,z+0
 01DA 5420              and R5,R4
 01DC 5082              std z+0,R5
 01DE                   .dbline 432
 01DE           ;         }
 01DE           L23:
 01DE                   .dbline 433
 01DE           ;     }
 01DE           L21:
 01DE                   .dbline 441
 01DE           ; #endif
 01DE           ; #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
 01DE           ;     pnode = ptcb->OSTCBFlagNode;
 01DE           ;     if (pnode != (OS_FLAG_NODE *)0) {                           /* If task is waiting on event flag    */
 01DE           ;         OS_FlagUnlink(pnode);                                   /* Remove from wait list               */
 01DE           ;     }
 01DE           ; #endif
 01DE           ;     ptcb->OSTCBDly    = 0;                                      /* Prevent OSTimeTick() from updating  */
 01DE 2224              clr R2
 01E0 3324              clr R3
 01E2 FB01              movw R30,R22
 01E4 3186              std z+9,R3
 01E6 2086              std z+8,R2
 01E8                   .dbline 442
 01E8           ;     ptcb->OSTCBStat   = OS_STAT_RDY;                            /* Prevent task from being resumed     */
 01E8 FB01              movw R30,R22
 01EA 2286              std z+10,R2
 01EC                   .dbline 443
 01EC           ;     ptcb->OSTCBPendTO = FALSE;
 01EC FB01              movw R30,R22
 01EE 2386              std z+11,R2
 01F0                   .dbline 444
 01F0           ;       if (OSLockNesting < 255u) {                                 /* Make sure we don't context switch   */
 01F0 80910000          lds R24,_OSLockNesting
 01F4 8F3F              cpi R24,255
 01F6 18F4              brsh L25
 01F8                   .dbline 444
 01F8                   .dbline 445
 01F8           ;         OSLockNesting++;
 01F8 8F5F              subi R24,255    ; addi 1
 01FA 80930000          sts _OSLockNesting,R24
 01FE                   .dbline 446
 01FE           ;       }
 01FE           L25:
 01FE                   .dbline 447
 01FE           ;     OS_EXIT_CRITICAL();                                         /* Enabling INT. ignores next instruc. */
 01FE 042F              mov R16,R20
 0200 0E940000          xcall _OS_CPU_SR_Restore
 0204                   .dbline 448
 0204           ;     OS_Dummy();                                                 /* ... Dummy ensures that INTs will be */
 0204 0E940000          xcall _OS_Dummy
 0208                   .dbline 449
 0208           ;     OS_ENTER_CRITICAL();                                        /* ... disabled HERE!                  */
 0208 0E940000          xcall _OS_CPU_SR_Save
 020C 402F              mov R20,R16
 020E                   .dbline 450
 020E           ;       if (OSLockNesting > 0) {                                    /* Remove context switch lock          */
 020E 2224              clr R2
 0210 30900000          lds R3,_OSLockNesting
 0214 2314              cp R2,R3
 0216 20F4              brsh L27
 0218                   .dbline 450
 0218                   .dbline 451
 0218           ;         OSLockNesting--;
 0218 832D              mov R24,R3
 021A 8150              subi R24,1
 021C 80930000          sts _OSLockNesting,R24
 0220                   .dbline 452
 0220           ;       }
 0220           L27:
 0220                   .dbline 453
 0220           ;     OSTaskDelHook(ptcb);                                        /* Call user defined hook              */
 0220 8B01              movw R16,R22
 0222 0E940000          xcall _OSTaskDelHook
 0226                   .dbline 454
 0226           ;     OSTaskCtr--;                                                /* One less task being managed         */
 0226 80910000          lds R24,_OSTaskCtr
 022A 8150              subi R24,1
 022C 80930000          sts _OSTaskCtr,R24

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?