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