?? os_task.txt
字號:
;;;432 if (ptcb == OS_TCB_RESERVED) { /* Must not be assigned to Mutex */
0002e6 2c01 CMP r4,#1
0002e8 d105 BNE |L1.758|
;;;433 OS_EXIT_CRITICAL();
0002ea 4638 MOV r0,r7
0002ec f7fff7ff BL OS_CPU_SR_Restore
;;;434 return (OS_ERR_TASK_DEL);
0002f0 203d MOVS r0,#0x3d
0002f2 e8bde8bd POP {r4-r10,pc}
|L1.758|
;;;435 }
;;;436 y = ptcb->OSTCBY;
0002f6 f894f894 LDRB r2,[r4,#0x30]
;;;437 OSRdyTbl[y] &= ~ptcb->OSTCBBitX;
0002fa 4849 LDR r0,|L1.1056|
0002fc f894f894 LDRB r3,[r4,#0x31]
000300 5c81 LDRB r1,[r0,r2]
000302 4399 BICS r1,r1,r3
000304 5481 STRB r1,[r0,r2]
;;;438 if (OSRdyTbl[y] == 0) { /* Make task not ready */
000306 5c80 LDRB r0,[r0,r2]
000308 b930 CBNZ r0,|L1.792|
;;;439 OSRdyGrp &= ~ptcb->OSTCBBitY;
00030a 4846 LDR r0,|L1.1060|
00030c f894f894 LDRB r1,[r4,#0x32]
000310 7803 LDRB r3,[r0,#0] ; OSRdyGrp
000312 ea23ea23 BIC r1,r3,r1
000316 7001 STRB r1,[r0,#0] ; OSRdyGrp
|L1.792|
;;;440 }
;;;441
;;;442 #if OS_EVENT_EN
;;;443 pevent = ptcb->OSTCBEventPtr;
000318 69e1 LDR r1,[r4,#0x1c]
;;;444 if (pevent != (OS_EVENT *)0) { /* If task is waiting on event */
00031a b161 CBZ r1,|L1.822|
;;;445 pevent->OSEventTbl[y] &= ~ptcb->OSTCBBitX;
00031c 440a ADD r2,r2,r1
00031e 7ad0 LDRB r0,[r2,#0xb]
000320 f894f894 LDRB r3,[r4,#0x31]
000324 4398 BICS r0,r0,r3
000326 72d0 STRB r0,[r2,#0xb]
;;;446 if (pevent->OSEventTbl[y] == 0) { /* ... remove task from ... */
000328 7ad0 LDRB r0,[r2,#0xb]
00032a b920 CBNZ r0,|L1.822|
;;;447 pevent->OSEventGrp &= ~ptcb->OSTCBBitY; /* ... event ctrl block */
00032c 7a88 LDRB r0,[r1,#0xa]
00032e f894f894 LDRB r2,[r4,#0x32]
000332 4390 BICS r0,r0,r2
000334 7288 STRB r0,[r1,#0xa]
|L1.822|
;;;448 }
;;;449 }
;;;450 #endif
;;;451
;;;452 #if (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
;;;453 pnode = ptcb->OSTCBFlagNode;
000336 6a60 LDR r0,[r4,#0x24]
;;;454 if (pnode != (OS_FLAG_NODE *)0) { /* If task is waiting on event flag */
000338 b108 CBZ r0,|L1.830|
;;;455 OS_FlagUnlink(pnode); /* Remove from wait list */
00033a f7fff7ff BL OS_FlagUnlink
|L1.830|
;;;456 }
;;;457 #endif
;;;458
;;;459 ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from updating */
00033e f04ff04f MOV r8,#0
000342 f8a4f8a4 STRH r8,[r4,#0x2a]
;;;460 ptcb->OSTCBStat = OS_STAT_RDY; /* Prevent task from being resumed */
000346 f884f884 STRB r8,[r4,#0x2c]
;;;461 ptcb->OSTCBStatPend = OS_STAT_PEND_OK;
00034a f884f884 STRB r8,[r4,#0x2d]
;;;462 if (OSLockNesting < 255u) { /* Make sure we don't context switch */
00034e f8dff8df LDR r9,|L1.1072|
000352 f899f899 LDRB r0,[r9,#0] ; OSLockNesting
000356 28ff CMP r0,#0xff
000358 d202 BCS |L1.864|
;;;463 OSLockNesting++;
00035a 1c40 ADDS r0,r0,#1
00035c f889f889 STRB r0,[r9,#0] ; OSLockNesting
|L1.864|
;;;464 }
;;;465 OS_EXIT_CRITICAL(); /* Enabling INT. ignores next instruc. */
000360 4638 MOV r0,r7
000362 f7fff7ff BL OS_CPU_SR_Restore
;;;466 OS_Dummy(); /* ... Dummy ensures that INTs will be */
000366 f7fff7ff BL OS_Dummy
;;;467 OS_ENTER_CRITICAL(); /* ... disabled HERE! */
00036a f7fff7ff BL OS_CPU_SR_Save
00036e 4607 MOV r7,r0
;;;468 if (OSLockNesting > 0) { /* Remove context switch lock */
000370 f899f899 LDRB r1,[r9,#0] ; OSLockNesting
000374 b111 CBZ r1,|L1.892|
;;;469 OSLockNesting--;
000376 1e48 SUBS r0,r1,#1
000378 f889f889 STRB r0,[r9,#0] ; OSLockNesting
|L1.892|
;;;470 }
;;;471 OSTaskDelHook(ptcb); /* Call user defined hook */
00037c 4620 MOV r0,r4
00037e f7fff7ff BL OSTaskDelHook
;;;472 OSTaskCtr--; /* One less task being managed */
000382 492c LDR r1,|L1.1076|
000384 7808 LDRB r0,[r1,#0] ; OSTaskCtr
000386 1e40 SUBS r0,r0,#1
000388 7008 STRB r0,[r1,#0] ; OSTaskCtr
;;;473 OSTCBPrioTbl[prio] = (OS_TCB *)0; /* Clear old priority entry */
00038a f846f846 STR r8,[r6,r5,LSL #2]
;;;474 if (ptcb->OSTCBPrev == (OS_TCB *)0) { /* Remove from TCB chain */
00038e 69a1 LDR r1,[r4,#0x18]
000390 b931 CBNZ r1,|L1.928|
;;;475 ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0;
000392 6960 LDR r0,[r4,#0x14]
000394 f8c0f8c0 STR r8,[r0,#0x18]
;;;476 OSTCBList = ptcb->OSTCBNext;
000398 4927 LDR r1,|L1.1080|
00039a 6960 LDR r0,[r4,#0x14]
00039c 6008 STR r0,[r1,#0] ; OSTCBList
00039e e004 B |L1.938|
|L1.928|
;;;477 } else {
;;;478 ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;
0003a0 6960 LDR r0,[r4,#0x14]
0003a2 6148 STR r0,[r1,#0x14]
;;;479 ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;
0003a4 6961 LDR r1,[r4,#0x14]
0003a6 69a0 LDR r0,[r4,#0x18]
0003a8 6188 STR r0,[r1,#0x18]
|L1.938|
;;;480 }
;;;481 ptcb->OSTCBNext = OSTCBFreeList; /* Return TCB to free TCB list */
0003aa 4824 LDR r0,|L1.1084|
0003ac 6801 LDR r1,[r0,#0] ; OSTCBFreeList
0003ae 6161 STR r1,[r4,#0x14]
;;;482 OSTCBFreeList = ptcb;
0003b0 6004 STR r4,[r0,#0] ; OSTCBFreeList
;;;483 #if OS_TASK_NAME_SIZE > 1
;;;484 ptcb->OSTCBTaskName[0] = '?'; /* Unknown name */
0003b2 203f MOVS r0,#0x3f
0003b4 f884f884 STRB r0,[r4,#0x48]
;;;485 ptcb->OSTCBTaskName[1] = OS_ASCII_NUL;
0003b8 f884f884 STRB r8,[r4,#0x49]
;;;486 #endif
;;;487 OS_EXIT_CRITICAL();
0003bc 4638 MOV r0,r7
0003be f7fff7ff BL OS_CPU_SR_Restore
;;;488 if (OSRunning == OS_TRUE) {
0003c2 4819 LDR r0,|L1.1064|
0003c4 7800 LDRB r0,[r0,#0] ; OSRunning
0003c6 2801 CMP r0,#1
0003c8 d101 BNE |L1.974|
;;;489 OS_Sched(); /* Find new highest priority task */
0003ca f7fff7ff BL OS_Sched
|L1.974|
;;;490 }
;;;491 return (OS_ERR_NONE);
0003ce 2000 MOVS r0,#0
;;;492 }
0003d0 e8bde8bd POP {r4-r10,pc}
;;;493 #endif
ENDP
OSTaskDelReq PROC
;;;542 INT8U OSTaskDelReq (INT8U prio)
;;;543 {
0003d4 b510 PUSH {r4,lr}
0003d6 4604 MOV r4,r0
;;;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 */
0003d8 2c1f CMP r4,#0x1f
0003da d101 BNE |L1.992|
;;;553 return (OS_ERR_TASK_DEL_IDLE);
0003dc 203e MOVS r0,#0x3e
;;;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 ... */
;;;563 OS_ENTER_CRITICAL(); /* ... this task to delete itself */
;;;564 stat = OSTCBCur->OSTCBDelReq; /* Return request status to caller */
;;;565 OS_EXIT_CRITICAL();
;;;566 return (stat);
;;;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 }
0003de bd10 POP {r4,pc}
|L1.992|
0003e0 d303 BCC |L1.1002|
0003e2 2cff CMP r4,#0xff
0003e4 d001 BEQ |L1.1002|
0003e6 202a MOVS r0,#0x2a
0003e8 bd10 POP {r4,pc}
|L1.1002|
0003ea 2cff CMP r4,#0xff
0003ec d109 BNE |L1.1026|
0003ee f7fff7ff BL OS_CPU_SR_Save
0003f2 490a LDR r1,|L1.1052|
0003f4 6809 LDR r1,[r1,#0] ; OSTCBCur
0003f6 f891f891 LDRB r4,[r1,#0x33]
0003fa f7fff7ff BL OS_CPU_SR_Restore
0003fe 4620 MOV r0,r4
000400 bd10 POP {r4,pc}
|L1.1026|
000402 f7fff7ff BL OS_CPU_SR_Save
000406 4904 LDR r1,|L1.1048|
000408 f851f851 LDR r1,[r1,r4,LSL #2]
00040c b9c1 CBNZ r1,|L1.1088|
00040e f7fff7ff BL OS_CPU_SR_Restore
000412 2043 MOVS r0,#0x43
|L1.1044|
000414 bd10 POP {r4,pc}
000416 0000 DCW 0x0000
|L1.1048|
000418 00000000 DCD OSTCBPrioTbl
|L1.1052|
00041c 00000000 DCD OSTCBCur
|L1.1056|
000420 00000000 DCD OSRdyTbl
|L1.1060|
000424 00000000 DCD OSRdyGrp
|L1.1064|
000428 00000000 DCD OSRunning
|L1.1068|
00042c 00000000 DCD OSIntNesting
|L1.1072|
000430 00000000 DCD OSLockNesting
|L1.1076|
000434 00000000 DCD OSTaskCtr
|L1.1080|
000438 00000000 DCD OSTCBList
|L1.1084|
00043c 00000000 DCD OSTCBFreeList
|L1.1088|
000440 2901 CMP r1,#1
000442 d103 BNE |L1.1100|
000444 f7fff7ff BL OS_CPU_SR_Restore
000448 203d MOVS r0,#0x3d
00044a e7e3 B |L1.1044|
|L1.1100|
00044c 223f MOVS r2,#0x3f
00044e f881f881 STRB r2,[r1,#0x33]
000452 f7fff7ff BL OS_CPU_SR_Restore
000456 2000 MOVS r0,#0
000458 e7dc B |L1.1044|
;;;582 #endif
ENDP
OSTaskNameGet PROC
;;;610 INT8U OSTaskNameGet (INT8U prio, INT8U *pname, INT8U *perr)
;;;611 {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -