📄 os_core.txt
字号:
|L1.1344|
;;;381 OS_ENTER_CRITICAL();
000540 ef000002 SVC #0x2
;;;382 if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
000544 e1d402ba LDRH r0,[r4,#0x2a]
000548 e3500000 CMP r0,#0
00054c 0a000014 BEQ |L1.1444|
;;;383 if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
000550 e2400001 SUB r0,r0,#1
000554 e1a00800 LSL r0,r0,#16
000558 e1b00820 LSRS r0,r0,#16
00055c e1c402ba STRH r0,[r4,#0x2a]
000560 1a00000f BNE |L1.1444|
;;;384 if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
000564 e5d4002c LDRB r0,[r4,#0x2c]
000568 e3100008 TST r0,#8
00056c 1a00000a BNE |L1.1436|
;;;385 OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task R-to-R (timed out)*/
000570 e5d40031 LDRB r0,[r4,#0x31]
000574 e5d51007 LDRB r1,[r5,#7] ; OSRdyGrp
000578 e1800001 ORR r0,r0,r1
00057c e5c50007 STRB r0,[r5,#7] ; OSRdyGrp
;;;386 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
000580 e5d4002f LDRB r0,[r4,#0x2f]
000584 e59f12fc LDR r1,|L1.2184|
000588 e5d43030 LDRB r3,[r4,#0x30]
00058c e7d12000 LDRB r2,[r1,r0]
000590 e1822003 ORR r2,r2,r3
000594 e7c12000 STRB r2,[r1,r0]
000598 ea000001 B |L1.1444|
|L1.1436|
;;;387 } else { /* Yes, Leave 1 tick to prevent ... */
;;;388 ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
00059c e3a00001 MOV r0,#1
0005a0 e1c402ba STRH r0,[r4,#0x2a]
|L1.1444|
;;;389 } /* ... suspension is removed. */
;;;390 }
;;;391 }
;;;392 ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
0005a4 e5944014 LDR r4,[r4,#0x14]
;;;393 OS_EXIT_CRITICAL();
0005a8 ef000003 SVC #0x3
|L1.1452|
0005ac e5d4002d LDRB r0,[r4,#0x2d] ;380
0005b0 e350000c CMP r0,#0xc ;380
0005b4 1affffe1 BNE |L1.1344|
|L1.1464|
;;;394 }
;;;395 }
;;;396 }
0005b8 e8bd4070 POP {r4-r6,lr}
0005bc e12fff1e BX lr
;;;397 /*$PAGE*/
ENDP
OSVersion PROC
;;;413 {
;;;414 return (OS_VERSION);
0005c0 e3a000fc MOV r0,#0xfc
;;;415 }
0005c4 e12fff1e BX lr
;;;416
ENDP
OS_Dummy PROC
;;;432 {
;;;433 }
0005c8 e12fff1e BX lr
;;;434 #endif
ENDP
OS_EventTaskRdy PROC
;;;459 INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
;;;460 {
0005cc e92d4070 PUSH {r4-r6,lr}
;;;461 OS_TCB *ptcb;
;;;462 INT8U x;
;;;463 INT8U y;
;;;464 INT8U bitx;
;;;465 INT8U bity;
;;;466 INT8U prio;
;;;467
;;;468
;;;469 y = OSUnMapTbl[pevent->OSEventGrp]; /* Find highest prio. task waiting for message */
0005d0 e5d03001 LDRB r3,[r0,#1]
0005d4 e59fc2a8 LDR r12,|L1.2180|
0005d8 e7dc3003 LDRB r3,[r12,r3]
;;;470 bity = OSMapTbl[y];
0005dc e24c4008 SUB r4,r12,#8
0005e0 e7d4e003 LDRB lr,[r4,r3]
;;;471 x = OSUnMapTbl[pevent->OSEventTbl[y]];
0005e4 e0806003 ADD r6,r0,r3
0005e8 e5d65008 LDRB r5,[r6,#8]
0005ec e7dcc005 LDRB r12,[r12,r5]
;;;472 bitx = OSMapTbl[x];
0005f0 e7d4400c LDRB r4,[r4,r12]
;;;473 prio = (INT8U)((y << 3) + x); /* Find priority of task getting the msg */
0005f4 e08cc183 ADD r12,r12,r3,LSL #3
0005f8 e20cc0ff AND r12,r12,#0xff
;;;474 if ((pevent->OSEventTbl[y] &= ~bitx) == 0x00) { /* Remove this task from the waiting list */
0005fc e1d55004 BICS r5,r5,r4
000600 e5c65008 STRB r5,[r6,#8]
000604 1a000002 BNE |L1.1556|
;;;475 pevent->OSEventGrp &= ~bity; /* Clr group bit if this was only task pending */
000608 e5d05001 LDRB r5,[r0,#1]
00060c e1c5500e BIC r5,r5,lr
000610 e5c05001 STRB r5,[r0,#1]
|L1.1556|
;;;476 }
;;;477 ptcb = OSTCBPrioTbl[prio]; /* Point to this task's OS_TCB */
000614 e59f0260 LDR r0,|L1.2172|
000618 e790010c LDR r0,[r0,r12,LSL #2]
;;;478 ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from readying task */
00061c e3a05000 MOV r5,#0
000620 e1c052ba STRH r5,[r0,#0x2a]
;;;479 ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Unlink ECB from this task */
000624 e580501c STR r5,[r0,#0x1c]
;;;480 #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
;;;481 ptcb->OSTCBMsg = msg; /* Send message directly to waiting task */
000628 e5801020 STR r1,[r0,#0x20]
;;;482 #else
;;;483 msg = msg; /* Prevent compiler warning if not used */
;;;484 #endif
;;;485 ptcb->OSTCBStat &= ~msk; /* Clear bit associated with event type */
00062c e5d0102c LDRB r1,[r0,#0x2c]
000630 e1c11002 BIC r1,r1,r2
000634 e5c0102c STRB r1,[r0,#0x2c]
;;;486 if (ptcb->OSTCBStat == OS_STAT_RDY) { /* See if task is ready (could be susp'd) */
000638 e5d0002c LDRB r0,[r0,#0x2c]
00063c e3500000 CMP r0,#0
000640 1a000007 BNE |L1.1636|
;;;487 OSRdyGrp |= bity; /* Put task in the ready to run list */
000644 e59f0210 LDR r0,|L1.2140|
000648 e5d01007 LDRB r1,[r0,#7] ; OSRdyGrp
00064c e181100e ORR r1,r1,lr
000650 e5c01007 STRB r1,[r0,#7] ; OSRdyGrp
;;;488 OSRdyTbl[y] |= bitx;
000654 e280000a ADD r0,r0,#0xa
000658 e7d01003 LDRB r1,[r0,r3]
00065c e1811004 ORR r1,r1,r4
000660 e7c01003 STRB r1,[r0,r3]
|L1.1636|
;;;489 }
;;;490 return (prio);
000664 e8bd4070 POP {r4-r6,lr}
000668 e1a0000c MOV r0,r12
;;;491 }
00066c e12fff1e BX lr
;;;492 #endif
ENDP
OS_EventTaskWait PROC
;;;509 void OS_EventTaskWait (OS_EVENT *pevent)
;;;510 {
000670 e92d4010 PUSH {r4,lr}
;;;511 OSTCBCur->OSTCBEventPtr = pevent; /* Store pointer to event control block in TCB */
000674 e59fc1e0 LDR r12,|L1.2140|
000678 e59c1020 LDR r1,[r12,#0x20] ; OSTCBCur
00067c e581001c STR r0,[r1,#0x1c]
;;;512 if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) { /* Task no longer ready */
000680 e5d1202f LDRB r2,[r1,#0x2f]
000684 e28ce00a ADD lr,r12,#0xa
000688 e5d14030 LDRB r4,[r1,#0x30]
00068c e7de3002 LDRB r3,[lr,r2]
000690 e1d33004 BICS r3,r3,r4
000694 e7ce3002 STRB r3,[lr,r2]
000698 1a000003 BNE |L1.1708|
;;;513 OSRdyGrp &= ~OSTCBCur->OSTCBBitY; /* Clear event grp bit if this was only task pending */
00069c e5d12031 LDRB r2,[r1,#0x31]
0006a0 e5dc3007 LDRB r3,[r12,#7] ; OSRdyGrp
0006a4 e1c32002 BIC r2,r3,r2
0006a8 e5cc2007 STRB r2,[r12,#7] ; OSRdyGrp
|L1.1708|
;;;514 }
;;;515 pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX; /* Put task in waiting list */
0006ac e5d1202f LDRB r2,[r1,#0x2f]
0006b0 e5d11030 LDRB r1,[r1,#0x30]
0006b4 e0822000 ADD r2,r2,r0
0006b8 e5d23008 LDRB r3,[r2,#8]
0006bc e1811003 ORR r1,r1,r3
0006c0 e5c21008 STRB r1,[r2,#8]
;;;516 pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;
0006c4 e59c2020 LDR r2,[r12,#0x20] ; OSTCBCur
0006c8 e5d01001 LDRB r1,[r0,#1]
0006cc e5d22031 LDRB r2,[r2,#0x31]
0006d0 e1811002 ORR r1,r1,r2
0006d4 e5c01001 STRB r1,[r0,#1]
;;;517 }
0006d8 e8bd4010 POP {r4,lr}
0006dc e12fff1e BX lr
;;;518 #endif
ENDP
OS_EventTO PROC
;;;536 {
;;;537 if ((pevent->OSEventTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) {
0006e0 e59f3174 LDR r3,|L1.2140|
0006e4 e5932020 LDR r2,[r3,#0x20] ; OSTCBCur
0006e8 e5d2102f LDRB r1,[r2,#0x2f]
0006ec e5d22030 LDRB r2,[r2,#0x30]
0006f0 e0811000 ADD r1,r1,r0
0006f4 e5d1c008 LDRB r12,[r1,#8]
0006f8 e1dc2002 BICS r2,r12,r2
0006fc e5c12008 STRB r2,[r1,#8]
000700 1a000004 BNE |L1.1816|
;;;538 pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY;
000704 e5932020 LDR r2,[r3,#0x20] ; OSTCBCur
000708 e5d01001 LDRB r1,[r0,#1]
00070c e5d22031 LDRB r2,[r2,#0x31]
000710 e1c11002 BIC r1,r1,r2
000714 e5c01001 STRB r1,[r0,#1]
|L1.1816|
;;;539 }
;;;540 OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set status to ready */
000718 e5930020 LDR r0,[r3,#0x20] ; OSTCBCur
00071c e3a01000 MOV r1,#0
000720 e5c0102c STRB r1,[r0,#0x2c]
;;;541 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event */
000724 e580101c STR r1,[r0,#0x1c]
;;;542 }
000728 e12fff1e BX lr
;;;543 #endif
ENDP
OS_EventWaitListInit PROC
;;;563
;;;564 pevent->OSEventGrp = 0x00; /* No task waiting on event */
00072c e3a01000 MOV r1,#0
000730 e5c01001 STRB r1,[r0,#1]
;;;565 ptbl = &pevent->OSEventTbl[0];
;;;566
;;;567 #if OS_EVENT_TBL_SIZE > 0
;;;568 *ptbl++ = 0x00;
000734 e5c01008 STRB r1,[r0,#8]
;;;569 #endif
;;;570
;;;571 #if OS_EVENT_TBL_SIZE > 1
;;;572 *ptbl++ = 0x00;
000738 e5c01009 STRB r1,[r0,#9]
;;;573 #endif
;;;574
;;;575 #if OS_EVENT_TBL_SIZE > 2
;;;576 *ptbl++ = 0x00;
;;;577 #endif
;;;578
;;;579 #if OS_EVENT_TBL_SIZE > 3
;;;580 *ptbl++ = 0x00;
;;;581 #endif
;;;582
;;;583 #if OS_EVENT_TBL_SIZE > 4
;;;584 *ptbl++ = 0x00;
;;;585 #endif
;;;586
;;;587 #if OS_EVENT_TBL_SIZE > 5
;;;588 *ptbl++ = 0x00;
;;;589 #endif
;;;590
;;;591 #if OS_EVENT_TBL_SIZE > 6
;;;592 *ptbl++ = 0x00;
;;;593 #endif
;;;594
;;;595 #if OS_EVENT_TBL_SIZE > 7
;;;596 *ptbl = 0x00;
;;;597 #endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -