os_q.txt

来自「在KEIL下成功使用UCOS-II嵌入式操作系统」· 文本 代码 · 共 1,094 行 · 第 1/4 页

TXT
1,094
字号
;;;571                    OS_EventTaskRdy(pevent, msg, OS_STAT_Q);    
;;;572                }
;;;573            } else {
;;;574                OS_EventTaskRdy(pevent, msg, OS_STAT_Q);  /* No,  Post to HPT waiting on queue             */
;;;575            }
;;;576            OS_EXIT_CRITICAL();
;;;577            OS_Sched();                                   /* Find highest priority task ready to run       */
;;;578            return (OS_NO_ERR);
;;;579        }
;;;580        pq = (OS_Q *)pevent->OSEventPtr;                  /* Point to queue control block                  */
;;;581        if (pq->OSQEntries >= pq->OSQSize) {              /* Make sure queue is not full                   */
;;;582            OS_EXIT_CRITICAL();
;;;583            return (OS_Q_FULL);
;;;584        }
;;;585        if ((opt & OS_POST_OPT_FRONT) != 0x00) {          /* Do we post to the FRONT of the queue?         */
;;;586            if (pq->OSQOut == pq->OSQStart) {             /* Yes, Post as LIFO, Wrap OUT pointer if we ... */
;;;587                pq->OSQOut = pq->OSQEnd;                  /*      ... are at the 1st queue entry           */
;;;588            }
;;;589            pq->OSQOut--;
;;;590            *pq->OSQOut = msg;                            /*      Insert message into queue                */
;;;591        } else {                                          /* No,  Post as FIFO                             */
;;;592            *pq->OSQIn++ = msg;                           /*      Insert message into queue                */
;;;593            if (pq->OSQIn == pq->OSQEnd) {                /*      Wrap IN ptr if we are at end of queue    */
;;;594                pq->OSQIn = pq->OSQStart;
;;;595            }
;;;596        }
;;;597        pq->OSQEntries++;                                 /* Update the nbr of entries in the queue        */
;;;598        OS_EXIT_CRITICAL();
;;;599        return (OS_NO_ERR);
;;;600    }
                  |L1.1672|
000688  e8bd81f0          POP      {r4-r8,pc}
                  |L1.1676|
00068c  e3550000          CMP      r5,#0                 ;560
000690  1a000001          BNE      |L1.1692|             ;560
000694  e3a00003          MOV      r0,#3                 ;561
000698  eafffffa          B        |L1.1672|             ;561
                  |L1.1692|
00069c  e5d40000          LDRB     r0,[r4,#0]            ;563
0006a0  e3500002          CMP      r0,#2                 ;563
0006a4  0a000001          BEQ      |L1.1712|             ;563
0006a8  e3a00001          MOV      r0,#1                 ;564
0006ac  eafffff5          B        |L1.1672|             ;564
                  |L1.1712|
0006b0  ef000002          SVC      0x2  ; formerly SWI   ;567
0006b4  e5d40001          LDRB     r0,[r4,#1]            ;568
0006b8  e3500000          CMP      r0,#0                 ;568
0006bc  0a000012          BEQ      |L1.1804|             ;568
0006c0  e3170001          TST      r7,#1                 ;569
0006c4  0a000008          BEQ      |L1.1772|             ;569
0006c8  ea000003          B        |L1.1756|             ;570
                  |L1.1740|
0006cc  e3a02004          MOV      r2,#4                 ;571
0006d0  e1a01005          MOV      r1,r5                 ;571
0006d4  e1a00004          MOV      r0,r4                 ;571
0006d8  ebfffffe          BL       OS_EventTaskRdy       ;571
                  |L1.1756|
0006dc  e5d40001          LDRB     r0,[r4,#1]            ;570
0006e0  e3500000          CMP      r0,#0                 ;570
0006e4  1afffff8          BNE      |L1.1740|             ;570
0006e8  ea000003          B        |L1.1788|             ;570
                  |L1.1772|
0006ec  e3a02004          MOV      r2,#4                 ;574
0006f0  e1a01005          MOV      r1,r5                 ;574
0006f4  e1a00004          MOV      r0,r4                 ;574
0006f8  ebfffffe          BL       OS_EventTaskRdy       ;574
                  |L1.1788|
0006fc  ef000003          SVC      0x3  ; formerly SWI   ;576
000700  ebfffffe          BL       OS_Sched              ;577
000704  e3a00000          MOV      r0,#0                 ;578
000708  eaffffde          B        |L1.1672|             ;578
                  |L1.1804|
00070c  e5946004          LDR      r6,[r4,#4]            ;580
000710  e1d601b6          LDRH     r0,[r6,#0x16]         ;581
000714  e1d611b4          LDRH     r1,[r6,#0x14]         ;581
000718  e1500001          CMP      r0,r1                 ;581
00071c  ba000002          BLT      |L1.1836|             ;581
000720  ef000003          SVC      0x3  ; formerly SWI   ;582
000724  e3a0001e          MOV      r0,#0x1e              ;583
000728  eaffffd6          B        |L1.1672|             ;583
                  |L1.1836|
00072c  e3170002          TST      r7,#2                 ;585
000730  0a00000b          BEQ      |L1.1892|             ;585
000734  e5960010          LDR      r0,[r6,#0x10]         ;586
000738  e5961004          LDR      r1,[r6,#4]            ;586
00073c  e1500001          CMP      r0,r1                 ;586
000740  1a000001          BNE      |L1.1868|             ;586
000744  e5960008          LDR      r0,[r6,#8]            ;587
000748  e5860010          STR      r0,[r6,#0x10]         ;587
                  |L1.1868|
00074c  e5960010          LDR      r0,[r6,#0x10]         ;589
000750  e2400004          SUB      r0,r0,#4              ;589
000754  e5860010          STR      r0,[r6,#0x10]         ;589
000758  e5960010          LDR      r0,[r6,#0x10]         ;590
00075c  e5805000          STR      r5,[r0,#0]            ;590
000760  ea000009          B        |L1.1932|             ;590
                  |L1.1892|
000764  e596000c          LDR      r0,[r6,#0xc]          ;592
000768  e2801004          ADD      r1,r0,#4              ;592
00076c  e586100c          STR      r1,[r6,#0xc]          ;592
000770  e5805000          STR      r5,[r0,#0]            ;592
000774  e596000c          LDR      r0,[r6,#0xc]          ;593
000778  e5961008          LDR      r1,[r6,#8]            ;593
00077c  e1500001          CMP      r0,r1                 ;593
000780  1a000001          BNE      |L1.1932|             ;593
000784  e5960004          LDR      r0,[r6,#4]            ;594
000788  e586000c          STR      r0,[r6,#0xc]          ;594
                  |L1.1932|
00078c  e1d601b6          LDRH     r0,[r6,#0x16]         ;597
000790  e2800001          ADD      r0,r0,#1              ;597
000794  e3c00801          BIC      r0,r0,#0x10000        ;597
000798  e1c601b6          STRH     r0,[r6,#0x16]         ;597
00079c  ef000003          SVC      0x3  ; formerly SWI   ;598
0007a0  e3a00000          MOV      r0,#0                 ;599
0007a4  eaffffb7          B        |L1.1672|             ;599
                          ENDP

                  OSQQuery PROC
;;;621    INT8U  OSQQuery (OS_EVENT *pevent, OS_Q_DATA *pdata)
;;;622    {
0007a8  e92d41f0          PUSH     {r4-r8,lr}
0007ac  e1a04000          MOV      r4,r0
0007b0  e1a05001          MOV      r5,r1
;;;623    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;624        OS_CPU_SR  cpu_sr;
;;;625    #endif    
;;;626        OS_Q      *pq;
;;;627        INT8U     *psrc;
;;;628        INT8U     *pdest;
;;;629    
;;;630    
;;;631    #if OS_ARG_CHK_EN > 0
;;;632        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
0007b4  e3540000          CMP      r4,#0
0007b8  1a000001          BNE      |L1.1988|
;;;633            return (OS_ERR_PEVENT_NULL);
0007bc  e3a00004          MOV      r0,#4
;;;634        }
;;;635        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {          /* Validate event block type                */
;;;636            return (OS_ERR_EVENT_TYPE);
;;;637        }
;;;638    #endif
;;;639        OS_ENTER_CRITICAL();
;;;640        pdata->OSEventGrp = pevent->OSEventGrp;                /* Copy message queue wait list           */
;;;641        psrc              = &pevent->OSEventTbl[0];
;;;642        pdest             = &pdata->OSEventTbl[0];
;;;643    #if OS_EVENT_TBL_SIZE > 0
;;;644        *pdest++          = *psrc++;
;;;645    #endif
;;;646    
;;;647    #if OS_EVENT_TBL_SIZE > 1
;;;648        *pdest++          = *psrc++;
;;;649    #endif
;;;650    
;;;651    #if OS_EVENT_TBL_SIZE > 2
;;;652        *pdest++          = *psrc++;
;;;653    #endif
;;;654    
;;;655    #if OS_EVENT_TBL_SIZE > 3
;;;656        *pdest++          = *psrc++;
;;;657    #endif
;;;658    
;;;659    #if OS_EVENT_TBL_SIZE > 4
;;;660        *pdest++          = *psrc++;
;;;661    #endif
;;;662    
;;;663    #if OS_EVENT_TBL_SIZE > 5
;;;664        *pdest++          = *psrc++;
;;;665    #endif
;;;666    
;;;667    #if OS_EVENT_TBL_SIZE > 6
;;;668        *pdest++          = *psrc++;
;;;669    #endif
;;;670    
;;;671    #if OS_EVENT_TBL_SIZE > 7
;;;672        *pdest            = *psrc;
;;;673    #endif
;;;674        pq = (OS_Q *)pevent->OSEventPtr;
;;;675        if (pq->OSQEntries > 0) {
;;;676            pdata->OSMsg = pq->OSQOut;                         /* Get next message to return if available  */
;;;677        } else {
;;;678            pdata->OSMsg = (void *)0;
;;;679        }
;;;680        pdata->OSNMsgs = pq->OSQEntries;
;;;681        pdata->OSQSize = pq->OSQSize;
;;;682        OS_EXIT_CRITICAL();
;;;683        return (OS_NO_ERR);
;;;684    }
                  |L1.1984|
0007c0  e8bd81f0          POP      {r4-r8,pc}
                  |L1.1988|
0007c4  e5d40000          LDRB     r0,[r4,#0]            ;635
0007c8  e3500002          CMP      r0,#2                 ;635
0007cc  0a000001          BEQ      |L1.2008|             ;635
0007d0  e3a00001          MOV      r0,#1                 ;636
0007d4  eafffff9          B        |L1.1984|             ;636
                  |L1.2008|
0007d8  ef000002          SVC      0x2  ; formerly SWI   ;639
0007dc  e5d40001          LDRB     r0,[r4,#1]            ;640
0007e0  e5c5000a          STRB     r0,[r5,#0xa]          ;640
0007e4  e2847008          ADD      r7,r4,#8              ;641
0007e8  e2858008          ADD      r8,r5,#8              ;642
0007ec  e4d70001          LDRB     r0,[r7],#1            ;644
0007f0  e4c80001          STRB     r0,[r8],#1            ;644
0007f4  e4d70001          LDRB     r0,[r7],#1            ;648
0007f8  e4c80001          STRB     r0,[r8],#1            ;648
0007fc  e5946004          LDR      r6,[r4,#4]            ;674
000800  e1d601b6          LDRH     r0,[r6,#0x16]         ;675
000804  e3500000          CMP      r0,#0                 ;675
000808  da000002          BLE      |L1.2072|             ;675
00080c  e5960010          LDR      r0,[r6,#0x10]         ;676
000810  e5850000          STR      r0,[r5,#0]            ;676
000814  ea000001          B        |L1.2080|             ;676
                  |L1.2072|
000818  e3a00000          MOV      r0,#0                 ;678
00081c  e5850000          STR      r0,[r5,#0]            ;678
                  |L1.2080|
000820  e1d601b6          LDRH     r0,[r6,#0x16]         ;680
000824  e1c500b4          STRH     r0,[r5,#4]            ;680
000828  e1d601b4          LDRH     r0,[r6,#0x14]         ;681
00082c  e1c500b6          STRH     r0,[r5,#6]            ;681
000830  ef000003          SVC      0x3  ; formerly SWI   ;682
000834  e3a00000          MOV      r0,#0                 ;683
000838  eaffffe0          B        |L1.1984|             ;683
                          ENDP

                  OS_QInit PROC
;;;715    
;;;716        pq1 = &OSQTbl[0];
00083c  e59f204c          LDR      r2,|L1.2192|
;;;717        pq2 = &OSQTbl[1];
000840  e2821018          ADD      r1,r2,#0x18
;;;718        for (i = 0; i < (OS_MAX_QS - 1); i++) {      /* Init. list of free QUEUE control blocks            */
000844  e3a00000          MOV      r0,#0
000848  ea000004          B        |L1.2144|
;;;719            pq1->OSQPtr = pq2;
                  |L1.2124|
00084c  e5821000          STR      r1,[r2,#0]
;;;720            pq1++;
000850  e2822018          ADD      r2,r2,#0x18
;;;721            pq2++;
000854  e2811018          ADD      r1,r1,#0x18
000858  e2803001          ADD      r3,r0,#1              ;718
00085c  e3c30801          BIC      r0,r3,#0x10000        ;718
                  |L1.2144|
000860  e3500001          CMP      r0,#1                 ;718
000864  bafffff8          BLT      |L1.2124|             ;718
;;;722        }
;;;723        pq1->OSQPtr = (OS_Q *)0;
000868  e3a03000          MOV      r3,#0
00086c  e5823000          STR      r3,[r2,#0]
;;;724        OSQFreeList = &OSQTbl[0];
000870  e59f3018          LDR      r3,|L1.2192|
000874  e59fc00c          LDR      r12,|L1.2184|
000878  e58c3000          STR      r3,[r12,#0]  ; OSQFreeList
;;;725    #endif
;;;726    }
00087c  e12fff1e          BX       lr
                  |L1.2176|
000880  00000000          DCD      OSIntNesting
                  |L1.2180|
000884  00000000          DCD      OSEventFreeList
                  |L1.2184|
000888  00000000          DCD      OSQFreeList
                  |L1.2188|
00088c  00000000          DCD      OSTCBCur
                  |L1.2192|
000890  00000000          DCD      OSQTbl
                          ENDP


⌨️ 快捷键说明

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