📄 os_task.txt
字号:
000272 4866 LDR r0,|L1.1036|
000274 7800 LDRB r0,[r0,#0] ; OSIntNesting
000276 b110 CBZ r0,|L1.638|
;;;433 return (OS_ERR_TASK_DEL_ISR);
000278 2040 MOVS r0,#0x40
|L1.634|
;;;434 }
;;;435 if (prio == OS_TASK_IDLE_PRIO) { /* Not allowed to delete idle task */
;;;436 return (OS_ERR_TASK_DEL_IDLE);
;;;437 }
;;;438 #if OS_ARG_CHK_EN > 0
;;;439 if (prio >= OS_LOWEST_PRIO) { /* Task priority valid ? */
;;;440 if (prio != OS_PRIO_SELF) {
;;;441 return (OS_ERR_PRIO_INVALID);
;;;442 }
;;;443 }
;;;444 #endif
;;;445
;;;446 /*$PAGE*/
;;;447 OS_ENTER_CRITICAL();
;;;448 if (prio == OS_PRIO_SELF) { /* See if requesting to delete self */
;;;449 prio = OSTCBCur->OSTCBPrio; /* Set priority to delete to current */
;;;450 }
;;;451 ptcb = OSTCBPrioTbl[prio];
;;;452 if (ptcb == (OS_TCB *)0) { /* Task to delete must exist */
;;;453 OS_EXIT_CRITICAL();
;;;454 return (OS_ERR_TASK_NOT_EXIST);
;;;455 }
;;;456 if (ptcb == OS_TCB_RESERVED) { /* Must not be assigned to Mutex */
;;;457 OS_EXIT_CRITICAL();
;;;458 return (OS_ERR_TASK_DEL);
;;;459 }
;;;460
;;;461 OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX;
;;;462 if (OSRdyTbl[ptcb->OSTCBY] == 0) { /* Make task not ready */
;;;463 OSRdyGrp &= ~ptcb->OSTCBBitY;
;;;464 }
;;;465
;;;466 #if (OS_EVENT_EN)
;;;467 if (ptcb->OSTCBEventPtr != (OS_EVENT *)0) {
;;;468 OS_EventTaskRemove(ptcb, ptcb->OSTCBEventPtr); /* Remove this task from any event wait list */
;;;469 }
;;;470 #if (OS_EVENT_MULTI_EN > 0)
;;;471 if (ptcb->OSTCBEventMultiPtr != (OS_EVENT **)0) { /* Remove this task from any events' wait lists*/
;;;472 OS_EventTaskRemoveMulti(ptcb, ptcb->OSTCBEventMultiPtr);
;;;473 }
;;;474 #endif
;;;475 #endif
;;;476
;;;477 #if (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
;;;478 pnode = ptcb->OSTCBFlagNode;
;;;479 if (pnode != (OS_FLAG_NODE *)0) { /* If task is waiting on event flag */
;;;480 OS_FlagUnlink(pnode); /* Remove from wait list */
;;;481 }
;;;482 #endif
;;;483
;;;484 ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from updating */
;;;485 ptcb->OSTCBStat = OS_STAT_RDY; /* Prevent task from being resumed */
;;;486 ptcb->OSTCBStatPend = OS_STAT_PEND_OK;
;;;487 if (OSLockNesting < 255u) { /* Make sure we don't context switch */
;;;488 OSLockNesting++;
;;;489 }
;;;490 OS_EXIT_CRITICAL(); /* Enabling INT. ignores next instruc. */
;;;491 OS_Dummy(); /* ... Dummy ensures that INTs will be */
;;;492 OS_ENTER_CRITICAL(); /* ... disabled HERE! */
;;;493 if (OSLockNesting > 0) { /* Remove context switch lock */
;;;494 OSLockNesting--;
;;;495 }
;;;496 OSTaskDelHook(ptcb); /* Call user defined hook */
;;;497 OSTaskCtr--; /* One less task being managed */
;;;498 OSTCBPrioTbl[prio] = (OS_TCB *)0; /* Clear old priority entry */
;;;499 if (ptcb->OSTCBPrev == (OS_TCB *)0) { /* Remove from TCB chain */
;;;500 ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0;
;;;501 OSTCBList = ptcb->OSTCBNext;
;;;502 } else {
;;;503 ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;
;;;504 ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;
;;;505 }
;;;506 ptcb->OSTCBNext = OSTCBFreeList; /* Return TCB to free TCB list */
;;;507 OSTCBFreeList = ptcb;
;;;508 #if OS_TASK_NAME_SIZE > 1
;;;509 ptcb->OSTCBTaskName[0] = '?'; /* Unknown name */
;;;510 ptcb->OSTCBTaskName[1] = OS_ASCII_NUL;
;;;511 #endif
;;;512 OS_EXIT_CRITICAL();
;;;513 if (OSRunning == OS_TRUE) {
;;;514 OS_Sched(); /* Find new highest priority task */
;;;515 }
;;;516 return (OS_ERR_NONE);
;;;517 }
00027a e8bde8bd POP {r4-r10,pc}
|L1.638|
00027e 2d1f CMP r5,#0x1f ;435
000280 d101 BNE |L1.646|
000282 203e MOVS r0,#0x3e ;436
000284 e7f9 B |L1.634|
|L1.646|
000286 f7fff7ff BL OS_CPU_SR_Save
00028a 4606 MOV r6,r0 ;447
00028c 2dff CMP r5,#0xff ;448
00028e d103 BNE |L1.664|
000290 485a LDR r0,|L1.1020|
000292 6800 LDR r0,[r0,#0] ;449 ; OSTCBCur
000294 f890f890 LDRB r5,[r0,#0x32] ;449
|L1.664|
000298 4f57 LDR r7,|L1.1016|
00029a f857f857 LDR r4,[r7,r5,LSL #2] ;451
00029e b924 CBNZ r4,|L1.682|
0002a0 4630 MOV r0,r6 ;453
0002a2 f7fff7ff BL OS_CPU_SR_Restore
0002a6 2043 MOVS r0,#0x43 ;454
0002a8 e7e7 B |L1.634|
|L1.682|
0002aa 2c01 CMP r4,#1 ;456
0002ac d104 BNE |L1.696|
0002ae 4630 MOV r0,r6 ;457
0002b0 f7fff7ff BL OS_CPU_SR_Restore
0002b4 203d MOVS r0,#0x3d ;458
0002b6 e7e0 B |L1.634|
|L1.696|
0002b8 f814f814 LDRB r0,[r4,#0x34]! ;461
0002bc 4950 LDR r1,|L1.1024|
0002be 7863 LDRB r3,[r4,#1] ;461
0002c0 5c0a LDRB r2,[r1,r0] ;461
0002c2 439a BICS r2,r2,r3 ;461
0002c4 540a STRB r2,[r1,r0] ;461
0002c6 f814f814 LDRB r0,[r4],#-0x34 ;462
0002ca 5c08 LDRB r0,[r1,r0] ;462
0002cc b928 CBNZ r0,|L1.730|
0002ce 494d LDR r1,|L1.1028|
0002d0 f894f894 LDRB r2,[r4,#0x36] ;463
0002d4 7808 LDRB r0,[r1,#0] ;463 ; OSRdyGrp
0002d6 4390 BICS r0,r0,r2 ;463
0002d8 7008 STRB r0,[r1,#0] ;463 ; OSRdyGrp
|L1.730|
0002da 69e1 LDR r1,[r4,#0x1c] ;467
0002dc b111 CBZ r1,|L1.740|
0002de 4620 MOV r0,r4 ;468
0002e0 f7fff7ff BL OS_EventTaskRemove
|L1.740|
0002e4 6a21 LDR r1,[r4,#0x20] ;471
0002e6 b111 CBZ r1,|L1.750|
0002e8 4620 MOV r0,r4 ;472
0002ea f7fff7ff BL OS_EventTaskRemoveMulti
|L1.750|
0002ee 6aa0 LDR r0,[r4,#0x28] ;478
0002f0 b108 CBZ r0,|L1.758|
0002f2 f7fff7ff BL OS_FlagUnlink
|L1.758|
0002f6 f04ff04f MOV r8,#0 ;484
0002fa f8a4f8a4 STRH r8,[r4,#0x2e] ;484
0002fe f884f884 STRB r8,[r4,#0x30] ;485
000302 f884f884 STRB r8,[r4,#0x31] ;486
000306 f8dff8df LDR r9,|L1.1040|
00030a f899f899 LDRB r0,[r9,#0] ;487 ; OSLockNesting
00030e 28ff CMP r0,#0xff ;487
000310 d202 BCS |L1.792|
000312 1c40 ADDS r0,r0,#1 ;488
000314 f889f889 STRB r0,[r9,#0] ;488 ; OSLockNesting
|L1.792|
000318 4630 MOV r0,r6 ;490
00031a f7fff7ff BL OS_CPU_SR_Restore
00031e f7fff7ff BL OS_Dummy
000322 f7fff7ff BL OS_CPU_SR_Save
000326 4606 MOV r6,r0 ;492
000328 f899f899 LDRB r1,[r9,#0] ;493 ; OSLockNesting
00032c b111 CBZ r1,|L1.820|
00032e 1e49 SUBS r1,r1,#1 ;494
000330 f889f889 STRB r1,[r9,#0] ;494 ; OSLockNesting
|L1.820|
000334 4620 MOV r0,r4 ;496
000336 f7fff7ff BL OSTaskDelHook
00033a 4936 LDR r1,|L1.1044|
00033c 7808 LDRB r0,[r1,#0] ;497 ; OSTaskCtr
00033e 1e40 SUBS r0,r0,#1 ;497
000340 7008 STRB r0,[r1,#0] ;497 ; OSTaskCtr
000342 f847f847 STR r8,[r7,r5,LSL #2] ;498
000346 69a1 LDR r1,[r4,#0x18] ;499
000348 b931 CBNZ r1,|L1.856|
00034a 6960 LDR r0,[r4,#0x14] ;500
00034c f8c0f8c0 STR r8,[r0,#0x18] ;500
000350 4931 LDR r1,|L1.1048|
000352 6960 LDR r0,[r4,#0x14] ;501
000354 6008 STR r0,[r1,#0] ;501 ; OSTCBList
000356 e004 B |L1.866|
|L1.856|
000358 6960 LDR r0,[r4,#0x14] ;503
00035a 6148 STR r0,[r1,#0x14] ;503
00035c e9d4e9d4 LDRD r1,r0,[r4,#0x14] ;504
000360 6188 STR r0,[r1,#0x18] ;504
|L1.866|
000362 482e LDR r0,|L1.1052|
000364 6801 LDR r1,[r0,#0] ;506 ; OSTCBFreeList
000366 6161 STR r1,[r4,#0x14] ;506
000368 6004 STR r4,[r0,#0] ;507 ; OSTCBFreeList
00036a 203f MOVS r0,#0x3f ;509
00036c f884f884 STRB r0,[r4,#0x4c] ;509
000370 f884f884 STRB r8,[r4,#0x4d] ;510
000374 4630 MOV r0,r6 ;512
000376 f7fff7ff BL OS_CPU_SR_Restore
00037a 4823 LDR r0,|L1.1032|
00037c 7800 LDRB r0,[r0,#0] ;513 ; OSRunning
00037e 2801 CMP r0,#1 ;513
000380 d101 BNE |L1.902|
000382 f7fff7ff BL OS_Sched
|L1.902|
000386 2000 MOVS r0,#0 ;516
000388 e777 B |L1.634|
;;;518 #endif
ENDP
OSTaskDelReq PROC
;;;567 INT8U OSTaskDelReq (INT8U prio)
;;;568 {
00038a b510 PUSH {r4,lr}
00038c 4604 MOV r4,r0
;;;569 INT8U stat;
;;;570 OS_TCB *ptcb;
;;;571 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;572 OS_CPU_SR cpu_sr = 0;
;;;573 #endif
;;;574
;;;575
;;;576
;;;577 if (prio == OS_TASK_IDLE_PRIO) { /* Not allowed to delete idle task */
00038e 2c1f CMP r4,#0x1f
000390 d101 BNE |L1.918|
;;;578 return (OS_ERR_TASK_DEL_IDLE);
000392 203e MOVS r0,#0x3e
;;;579 }
;;;580 #if OS_ARG_CHK_EN > 0
;;;581 if (prio >= OS_LOWEST_PRIO) { /* Task priority valid ? */
;;;582 if (prio != OS_PRIO_SELF) {
;;;583 return (OS_ERR_PRIO_INVALID);
;;;584 }
;;;585 }
;;;586 #endif
;;;587 if (prio == OS_PRIO_SELF) { /* See if a task is requesting to ... */
;;;588 OS_ENTER_CRITICAL(); /* ... this task to delete itself */
;;;589 stat = OSTCBCur->OSTCBDelReq; /* Return request status to caller */
;;;590 OS_EXIT_CRITICAL();
;;;591 return (stat);
;;;592 }
;;;593 OS_ENTER_CRITICAL();
;;;594 ptcb = OSTCBPrioTbl[prio];
;;;595 if (ptcb == (OS_TCB *)0) { /* Task to delete must exist */
;;;596 OS_EXIT_CRITICAL();
;;;597 return (OS_ERR_TASK_NOT_EXIST); /* Task must already be deleted */
;;;598 }
;;;599 if (ptcb == OS_TCB_RESERVED) { /* Must NOT be assigned to a Mutex */
;;;600 OS_EXIT_CRITICAL();
;;;601 return (OS_ERR_TASK_DEL);
;;;602 }
;;;603 ptcb->OSTCBDelReq = OS_ERR_TASK_DEL_REQ; /* Set flag indicating task to be DEL. */
;;;604 OS_EXIT_CRITICAL();
;;;605 return (OS_ERR_NONE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -