📄 os_task.txt
字号:
|L1.1176|
000498 e8bd47f0 POP {r4-r10,lr}
;;;409 }
;;;410 if (prio == OS_TASK_IDLE_PRIO) { /* Not allowed to delete idle task */
;;;411 return (OS_ERR_TASK_DEL_IDLE);
;;;412 }
;;;413 #if OS_ARG_CHK_EN > 0
;;;414 if (prio >= OS_LOWEST_PRIO) { /* Task priority valid ? */
;;;415 if (prio != OS_PRIO_SELF) {
;;;416 return (OS_ERR_PRIO_INVALID);
;;;417 }
;;;418 }
;;;419 #endif
;;;420
;;;421 OS_ENTER_CRITICAL();
;;;422 if (prio == OS_PRIO_SELF) { /* See if requesting to delete self */
;;;423 prio = OSTCBCur->OSTCBPrio; /* Set priority to delete to current */
;;;424 }
;;;425 ptcb = OSTCBPrioTbl[prio];
;;;426 if (ptcb == (OS_TCB *)0) { /* Task to delete must exist */
;;;427 OS_EXIT_CRITICAL();
;;;428 return (OS_ERR_TASK_NOT_EXIST);
;;;429 }
;;;430 if (ptcb == (OS_TCB *)1) { /* Must not be assigned to Mutex */
;;;431 OS_EXIT_CRITICAL();
;;;432 return (OS_ERR_TASK_DEL);
;;;433 }
;;;434 y = ptcb->OSTCBY;
;;;435 OSRdyTbl[y] &= ~ptcb->OSTCBBitX;
;;;436 if (OSRdyTbl[y] == 0) { /* Make task not ready */
;;;437 OSRdyGrp &= ~ptcb->OSTCBBitY;
;;;438 }
;;;439
;;;440 #if OS_EVENT_EN
;;;441 pevent = ptcb->OSTCBEventPtr;
;;;442 if (pevent != (OS_EVENT *)0) { /* If task is waiting on event */
;;;443 pevent->OSEventTbl[y] &= ~ptcb->OSTCBBitX;
;;;444 if (pevent->OSEventTbl[y] == 0) { /* ... remove task from ... */
;;;445 pevent->OSEventGrp &= ~ptcb->OSTCBBitY; /* ... event ctrl block */
;;;446 }
;;;447 }
;;;448 #endif
;;;449
;;;450 #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
;;;451 pnode = ptcb->OSTCBFlagNode;
;;;452 if (pnode != (OS_FLAG_NODE *)0) { /* If task is waiting on event flag */
;;;453 OS_FlagUnlink(pnode); /* Remove from wait list */
;;;454 }
;;;455 #endif
;;;456
;;;457 ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from updating */
;;;458 ptcb->OSTCBStat = OS_STAT_RDY; /* Prevent task from being resumed */
;;;459 ptcb->OSTCBStatPend = OS_STAT_PEND_OK;
;;;460 if (OSLockNesting < 255u) { /* Make sure we don't context switch */
;;;461 OSLockNesting++;
;;;462 }
;;;463 OS_EXIT_CRITICAL(); /* Enabling INT. ignores next instruc. */
;;;464 OS_Dummy(); /* ... Dummy ensures that INTs will be */
;;;465 OS_ENTER_CRITICAL(); /* ... disabled HERE! */
;;;466 if (OSLockNesting > 0) { /* Remove context switch lock */
;;;467 OSLockNesting--;
;;;468 }
;;;469 OSTaskDelHook(ptcb); /* Call user defined hook */
;;;470 OSTaskCtr--; /* One less task being managed */
;;;471 OSTCBPrioTbl[prio] = (OS_TCB *)0; /* Clear old priority entry */
;;;472 if (ptcb->OSTCBPrev == (OS_TCB *)0) { /* Remove from TCB chain */
;;;473 ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0;
;;;474 OSTCBList = ptcb->OSTCBNext;
;;;475 } else {
;;;476 ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;
;;;477 ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;
;;;478 }
;;;479 ptcb->OSTCBNext = OSTCBFreeList; /* Return TCB to free TCB list */
;;;480 OSTCBFreeList = ptcb;
;;;481 #if OS_TASK_NAME_SIZE > 1
;;;482 ptcb->OSTCBTaskName[0] = '?'; /* Unknown name */
;;;483 ptcb->OSTCBTaskName[1] = OS_ASCII_NUL;
;;;484 #endif
;;;485 OS_EXIT_CRITICAL();
;;;486 if (OSRunning == OS_TRUE) {
;;;487 OS_Sched(); /* Find new highest priority task */
;;;488 }
;;;489 return (OS_ERR_NONE);
;;;490 }
00049c e12fff1e BX lr
|L1.1184|
0004a0 e354001f CMP r4,#0x1f
0004a4 1a000001 BNE |L1.1200|
0004a8 e3a0003e MOV r0,#0x3e
0004ac eafffff9 B |L1.1176|
|L1.1200|
0004b0 e354001f CMP r4,#0x1f
0004b4 ba000003 BLT |L1.1224|
0004b8 e35400ff CMP r4,#0xff
0004bc 0a000001 BEQ |L1.1224|
0004c0 e3a0002a MOV r0,#0x2a
0004c4 eafffff3 B |L1.1176|
|L1.1224|
0004c8 ebfffffe BL OS_CPU_SR_Save
0004cc e1a09000 MOV r9,r0
0004d0 e35400ff CMP r4,#0xff
0004d4 1a000002 BNE |L1.1252|
0004d8 e59f0878 LDR r0,|L1.3416|
0004dc e5900000 LDR r0,[r0,#0] ; OSTCBCur
0004e0 e5d0402e LDRB r4,[r0,#0x2e]
|L1.1252|
0004e4 e59f0868 LDR r0,|L1.3412|
0004e8 e7907104 LDR r7,[r0,r4,LSL #2]
0004ec e3570000 CMP r7,#0
0004f0 1a000003 BNE |L1.1284|
0004f4 e1a00009 MOV r0,r9
0004f8 ebfffffe BL OS_CPU_SR_Restore
0004fc e3a00043 MOV r0,#0x43
000500 eaffffe4 B |L1.1176|
|L1.1284|
000504 e3570001 CMP r7,#1
000508 1a000003 BNE |L1.1308|
00050c e1a00009 MOV r0,r9
000510 ebfffffe BL OS_CPU_SR_Restore
000514 e3a0003d MOV r0,#0x3d
000518 eaffffde B |L1.1176|
|L1.1308|
00051c e5d78030 LDRB r8,[r7,#0x30]
000520 e59f0834 LDR r0,|L1.3420|
000524 e7d00008 LDRB r0,[r0,r8]
000528 e5d71031 LDRB r1,[r7,#0x31]
00052c e1c00001 BIC r0,r0,r1
000530 e59f1824 LDR r1,|L1.3420|
000534 e7c10008 STRB r0,[r1,r8]
000538 e2810000 ADD r0,r1,#0
00053c e7d00008 LDRB r0,[r0,r8]
000540 e3500000 CMP r0,#0
000544 1a000005 BNE |L1.1376|
000548 e5d70032 LDRB r0,[r7,#0x32]
00054c e59f180c LDR r1,|L1.3424|
000550 e5d11000 LDRB r1,[r1,#0] ; OSRdyGrp
000554 e1c10000 BIC r0,r1,r0
000558 e59f1800 LDR r1,|L1.3424|
00055c e5c10000 STRB r0,[r1,#0] ; OSRdyGrp
|L1.1376|
000560 e597501c LDR r5,[r7,#0x1c]
000564 e3550000 CMP r5,#0
000568 0a00000d BEQ |L1.1444|
00056c e285000b ADD r0,r5,#0xb
000570 e7d00008 LDRB r0,[r0,r8]
000574 e5d71031 LDRB r1,[r7,#0x31]
000578 e1c00001 BIC r0,r0,r1
00057c e285100b ADD r1,r5,#0xb
000580 e7c10008 STRB r0,[r1,r8]
000584 e285000b ADD r0,r5,#0xb
000588 e7d00008 LDRB r0,[r0,r8]
00058c e3500000 CMP r0,#0
000590 1a000003 BNE |L1.1444|
000594 e5d5000a LDRB r0,[r5,#0xa]
000598 e5d71032 LDRB r1,[r7,#0x32]
00059c e1c00001 BIC r0,r0,r1
0005a0 e5c5000a STRB r0,[r5,#0xa]
|L1.1444|
0005a4 e5976024 LDR r6,[r7,#0x24]
0005a8 e3560000 CMP r6,#0
0005ac 0a000001 BEQ |L1.1464|
0005b0 e1a00006 MOV r0,r6
0005b4 ebfffffe BL OS_FlagUnlink
|L1.1464|
0005b8 e3a00000 MOV r0,#0
0005bc e1c702ba STRH r0,[r7,#0x2a]
0005c0 e5c7002c STRB r0,[r7,#0x2c]
0005c4 e5c7002d STRB r0,[r7,#0x2d]
0005c8 e59f079c LDR r0,|L1.3436|
0005cc e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
0005d0 e35000ff CMP r0,#0xff
0005d4 2a000004 BCS |L1.1516|
0005d8 e59f078c LDR r0,|L1.3436|
0005dc e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
0005e0 e2800001 ADD r0,r0,#1
0005e4 e59f1780 LDR r1,|L1.3436|
0005e8 e5c10000 STRB r0,[r1,#0] ; OSLockNesting
|L1.1516|
0005ec e1a00009 MOV r0,r9
0005f0 ebfffffe BL OS_CPU_SR_Restore
0005f4 ebfffffe BL OS_Dummy
0005f8 ebfffffe BL OS_CPU_SR_Save
0005fc e1a09000 MOV r9,r0
000600 e59f0764 LDR r0,|L1.3436|
000604 e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
000608 e3500000 CMP r0,#0
00060c da000004 BLE |L1.1572|
000610 e59f0754 LDR r0,|L1.3436|
000614 e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
000618 e2400001 SUB r0,r0,#1
00061c e59f1748 LDR r1,|L1.3436|
000620 e5c10000 STRB r0,[r1,#0] ; OSLockNesting
|L1.1572|
000624 e1a00007 MOV r0,r7
000628 ebfffffe BL OSTaskDelHook
00062c e59f073c LDR r0,|L1.3440|
000630 e5d00000 LDRB r0,[r0,#0] ; OSTaskCtr
000634 e2400001 SUB r0,r0,#1
000638 e59f1730 LDR r1,|L1.3440|
00063c e5c10000 STRB r0,[r1,#0] ; OSTaskCtr
000640 e3a00000 MOV r0,#0
000644 e59f1708 LDR r1,|L1.3412|
000648 e7810104 STR r0,[r1,r4,LSL #2]
00064c e5970018 LDR r0,[r7,#0x18]
000650 e3500000 CMP r0,#0
000654 1a000006 BNE |L1.1652|
000658 e3a00000 MOV r0,#0
00065c e5971014 LDR r1,[r7,#0x14]
000660 e5810018 STR r0,[r1,#0x18]
000664 e59f1708 LDR r1,|L1.3444|
000668 e5970014 LDR r0,[r7,#0x14]
00066c e5810000 STR r0,[r1,#0] ; OSTCBList
000670 ea000005 B |L1.1676|
|L1.1652|
000674 e2871014 ADD r1,r7,#0x14
000678 e8910003 LDM r1,{r0,r1}
00067c e5810014 STR r0,[r1,#0x14]
000680 e5970018 LDR r0,[r7,#0x18]
000684 e5971014 LDR r1,[r7,#0x14]
000688 e5810018 STR r0,[r1,#0x18]
|L1.1676|
00068c e59f06e4 LDR r0,|L1.3448|
000690 e5900000 LDR r0,[r0,#0] ; OSTCBFreeList
000694 e5870014 STR r0,[r7,#0x14]
000698 e59f06d8 LDR r0,|L1.3448|
00069c e5807000 STR r7,[r0,#0] ; OSTCBFreeList
0006a0 e3a0003f MOV r0,#0x3f
0006a4 e5c70048 STRB r0,[r7,#0x48]
0006a8 e3a00000 MOV r0,#0
0006ac e5c70049 STRB r0,[r7,#0x49]
0006b0 e1a00009 MOV r0,r9
0006b4 ebfffffe BL OS_CPU_SR_Restore
0006b8 e59f06a4 LDR r0,|L1.3428|
0006bc e5d00000 LDRB r0,[r0,#0] ; OSRunning
0006c0 e3500001 CMP r0,#1
0006c4 1a000000 BNE |L1.1740|
0006c8 ebfffffe BL OS_Sched
|L1.1740|
0006cc e3a00000 MOV r0,#0
0006d0 eaffff70 B |L1.1176|
ENDP
OSTaskDelReq PROC
;;;540 INT8U OSTaskDelReq (INT8U prio)
;;;541 {
0006d4 e92d41f0 PUSH {r4-r8,lr}
0006d8 e1a04000 MOV r4,r0
;;;542 INT8U stat;
;;;543 OS_TCB *ptcb;
;;;544 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;545 OS_CPU_SR cpu_sr = 0;
0006dc e3a07000 MOV r7,#0
;;;546 #endif
;;;547
;;;548
;;;549
;;;550 if (prio == OS_TASK_IDLE_PRIO) { /* Not allowed to delete idle task */
0006e0 e354001f CMP r4,#0x1f
0006e4 1a000002 BNE |L1.1780|
;;;551 return (OS_ERR_TASK_DEL_IDLE);
0006e8 e3a0003e MOV r0,#0x3e
|L1.1772|
0006ec e8bd41f0 POP {r4-r8,lr}
;;;552 }
;;;553 #if OS_ARG_CHK_EN > 0
;;;554 if (prio >= OS_LOWEST_PRIO) { /* Task priority valid ? */
;;;555 if (prio != OS_PRIO_SELF) {
;;;556 return (OS_ERR_PRIO_INVALID);
;;;557 }
;;;558 }
;;;559 #endif
;;;560 if (prio == OS_PRIO_SELF) { /* See if a task is requesting to ... */
;;;561 OS_ENTER_CRITICAL(); /* ... this task to delete itself */
;;;562 stat = OSTCBCur->OSTCBDelReq; /* Return request status to caller */
;;;563 OS_EXIT_CRITICAL();
;;;564 return (stat);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -