⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_core.txt

📁 ucos2 is a file system for embedded applications which can be used on any media, for which you can p
💻 TXT
📖 第 1 页 / 共 5 页
字号:
;;;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 + -