📄 os_core.txt
字号:
;;;700 if ((pevent->OSEventGrp & 0xFF) != 0) { /* Find HPT waiting for message */
;;;701 y = OSUnMapTbl[pevent->OSEventGrp & 0xFF];
;;;702 } else {
;;;703 y = OSUnMapTbl[(pevent->OSEventGrp >> 8) & 0xFF] + 8;
;;;704 }
;;;705 bity = (INT16U)(1 << y);
;;;706 ptbl = &pevent->OSEventTbl[y];
;;;707 if ((*ptbl & 0xFF) != 0) {
;;;708 x = OSUnMapTbl[*ptbl & 0xFF];
;;;709 } else {
;;;710 x = OSUnMapTbl[(*ptbl >> 8) & 0xFF] + 8;
;;;711 }
;;;712 bitx = (INT16U)(1 << x);
;;;713 prio = (INT8U)((y << 4) + x); /* Find priority of task getting the msg */
;;;714 #endif
;;;715
;;;716 pevent->OSEventTbl[y] &= ~bitx; /* Remove this task from the waiting list */
000810 e1c77006 BIC r7,r7,r6
;;;717 if (pevent->OSEventTbl[y] == 0) {
000814 e31700ff TST r7,#0xff
000818 e5c5700b STRB r7,[r5,#0xb] ;716
;;;718 pevent->OSEventGrp &= ~bity; /* Clr group bit if this was only task pending */
00081c 05d0500a LDRBEQ r5,[r0,#0xa]
000820 e08ee18c ADD lr,lr,r12,LSL #3 ;698
000824 e20ee0ff AND lr,lr,#0xff ;698
000828 01c55004 BICEQ r5,r5,r4
00082c 05c0500a STRBEQ r5,[r0,#0xa]
;;;719 }
;;;720 ptcb = OSTCBPrioTbl[prio]; /* Point to this task's OS_TCB */
000830 e51f0264 LDR r0,|L1.1492|
;;;721 ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from readying task */
000834 e3a05000 MOV r5,#0
000838 e790010e LDR r0,[r0,lr,LSL #2] ;720
00083c e1c052ba STRH r5,[r0,#0x2a]
;;;722 ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Unlink ECB from this task */
;;;723 #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
;;;724 ptcb->OSTCBMsg = pmsg; /* Send message directly to waiting task */
000840 e5801020 STR r1,[r0,#0x20]
000844 e580501c STR r5,[r0,#0x1c]
;;;725 #else
;;;726 pmsg = pmsg; /* Prevent compiler warning if not used */
;;;727 #endif
;;;728 ptcb->OSTCBStatPend = pend_stat; /* Set pend status of post or abort */
000848 e5c0302d STRB r3,[r0,#0x2d]
;;;729 ptcb->OSTCBStat &= ~msk; /* Clear bit associated with event type */
00084c e5d0102c LDRB r1,[r0,#0x2c]
000850 e1c11002 BIC r1,r1,r2
;;;730 if (ptcb->OSTCBStat == OS_STAT_RDY) { /* See if task is ready (could be susp'd) */
000854 e31100ff TST r1,#0xff
000858 e5c0102c STRB r1,[r0,#0x2c] ;729
00085c 1a000007 BNE |L1.2176|
;;;731 OSRdyGrp |= bity; /* Put task in the ready to run list */
000860 e51f0298 LDR r0,|L1.1488|
000864 e5d01006 LDRB r1,[r0,#6] ; OSRdyGrp
000868 e1811004 ORR r1,r1,r4
00086c e5c01006 STRB r1,[r0,#6] ; OSRdyGrp
;;;732 OSRdyTbl[y] |= bitx;
000870 e280001c ADD r0,r0,#0x1c
000874 e7d0100c LDRB r1,[r0,r12]
000878 e1811006 ORR r1,r1,r6
00087c e7c0100c STRB r1,[r0,r12]
|L1.2176|
;;;733 }
;;;734 return (prio);
000880 e1a0000e MOV r0,lr
000884 e8bd40f0 POP {r4-r7,lr}
;;;735 }
000888 e12fff1e BX lr
;;;736 #endif
ENDP
OS_EventTaskWait PROC
;;;757
;;;758 OSTCBCur->OSTCBEventPtr = pevent; /* Store pointer to event control block in TCB */
00088c e51f32c4 LDR r3,|L1.1488|
000890 e92d4010 PUSH {r4,lr}
000894 e5931024 LDR r1,[r3,#0x24] ; OSTCBCur
;;;759 y = OSTCBCur->OSTCBY; /* Task no longer ready */
;;;760 OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
000898 e283c01c ADD r12,r3,#0x1c
00089c e581001c STR r0,[r1,#0x1c] ;758
0008a0 e5d12030 LDRB r2,[r1,#0x30] ;759
0008a4 e5d14031 LDRB r4,[r1,#0x31]
0008a8 e7dce002 LDRB lr,[r12,r2]
0008ac e1cee004 BIC lr,lr,r4
0008b0 e7cce002 STRB lr,[r12,r2]
;;;761 if (OSRdyTbl[y] == 0) {
0008b4 e7dc2002 LDRB r2,[r12,r2]
0008b8 e3520000 CMP r2,#0
;;;762 OSRdyGrp &= ~OSTCBCur->OSTCBBitY; /* Clear event grp bit if this was only task pending */
0008bc 05d12032 LDRBEQ r2,[r1,#0x32]
0008c0 05d3c006 LDRBEQ r12,[r3,#6] ; OSRdyGrp
0008c4 01cc2002 BICEQ r2,r12,r2
0008c8 05c32006 STRBEQ r2,[r3,#6] ; OSRdyGrp
;;;763 }
;;;764 pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX; /* Put task in waiting list */
0008cc e5d12030 LDRB r2,[r1,#0x30]
0008d0 e5d11031 LDRB r1,[r1,#0x31]
0008d4 e0822000 ADD r2,r2,r0
0008d8 e5d2c00b LDRB r12,[r2,#0xb]
0008dc e181100c ORR r1,r1,r12
0008e0 e5c2100b STRB r1,[r2,#0xb]
;;;765 pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;
0008e4 e5932024 LDR r2,[r3,#0x24] ; OSTCBCur
0008e8 e5d0100a LDRB r1,[r0,#0xa]
0008ec e5d22032 LDRB r2,[r2,#0x32]
0008f0 e1811002 ORR r1,r1,r2
0008f4 e5c0100a STRB r1,[r0,#0xa]
;;;766 }
0008f8 e8bd4010 POP {r4,lr}
0008fc e12fff1e BX lr
;;;767 #endif
ENDP
OS_EventTOAbort PROC
;;;788
;;;789 y = OSTCBCur->OSTCBY;
000900 e51f3338 LDR r3,|L1.1488|
000904 e5932024 LDR r2,[r3,#0x24] ; OSTCBCur
000908 e5d21030 LDRB r1,[r2,#0x30]
;;;790 pevent->OSEventTbl[y] &= ~OSTCBCur->OSTCBBitX; /* Remove task from wait list */
00090c e5d22031 LDRB r2,[r2,#0x31]
000910 e0811000 ADD r1,r1,r0
000914 e5d1c00b LDRB r12,[r1,#0xb]
000918 e1cc2002 BIC r2,r12,r2
;;;791 if (pevent->OSEventTbl[y] == 0x00) {
00091c e31200ff TST r2,#0xff
000920 e5c1200b STRB r2,[r1,#0xb] ;790
;;;792 pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY;
000924 05932024 LDREQ r2,[r3,#0x24] ; OSTCBCur
000928 05d0100a LDRBEQ r1,[r0,#0xa]
00092c 05d22032 LDRBEQ r2,[r2,#0x32]
000930 01c11002 BICEQ r1,r1,r2
000934 05c0100a STRBEQ r1,[r0,#0xa]
;;;793 }
;;;794 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK; /* Clear pend status */
000938 e5930024 LDR r0,[r3,#0x24] ; OSTCBCur
00093c e3a01000 MOV r1,#0
000940 e5c0102d STRB r1,[r0,#0x2d]
;;;795 OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set status to ready */
000944 e5c0102c STRB r1,[r0,#0x2c]
;;;796 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event */
000948 e580101c STR r1,[r0,#0x1c]
;;;797 }
00094c e12fff1e BX lr
;;;798 #endif
ENDP
OS_EventWaitListInit PROC
;;;823
;;;824 pevent->OSEventGrp = 0; /* No task waiting on event */
000950 e3a02000 MOV r2,#0
000954 e5c0200a STRB r2,[r0,#0xa]
;;;825 ptbl = &pevent->OSEventTbl[0];
000958 e280000b ADD r0,r0,#0xb
;;;826
;;;827 for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
00095c e1a01002 MOV r1,r2
|L1.2400|
000960 e2811001 ADD r1,r1,#1
000964 e20110ff AND r1,r1,#0xff
000968 e3510004 CMP r1,#4
;;;828 *ptbl++ = 0;
00096c e4c02001 STRB r2,[r0],#1
000970 3afffffa BCC |L1.2400|
;;;829 }
;;;830 }
000974 e12fff1e BX lr
;;;831 #endif
ENDP
OS_MemCopy PROC
;;;1187 {
;;;1188 while (size > 0) {
000978 e3520000 CMP r2,#0
;;;1189 *pdest++ = *psrc++;
00097c 14d13001 LDRBNE r3,[r1],#1
;;;1190 size--;
000980 12422001 SUBNE r2,r2,#1
000984 11a02802 LSLNE r2,r2,#16
000988 11a02822 LSRNE r2,r2,#16
00098c 14c03001 STRBNE r3,[r0],#1 ;1189
000990 1afffff8 BNE OS_MemCopy
;;;1191 }
;;;1192 }
000994 e12fff1e BX lr
;;;1193 /*$PAGE*/
ENDP
OS_TCBInit PROC
;;;1537 INT8U OS_TCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *pext, INT16U opt)
;;;1538 {
000998 e92d5fff PUSH {r0-r12,lr}
00099c e28db038 ADD r11,sp,#0x38
0009a0 e89b0e00 LDM r11,{r9-r11}
0009a4 e1a06000 MOV r6,r0
0009a8 e1a05001 MOV r5,r1
0009ac e1a08002 MOV r8,r2
;;;1539 OS_TCB *ptcb;
;;;1540 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;1541 OS_CPU_SR cpu_sr = 0;
;;;1542 #endif
;;;1543
;;;1544
;;;1545
;;;1546 OS_ENTER_CRITICAL();
0009b0 ebfffffe BL OS_CPU_SR_Save
;;;1547 ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list */
0009b4 e51f73ec LDR r7,|L1.1488|
0009b8 e5974028 LDR r4,[r7,#0x28] ; OSTCBFreeList
;;;1548 if (ptcb != (OS_TCB *)0) {
0009bc e3540000 CMP r4,#0
0009c0 0a000043 BEQ |L1.2772|
;;;1549 OSTCBFreeList = ptcb->OSTCBNext; /* Update pointer to free TCB list */
0009c4 e5941014 LDR r1,[r4,#0x14]
0009c8 e5871028 STR r1,[r7,#0x28] ; OSTCBFreeList
;;;1550 OS_EXIT_CRITICAL();
0009cc ebfffffe BL OS_CPU_SR_Restore
;;;1551 ptcb->OSTCBStkPtr = ptos; /* Load Stack pointer in TCB */
0009d0 e5845000 STR r5,[r4,#0]
;;;1552 ptcb->OSTCBPrio = prio; /* Load task priority into TCB */
;;;1553 ptcb->OSTCBStat = OS_STAT_RDY; /* Task is ready to run */
0009d4 e3a05000 MOV r5,#0
0009d8 e5c4602e STRB r6,[r4,#0x2e] ;1552
0009dc e5c4502c STRB r5,[r4,#0x2c]
;;;1554 ptcb->OSTCBStatPend = OS_STAT_PEND_OK; /* Clear pend status */
0009e0 e5c4502d STRB r5,[r4,#0x2d]
;;;1555 ptcb->OSTCBDly = 0; /* Task is not delayed */
;;;1556
;;;1557 #if OS_TASK_CREATE_EXT_EN > 0
;;;1558 ptcb->OSTCBExtPtr = pext; /* Store pointer to TCB extension */
;;;1559 ptcb->OSTCBStkSize = stk_size; /* Store stack size */
;;;1560 ptcb->OSTCBStkBottom = pbos; /* Store pointer to bottom of stack */
0009e4 e2840008 ADD r0,r4,#8
0009e8 e1c452ba STRH r5,[r4,#0x2a] ;1555
0009ec e8800300 STM r0,{r8,r9}
0009f0 e584a004 STR r10,[r4,#4]
;;;1561 ptcb->OSTCBOpt = opt; /* Store task options */
0009f4 e1c4b1b0 STRH r11,[r4,#0x10]
;;;1562 ptcb->OSTCBId = id; /* Store task ID */
0009f8 e59d000c LDR r0,[sp,#0xc]
;;;1563 #else
;;;1564 pext = pext; /* Prevent compiler warning if not used */
;;;1565 stk_size = stk_size;
;;;1566 pbos = pbos;
;;;1567 opt = opt;
;;;1568 id = id;
;;;1569 #endif
;;;1570
;;;1571 #if OS_TASK_DEL_EN > 0
;;;1572 ptcb->OSTCBDelReq = OS_ERR_NONE;
;;;1573 #endif
;;;1574
;;;1575 #if OS_LOWEST_PRIO <= 63
;;;1576 ptcb->OSTCBY = (INT8U)(prio >> 3); /* Pre-compute X, Y, BitX and BitY */
;;;1577 ptcb->OSTCBBitY = (INT8U)(1 << ptcb->OSTCBY);
0009fc e3a01001 MOV r1,#1
000a00 e1c401b2 STRH r0,[r4,#0x12] ;1562
000a04 e1a001a6 LSR r0,r6,#3 ;1576
000a08 e5c45033 STRB r5,[r4,#0x33] ;1572
000a0c e5c40030 STRB r0,[r4,#0x30] ;1576
000a10 e20000ff AND r0,r0,#0xff
000a14 e1a00011 LSL r0,r1,r0
000a18 e5c40032 STRB r0,[r4,#0x32]
;;;1578 ptcb->OSTCBX = (INT8U)(prio & 0x07);
000a1c e2060007 AND r0,r6,#7
000a20 e5c4002f STRB r0,[r4,#0x2f]
;;;1579 ptcb->OSTCBBitX =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -