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

📄 os_q.txt

📁 ucos2 is a file system for embedded applications which can be used on any media, for which you can p
💻 TXT
📖 第 1 页 / 共 4 页
字号:
                  OSQPostOpt PROC
;;;701    INT8U  OSQPostOpt (OS_EVENT *pevent, void *pmsg, INT8U opt)
;;;702    {
00062c  e92d41f0          PUSH     {r4-r8,lr}
000630  e1a04000          MOV      r4,r0
;;;703        OS_Q      *pq;
;;;704    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;705        OS_CPU_SR  cpu_sr = 0;
;;;706    #endif
;;;707    
;;;708    
;;;709    
;;;710    #if OS_ARG_CHK_EN > 0
;;;711        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
;;;712            return (OS_ERR_PEVENT_NULL);
;;;713        }
;;;714    #endif
;;;715        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* Validate event block type                     */
000634  e5d00000          LDRB     r0,[r0,#0]
000638  e1a06001          MOV      r6,r1                 ;702
00063c  e1a05002          MOV      r5,r2                 ;702
000640  e3500002          CMP      r0,#2
;;;716            return (OS_ERR_EVENT_TYPE);
000644  13a00001          MOVNE    r0,#1
000648  1a000019          BNE      |L1.1716|
;;;717        }
;;;718        OS_ENTER_CRITICAL();
00064c  ebfffffe          BL       OS_CPU_SR_Save
000650  e1a07000          MOV      r7,r0
;;;719        if (pevent->OSEventGrp != 0x00) {                 /* See if any task pending on queue              */
000654  e5d4000a          LDRB     r0,[r4,#0xa]
000658  e3500000          CMP      r0,#0
00065c  0a000016          BEQ      |L1.1724|
;;;720            if ((opt & OS_POST_OPT_BROADCAST) != 0x00) {  /* Do we need to post msg to ALL waiting tasks ? */
000660  e3150001          TST      r5,#1
000664  0a000008          BEQ      |L1.1676|
                  |L1.1640|
;;;721                while (pevent->OSEventGrp != 0) {         /* Yes, Post to ALL tasks waiting on queue       */
;;;722                    (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_Q, OS_STAT_PEND_OK);
000668  e3a03000          MOV      r3,#0
00066c  e3a02004          MOV      r2,#4
000670  e1a01006          MOV      r1,r6
000674  e1a00004          MOV      r0,r4
000678  ebfffffe          BL       OS_EventTaskRdy
00067c  e5d4100a          LDRB     r1,[r4,#0xa]          ;721
000680  e3510000          CMP      r1,#0                 ;721
000684  1afffff7          BNE      |L1.1640|
000688  ea000004          B        |L1.1696|
                  |L1.1676|
;;;723                }
;;;724            } else {                                      /* No,  Post to HPT waiting on queue             */
;;;725                (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_Q, OS_STAT_PEND_OK);
00068c  e3a03000          MOV      r3,#0
000690  e3a02004          MOV      r2,#4
000694  e1a01006          MOV      r1,r6
000698  e1a00004          MOV      r0,r4
00069c  ebfffffe          BL       OS_EventTaskRdy
                  |L1.1696|
;;;726            }
;;;727            OS_EXIT_CRITICAL();
0006a0  e1a00007          MOV      r0,r7
0006a4  ebfffffe          BL       OS_CPU_SR_Restore
;;;728            if ((opt & OS_POST_OPT_NO_SCHED) == 0) {	  /* See if scheduler needs to be invoked          */
0006a8  e3150004          TST      r5,#4
;;;729                OS_Sched();                               /* Find highest priority task ready to run       */
0006ac  0bfffffe          BLEQ     OS_Sched
                  |L1.1712|
;;;730            }
;;;731            return (OS_ERR_NONE);
0006b0  e3a00000          MOV      r0,#0
                  |L1.1716|
0006b4  e8bd41f0          POP      {r4-r8,lr}
;;;732        }
;;;733        pq = (OS_Q *)pevent->OSEventPtr;                  /* Point to queue control block                  */
;;;734        if (pq->OSQEntries >= pq->OSQSize) {              /* Make sure queue is not full                   */
;;;735            OS_EXIT_CRITICAL();
;;;736            return (OS_ERR_Q_FULL);
;;;737        }
;;;738        if ((opt & OS_POST_OPT_FRONT) != 0x00) {          /* Do we post to the FRONT of the queue?         */
;;;739            if (pq->OSQOut == pq->OSQStart) {             /* Yes, Post as LIFO, Wrap OUT pointer if we ... */
;;;740                pq->OSQOut = pq->OSQEnd;                  /*      ... are at the 1st queue entry           */
;;;741            }
;;;742            pq->OSQOut--;
;;;743            *pq->OSQOut = pmsg;                           /*      Insert message into queue                */
;;;744        } else {                                          /* No,  Post as FIFO                             */
;;;745            *pq->OSQIn++ = pmsg;                          /*      Insert message into queue                */
;;;746            if (pq->OSQIn == pq->OSQEnd) {                /*      Wrap IN ptr if we are at end of queue    */
;;;747                pq->OSQIn = pq->OSQStart;
;;;748            }
;;;749        }
;;;750        pq->OSQEntries++;                                 /* Update the nbr of entries in the queue        */
;;;751        OS_EXIT_CRITICAL();
;;;752        return (OS_ERR_NONE);
;;;753    }
0006b8  e12fff1e          BX       lr
                  |L1.1724|
0006bc  e5941004          LDR      r1,[r4,#4]            ;733
0006c0  e1d101b6          LDRH     r0,[r1,#0x16]         ;734
0006c4  e1d121b4          LDRH     r2,[r1,#0x14]         ;734
0006c8  e1500002          CMP      r0,r2                 ;734
0006cc  3a000003          BCC      |L1.1760|
0006d0  e1a00007          MOV      r0,r7                 ;735
0006d4  ebfffffe          BL       OS_CPU_SR_Restore
0006d8  e3a0001e          MOV      r0,#0x1e              ;736
0006dc  eafffff4          B        |L1.1716|
                  |L1.1760|
0006e0  e3150002          TST      r5,#2                 ;738
0006e4  0a000008          BEQ      |L1.1804|
0006e8  e5910010          LDR      r0,[r1,#0x10]         ;739
0006ec  e5912004          LDR      r2,[r1,#4]            ;739
0006f0  e1500002          CMP      r0,r2                 ;739
0006f4  05910008          LDREQ    r0,[r1,#8]            ;740
0006f8  e2402004          SUB      r2,r0,#4              ;742
0006fc  05810010          STREQ    r0,[r1,#0x10]         ;740
000700  e5812010          STR      r2,[r1,#0x10]         ;743
000704  e5006004          STR      r6,[r0,#-4]           ;743
000708  ea000008          B        |L1.1840|
                  |L1.1804|
00070c  e591000c          LDR      r0,[r1,#0xc]          ;745
000710  e2802004          ADD      r2,r0,#4              ;745
000714  e581200c          STR      r2,[r1,#0xc]          ;745
000718  e5806000          STR      r6,[r0,#0]            ;746
00071c  e591000c          LDR      r0,[r1,#0xc]          ;746
000720  e5912008          LDR      r2,[r1,#8]            ;746
000724  e1500002          CMP      r0,r2                 ;746
000728  05910004          LDREQ    r0,[r1,#4]            ;747
00072c  0581000c          STREQ    r0,[r1,#0xc]          ;747
                  |L1.1840|
000730  e1d101b6          LDRH     r0,[r1,#0x16]         ;750
000734  e2800001          ADD      r0,r0,#1              ;750
000738  e1c101b6          STRH     r0,[r1,#0x16]         ;750
00073c  e1a00007          MOV      r0,r7                 ;751
000740  ebfffffe          BL       OS_CPU_SR_Restore
000744  eaffffd9          B        |L1.1712|
;;;754    #endif
                          ENDP

                  OSQQuery PROC
;;;775    INT8U  OSQQuery (OS_EVENT *pevent, OS_Q_DATA *p_q_data)
;;;776    {
000748  e92d4070          PUSH     {r4-r6,lr}
00074c  e1a05000          MOV      r5,r0
;;;777        OS_Q      *pq;
;;;778        INT8U      i;
;;;779    #if OS_LOWEST_PRIO <= 63
;;;780        INT8U     *psrc;
;;;781        INT8U     *pdest;
;;;782    #else
;;;783        INT16U    *psrc;
;;;784        INT16U    *pdest;
;;;785    #endif
;;;786    #if OS_CRITICAL_METHOD == 3                            /* Allocate storage for CPU status register     */
;;;787        OS_CPU_SR  cpu_sr = 0;
;;;788    #endif
;;;789    
;;;790    
;;;791    
;;;792    #if OS_ARG_CHK_EN > 0
;;;793        if (pevent == (OS_EVENT *)0) {                     /* Validate 'pevent'                            */
;;;794            return (OS_ERR_PEVENT_NULL);
;;;795        }
;;;796        if (p_q_data == (OS_Q_DATA *)0) {                  /* Validate 'p_q_data'                          */
;;;797            return (OS_ERR_PDATA_NULL);
;;;798        }
;;;799    #endif
;;;800        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {      /* Validate event block type                    */
000750  e5d00000          LDRB     r0,[r0,#0]
000754  e1a04001          MOV      r4,r1                 ;776
000758  e3500002          CMP      r0,#2
;;;801            return (OS_ERR_EVENT_TYPE);
00075c  13a00001          MOVNE    r0,#1
000760  1a000017          BNE      |L1.1988|
;;;802        }
;;;803        OS_ENTER_CRITICAL();
000764  ebfffffe          BL       OS_CPU_SR_Save
;;;804        p_q_data->OSEventGrp = pevent->OSEventGrp;         /* Copy message queue wait list                 */
000768  e5d5100a          LDRB     r1,[r5,#0xa]
;;;805        psrc                 = &pevent->OSEventTbl[0];
00076c  e285200b          ADD      r2,r5,#0xb
;;;806        pdest                = &p_q_data->OSEventTbl[0];
000770  e2843008          ADD      r3,r4,#8
000774  e5c4100c          STRB     r1,[r4,#0xc]          ;804
;;;807        for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
000778  e3a01000          MOV      r1,#0
                  |L1.1916|
;;;808            *pdest++ = *psrc++;
00077c  e4d2c001          LDRB     r12,[r2],#1
000780  e2811001          ADD      r1,r1,#1              ;807
000784  e20110ff          AND      r1,r1,#0xff           ;807
000788  e3510004          CMP      r1,#4                 ;807
00078c  e4c3c001          STRB     r12,[r3],#1
000790  3afffff9          BCC      |L1.1916|
;;;809        }
;;;810        pq = (OS_Q *)pevent->OSEventPtr;
000794  e5951004          LDR      r1,[r5,#4]
;;;811        if (pq->OSQEntries > 0) {
000798  e1d121b6          LDRH     r2,[r1,#0x16]
00079c  e3520000          CMP      r2,#0
;;;812            p_q_data->OSMsg = *pq->OSQOut;                 /* Get next message to return if available      */
0007a0  15912010          LDRNE    r2,[r1,#0x10]
0007a4  15922000          LDRNE    r2,[r2,#0]
;;;813        } else {
;;;814            p_q_data->OSMsg = (void *)0;
0007a8  e5842000          STR      r2,[r4,#0]
;;;815        }
;;;816        p_q_data->OSNMsgs = pq->OSQEntries;
0007ac  e1d121b6          LDRH     r2,[r1,#0x16]
0007b0  e1c420b4          STRH     r2,[r4,#4]
;;;817        p_q_data->OSQSize = pq->OSQSize;
0007b4  e1d111b4          LDRH     r1,[r1,#0x14]
0007b8  e1c410b6          STRH     r1,[r4,#6]
;;;818        OS_EXIT_CRITICAL();
0007bc  ebfffffe          BL       OS_CPU_SR_Restore
;;;819        return (OS_ERR_NONE);
0007c0  e3a00000          MOV      r0,#0
                  |L1.1988|
0007c4  e8bd4070          POP      {r4-r6,lr}
;;;820    }
0007c8  e12fff1e          BX       lr
;;;821    #endif                                                 /* OS_Q_QUERY_EN                                */
                          ENDP

                  OS_QInit PROC
;;;839    void  OS_QInit (void)
;;;840    {
0007cc  e92d4010          PUSH     {r4,lr}
;;;841    #if OS_MAX_QS == 1
;;;842        OSQFreeList         = &OSQTbl[0];                /* Only ONE queue!                                */
;;;843        OSQFreeList->OSQPtr = (OS_Q *)0;
;;;844    #endif
;;;845    
;;;846    #if OS_MAX_QS >= 2
;;;847        INT16U  i;
;;;848        OS_Q   *pq1;
;;;849        OS_Q   *pq2;
;;;850    
;;;851    
;;;852    
;;;853        OS_MemClr((INT8U *)&OSQTbl[0], sizeof(OSQTbl));  /* Clear the queue table                          */
0007d0  e59f0058          LDR      r0,|L1.2096|
0007d4  e3a01060          MOV      r1,#0x60
0007d8  ebfffffe          BL       OS_MemClr
;;;854        pq1 = &OSQTbl[0];
0007dc  e59f004c          LDR      r0,|L1.2096|
;;;855        pq2 = &OSQTbl[1];
;;;856        for (i = 0; i < (OS_MAX_QS - 1); i++) {          /* Init. list of free QUEUE control blocks        */
0007e0  e3a02000          MOV      r2,#0
0007e4  e2803000          ADD      r3,r0,#0              ;855
0007e8  e2831018          ADD      r1,r3,#0x18           ;855
                  |L1.2028|
0007ec  e2822001          ADD      r2,r2,#1
0007f0  e3c22801          BIC      r2,r2,#0x10000
;;;857            pq1->OSQPtr = pq2;
0007f4  e4801018          STR      r1,[r0],#0x18
0007f8  e3520003          CMP      r2,#3                 ;856
;;;858            pq1++;
;;;859            pq2++;
0007fc  e2811018          ADD      r1,r1,#0x18
000800  3afffff9          BCC      |L1.2028|
;;;860        }
;;;861        pq1->OSQPtr = (OS_Q *)0;
000804  e3a01000          MOV      r1,#0
000808  e5801000          STR      r1,[r0,#0]
;;;862        OSQFreeList = &OSQTbl[0];
00080c  e59f0010          LDR      r0,|L1.2084|
000810  e5803000          STR      r3,[r0,#0]  ; OSQFreeList
;;;863    #endif
;;;864    }
000814  e8bd4010          POP      {r4,lr}
000818  e12fff1e          BX       lr
;;;865    #endif                                               /* OS_Q_EN                                        */
                          ENDP

                  |L1.2076|
00081c  00000000          DCD      OSIntNesting
                  |L1.2080|
000820  00000000          DCD      OSEventFreeList
                  |L1.2084|
000824  00000000          DCD      OSQFreeList
                  |L1.2088|
000828  00000000          DCD      OSLockNesting
                  |L1.2092|
00082c  00000000          DCD      OSTCBCur
                  |L1.2096|
000830  00000000          DCD      OSQTbl

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -