📄 os_task.txt
字号:
;;;450 #endif
;;;451
;;;452 #if (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
;;;453 pnode = ptcb->OSTCBFlagNode;
;;;454 if (pnode != (OS_FLAG_NODE *)0) { /* If task is waiting on event flag */
;;;455 OS_FlagUnlink(pnode); /* Remove from wait list */
;;;456 }
;;;457 #endif
;;;458
;;;459 ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from updating */
;;;460 ptcb->OSTCBStat = OS_STAT_RDY; /* Prevent task from being resumed */
;;;461 ptcb->OSTCBStatPend = OS_STAT_PEND_OK;
;;;462 if (OSLockNesting < 255u) { /* Make sure we don't context switch */
;;;463 OSLockNesting++;
;;;464 }
;;;465 OS_EXIT_CRITICAL(); /* Enabling INT. ignores next instruc. */
;;;466 OS_Dummy(); /* ... Dummy ensures that INTs will be */
;;;467 OS_ENTER_CRITICAL(); /* ... disabled HERE! */
;;;468 if (OSLockNesting > 0) { /* Remove context switch lock */
;;;469 OSLockNesting--;
;;;470 }
;;;471 OSTaskDelHook(ptcb); /* Call user defined hook */
;;;472 OSTaskCtr--; /* One less task being managed */
;;;473 OSTCBPrioTbl[prio] = (OS_TCB *)0; /* Clear old priority entry */
;;;474 if (ptcb->OSTCBPrev == (OS_TCB *)0) { /* Remove from TCB chain */
;;;475 ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0;
;;;476 OSTCBList = ptcb->OSTCBNext;
;;;477 } else {
;;;478 ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;
;;;479 ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;
;;;480 }
;;;481 ptcb->OSTCBNext = OSTCBFreeList; /* Return TCB to free TCB list */
;;;482 OSTCBFreeList = ptcb;
;;;483 #if OS_TASK_NAME_SIZE > 1
;;;484 ptcb->OSTCBTaskName[0] = '?'; /* Unknown name */
;;;485 ptcb->OSTCBTaskName[1] = OS_ASCII_NUL;
;;;486 #endif
;;;487 OS_EXIT_CRITICAL();
;;;488 if (OSRunning == OS_TRUE) {
;;;489 OS_Sched(); /* Find new highest priority task */
;;;490 }
;;;491 return (OS_ERR_NONE);
;;;492 }
000398 e12fff1e BX lr
|L1.924|
00039c e3540001 CMP r4,#1 ;432
0003a0 1a000003 BNE |L1.948|
0003a4 e1a00006 MOV r0,r6 ;433
0003a8 ebfffffe BL OS_CPU_SR_Restore
0003ac e3a0003d MOV r0,#0x3d ;434
0003b0 eafffff7 B |L1.916|
|L1.948|
0003b4 e5d42030 LDRB r2,[r4,#0x30] ;436
0003b8 e59f059c LDR r0,|L1.2396|
0003bc e5d43031 LDRB r3,[r4,#0x31] ;437
0003c0 e7d01002 LDRB r1,[r0,r2] ;437
0003c4 e1c11003 BIC r1,r1,r3 ;437
0003c8 e7c01002 STRB r1,[r0,r2] ;437
0003cc e7d00002 LDRB r0,[r0,r2] ;438
0003d0 e3500000 CMP r0,#0 ;438
0003d4 059f0584 LDREQ r0,|L1.2400|
0003d8 05d41032 LDRBEQ r1,[r4,#0x32] ;439
0003dc 05d03000 LDRBEQ r3,[r0,#0] ;439 ; OSRdyGrp
0003e0 01c31001 BICEQ r1,r3,r1 ;439
0003e4 05c01000 STRBEQ r1,[r0,#0] ;439 ; OSRdyGrp
0003e8 e594101c LDR r1,[r4,#0x1c] ;443
0003ec e3510000 CMP r1,#0 ;444
0003f0 0a000009 BEQ |L1.1052|
0003f4 e0810002 ADD r0,r1,r2 ;445
0003f8 e5d0200b LDRB r2,[r0,#0xb] ;445
0003fc e5d43031 LDRB r3,[r4,#0x31] ;445
000400 e1c22003 BIC r2,r2,r3 ;445
000404 e31200ff TST r2,#0xff ;446
000408 e5c0200b STRB r2,[r0,#0xb] ;445
00040c 05d1000a LDRBEQ r0,[r1,#0xa] ;447
000410 05d42032 LDRBEQ r2,[r4,#0x32] ;447
000414 01c00002 BICEQ r0,r0,r2 ;447
000418 05c1000a STRBEQ r0,[r1,#0xa] ;447
|L1.1052|
00041c e5940024 LDR r0,[r4,#0x24] ;453
000420 e3500000 CMP r0,#0 ;454
000424 1bfffffe BLNE OS_FlagUnlink
000428 e3a08000 MOV r8,#0 ;459
00042c e1c482ba STRH r8,[r4,#0x2a] ;459
000430 e59f9534 LDR r9,|L1.2412|
000434 e5c4802c STRB r8,[r4,#0x2c] ;460
000438 e5c4802d STRB r8,[r4,#0x2d] ;461
00043c e5d90000 LDRB r0,[r9,#0] ;462 ; OSLockNesting
000440 e35000ff CMP r0,#0xff ;462
000444 32800001 ADDCC r0,r0,#1 ;463
000448 35c90000 STRBCC r0,[r9,#0] ;463 ; OSLockNesting
00044c e1a00006 MOV r0,r6 ;465
000450 ebfffffe BL OS_CPU_SR_Restore
000454 ebfffffe BL OS_Dummy
000458 ebfffffe BL OS_CPU_SR_Save
00045c e5d91000 LDRB r1,[r9,#0] ;468 ; OSLockNesting
000460 e1a06000 MOV r6,r0 ;467
000464 e3510000 CMP r1,#0 ;468
000468 12410001 SUBNE r0,r1,#1 ;469
00046c 15c90000 STRBNE r0,[r9,#0] ;469 ; OSLockNesting
000470 e1a00004 MOV r0,r4 ;471
000474 ebfffffe BL OSTaskDelHook
000478 e59f04f0 LDR r0,|L1.2416|
00047c e5d01000 LDRB r1,[r0,#0] ;472 ; OSTaskCtr
000480 e2411001 SUB r1,r1,#1 ;472
000484 e5c01000 STRB r1,[r0,#0] ;472 ; OSTaskCtr
000488 e7878105 STR r8,[r7,r5,LSL #2] ;473
00048c e5941018 LDR r1,[r4,#0x18] ;474
000490 e5940014 LDR r0,[r4,#0x14] ;475
000494 e3510000 CMP r1,#0 ;474
000498 15810014 STRNE r0,[r1,#0x14] ;479
00049c 15940018 LDRNE r0,[r4,#0x18] ;479
0004a0 15941014 LDRNE r1,[r4,#0x14] ;479
0004a4 15810018 STRNE r0,[r1,#0x18] ;479
0004a8 05808018 STREQ r8,[r0,#0x18] ;476
0004ac 059f14c0 LDREQ r1,|L1.2420|
0004b0 05940014 LDREQ r0,[r4,#0x14] ;476
0004b4 05810000 STREQ r0,[r1,#0] ;476 ; OSTCBList
0004b8 e59f04b8 LDR r0,|L1.2424|
0004bc e5901000 LDR r1,[r0,#0] ;481 ; OSTCBFreeList
0004c0 e5841014 STR r1,[r4,#0x14] ;482
0004c4 e5804000 STR r4,[r0,#0] ;482 ; OSTCBFreeList
0004c8 e3a0003f MOV r0,#0x3f ;484
0004cc e5c40048 STRB r0,[r4,#0x48] ;484
0004d0 e1a00006 MOV r0,r6 ;487
0004d4 e5c48049 STRB r8,[r4,#0x49] ;485
0004d8 ebfffffe BL OS_CPU_SR_Restore
0004dc e59f0480 LDR r0,|L1.2404|
0004e0 e5d00000 LDRB r0,[r0,#0] ;488 ; OSRunning
0004e4 e3500001 CMP r0,#1 ;488
0004e8 0bfffffe BLEQ OS_Sched
0004ec e3a00000 MOV r0,#0 ;491
0004f0 eaffffa7 B |L1.916|
;;;493 #endif
ENDP
OSTaskDelReq PROC
;;;542 INT8U OSTaskDelReq (INT8U prio)
;;;543 {
0004f4 e92d4010 PUSH {r4,lr}
;;;544 INT8U stat;
;;;545 OS_TCB *ptcb;
;;;546 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;547 OS_CPU_SR cpu_sr = 0;
;;;548 #endif
;;;549
;;;550
;;;551
;;;552 if (prio == OS_TASK_IDLE_PRIO) { /* Not allowed to delete idle task */
0004f8 e350001f CMP r0,#0x1f
0004fc e1a04000 MOV r4,r0 ;543
;;;553 return (OS_ERR_TASK_DEL_IDLE);
000500 03a0003e MOVEQ r0,#0x3e
000504 0a000007 BEQ |L1.1320|
;;;554 }
;;;555 #if OS_ARG_CHK_EN > 0
;;;556 if (prio >= OS_LOWEST_PRIO) { /* Task priority valid ? */
;;;557 if (prio != OS_PRIO_SELF) {
;;;558 return (OS_ERR_PRIO_INVALID);
;;;559 }
;;;560 }
;;;561 #endif
;;;562 if (prio == OS_PRIO_SELF) { /* See if a task is requesting to ... */
000508 e35400ff CMP r4,#0xff
00050c 1a000007 BNE |L1.1328|
;;;563 OS_ENTER_CRITICAL(); /* ... this task to delete itself */
000510 ebfffffe BL OS_CPU_SR_Save
;;;564 stat = OSTCBCur->OSTCBDelReq; /* Return request status to caller */
000514 e59f143c LDR r1,|L1.2392|
000518 e5911000 LDR r1,[r1,#0] ; OSTCBCur
00051c e5d14033 LDRB r4,[r1,#0x33]
;;;565 OS_EXIT_CRITICAL();
000520 ebfffffe BL OS_CPU_SR_Restore
;;;566 return (stat);
000524 e1a00004 MOV r0,r4
|L1.1320|
000528 e8bd4010 POP {r4,lr}
;;;567 }
;;;568 OS_ENTER_CRITICAL();
;;;569 ptcb = OSTCBPrioTbl[prio];
;;;570 if (ptcb == (OS_TCB *)0) { /* Task to delete must exist */
;;;571 OS_EXIT_CRITICAL();
;;;572 return (OS_ERR_TASK_NOT_EXIST); /* Task must already be deleted */
;;;573 }
;;;574 if (ptcb == OS_TCB_RESERVED) { /* Must NOT be assigned to a Mutex */
;;;575 OS_EXIT_CRITICAL();
;;;576 return (OS_ERR_TASK_DEL);
;;;577 }
;;;578 ptcb->OSTCBDelReq = OS_ERR_TASK_DEL_REQ; /* Set flag indicating task to be DEL. */
;;;579 OS_EXIT_CRITICAL();
;;;580 return (OS_ERR_NONE);
;;;581 }
00052c e12fff1e BX lr
|L1.1328|
000530 ebfffffe BL OS_CPU_SR_Save
000534 e59f1418 LDR r1,|L1.2388|
000538 e7911104 LDR r1,[r1,r4,LSL #2] ;569
00053c e3510000 CMP r1,#0 ;570
000540 1a000002 BNE |L1.1360|
000544 ebfffffe BL OS_CPU_SR_Restore
000548 e3a00043 MOV r0,#0x43 ;572
00054c eafffff5 B |L1.1320|
|L1.1360|
000550 e3510001 CMP r1,#1 ;574
000554 1a000002 BNE |L1.1380|
000558 ebfffffe BL OS_CPU_SR_Restore
00055c e3a0003d MOV r0,#0x3d ;576
000560 eafffff0 B |L1.1320|
|L1.1380|
000564 e3a0203f MOV r2,#0x3f ;578
000568 e5c12033 STRB r2,[r1,#0x33] ;578
00056c ebfffffe BL OS_CPU_SR_Restore
000570 e3a00000 MOV r0,#0 ;580
000574 eaffffeb B |L1.1320|
;;;582 #endif
ENDP
OSTaskNameGet PROC
;;;610 INT8U OSTaskNameGet (INT8U prio, INT8U *pname, INT8U *perr)
;;;611 {
000578 e92d41f0 PUSH {r4-r8,lr}
00057c e1a06000 MOV r6,r0
;;;612 OS_TCB *ptcb;
;;;613 INT8U len;
;;;614 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;615 OS_CPU_SR cpu_sr = 0;
;;;616 #endif
;;;617
;;;618
;;;619
;;;620 #if OS_ARG_CHK_EN > 0
;;;621 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;622 return (0);
;;;623 }
;;;624 if (prio > OS_LOWEST_PRIO) { /* Task priority valid ? */
;;;625 if (prio != OS_PRIO_SELF) {
;;;626 *perr = OS_ERR_PRIO_INVALID; /* No */
;;;627 return (0);
;;;628 }
;;;629 }
;;;630 if (pname == (INT8U *)0) { /* Is 'pname' a NULL pointer? */
;;;631 *perr = OS_ERR_PNAME_NULL; /* Yes */
;;;632 return (0);
;;;633 }
;;;634 #endif
;;;635 if (OSIntNesting > 0) { /* See if trying to call from an ISR */
000580 e59f03e0 LDR r0,|L1.2408|
000584 e1a05002 MOV r5,r2 ;611
000588 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
00058c e1a07001 MOV r7,r1 ;611
000590 e3500000 CMP r0,#0
;;;636 *perr = OS_ERR_NAME_GET_ISR;
000594 13a00011 MOVNE r0,#0x11
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -