os_q.txt

来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 1,063 行 · 第 1/4 页

TXT
1,063
字号
;;;575            OS_Sched();                                   /* Find highest priority task ready to run       */
;;;576            return (OS_NO_ERR);
;;;577        }
;;;578        pq = (OS_Q *)pevent->OSEventPtr;                  /* Point to queue control block                  */
;;;579        if (pq->OSQEntries >= pq->OSQSize) {              /* Make sure queue is not full                   */
;;;580            OS_EXIT_CRITICAL();
;;;581            return (OS_Q_FULL);
;;;582        }
;;;583        if ((opt & OS_POST_OPT_FRONT) != 0x00) {          /* Do we post to the FRONT of the queue?         */
;;;584            if (pq->OSQOut == pq->OSQStart) {             /* Yes, Post as LIFO, Wrap OUT pointer if we ... */
;;;585                pq->OSQOut = pq->OSQEnd;                  /*      ... are at the 1st queue entry           */
;;;586            }
;;;587            pq->OSQOut--;
;;;588            *pq->OSQOut = msg;                            /*      Insert message into queue                */
;;;589        } else {                                          /* No,  Post as FIFO                             */
;;;590            *pq->OSQIn++ = msg;                           /*      Insert message into queue                */
;;;591            if (pq->OSQIn == pq->OSQEnd) {                /*      Wrap IN ptr if we are at end of queue    */
;;;592                pq->OSQIn = pq->OSQStart;
;;;593            }
;;;594        }
;;;595        pq->OSQEntries++;                                 /* Update the nbr of entries in the queue        */
;;;596        OS_EXIT_CRITICAL();
;;;597        return (OS_NO_ERR);
;;;598    }
000604  e12fff1e          BX       lr
                  |L1.1544|
000608  e3550000          CMP      r5,#0                 ;558
00060c  1a000001          BNE      |L1.1560|
000610  e3a00003          MOV      r0,#3                 ;559
000614  eafffff9          B        |L1.1536|
                  |L1.1560|
000618  e5d40000          LDRB     r0,[r4,#0]            ;561
00061c  e3500002          CMP      r0,#2                 ;561
000620  0a000001          BEQ      |L1.1580|
000624  e3a00001          MOV      r0,#1                 ;562
000628  eafffff4          B        |L1.1536|
                  |L1.1580|
00062c  ef000002          SVC      #0x2                  ;565
000630  e5d40001          LDRB     r0,[r4,#1]            ;566
000634  e3500000          CMP      r0,#0                 ;566
000638  0a000012          BEQ      |L1.1672|
00063c  e3160001          TST      r6,#1                 ;567
000640  0a000008          BEQ      |L1.1640|
000644  ea000003          B        |L1.1624|
                  |L1.1608|
000648  e3a02004          MOV      r2,#4                 ;569
00064c  e1a01005          MOV      r1,r5                 ;569
000650  e1a00004          MOV      r0,r4                 ;569
000654  ebfffffe          BL       OS_EventTaskRdy
                  |L1.1624|
000658  e5d40001          LDRB     r0,[r4,#1]            ;568
00065c  e3500000          CMP      r0,#0                 ;568
000660  1afffff8          BNE      |L1.1608|
000664  ea000003          B        |L1.1656|
                  |L1.1640|
000668  e3a02004          MOV      r2,#4                 ;572
00066c  e1a01005          MOV      r1,r5                 ;572
000670  e1a00004          MOV      r0,r4                 ;572
000674  ebfffffe          BL       OS_EventTaskRdy
                  |L1.1656|
000678  ef000003          SVC      #0x3                  ;574
00067c  ebfffffe          BL       OS_Sched
000680  e3a00000          MOV      r0,#0                 ;576
000684  eaffffdd          B        |L1.1536|
                  |L1.1672|
000688  e5940004          LDR      r0,[r4,#4]            ;578
00068c  e1d011b6          LDRH     r1,[r0,#0x16]         ;579
000690  e1d021b4          LDRH     r2,[r0,#0x14]         ;579
000694  e1510002          CMP      r1,r2                 ;579
000698  3a000002          BCC      |L1.1704|
00069c  ef000003          SVC      #0x3                  ;580
0006a0  e3a0001e          MOV      r0,#0x1e              ;581
0006a4  eaffffd5          B        |L1.1536|
                  |L1.1704|
0006a8  e3160002          TST      r6,#2                 ;583
0006ac  0a00000a          BEQ      |L1.1756|
0006b0  e5901010          LDR      r1,[r0,#0x10]         ;584
0006b4  e5902004          LDR      r2,[r0,#4]            ;584
0006b8  e1510002          CMP      r1,r2                 ;584
0006bc  1a000001          BNE      |L1.1736|
0006c0  e5901008          LDR      r1,[r0,#8]            ;585
0006c4  e5801010          STR      r1,[r0,#0x10]         ;585
                  |L1.1736|
0006c8  e5901010          LDR      r1,[r0,#0x10]         ;587
0006cc  e2411004          SUB      r1,r1,#4              ;587
0006d0  e5801010          STR      r1,[r0,#0x10]         ;587
0006d4  e5815000          STR      r5,[r1,#0]            ;588
0006d8  ea000009          B        |L1.1796|
                  |L1.1756|
0006dc  e590100c          LDR      r1,[r0,#0xc]          ;590
0006e0  e2812004          ADD      r2,r1,#4              ;590
0006e4  e580200c          STR      r2,[r0,#0xc]          ;590
0006e8  e5815000          STR      r5,[r1,#0]            ;590
0006ec  e590100c          LDR      r1,[r0,#0xc]          ;591
0006f0  e5902008          LDR      r2,[r0,#8]            ;591
0006f4  e1510002          CMP      r1,r2                 ;591
0006f8  1a000001          BNE      |L1.1796|
0006fc  e5901004          LDR      r1,[r0,#4]            ;592
000700  e580100c          STR      r1,[r0,#0xc]          ;592
                  |L1.1796|
000704  e1d011b6          LDRH     r1,[r0,#0x16]         ;595
000708  e2811001          ADD      r1,r1,#1              ;595
00070c  e1c011b6          STRH     r1,[r0,#0x16]         ;595
000710  ef000003          SVC      #0x3                  ;596
000714  e3a00000          MOV      r0,#0                 ;597
000718  eaffffb8          B        |L1.1536|
;;;599    #endif
                          ENDP

                  OSQQuery PROC
;;;619    INT8U  OSQQuery (OS_EVENT *pevent, OS_Q_DATA *pdata)
;;;620    {
00071c  e92d4070          PUSH     {r4-r6,lr}
000720  e1a05000          MOV      r5,r0
000724  e1a04001          MOV      r4,r1
;;;621    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;622        OS_CPU_SR  cpu_sr;
;;;623    #endif
;;;624        OS_Q      *pq;
;;;625        INT8U     *psrc;
;;;626        INT8U     *pdest;
;;;627    
;;;628    
;;;629    #if OS_ARG_CHK_EN > 0
;;;630        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
000728  e3550000          CMP      r5,#0
00072c  1a000002          BNE      |L1.1852|
;;;631            return (OS_ERR_PEVENT_NULL);
000730  e3a00004          MOV      r0,#4
                  |L1.1844|
000734  e8bd4070          POP      {r4-r6,lr}
;;;632        }
;;;633        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {          /* Validate event block type                */
;;;634            return (OS_ERR_EVENT_TYPE);
;;;635        }
;;;636    #endif
;;;637        OS_ENTER_CRITICAL();
;;;638        pdata->OSEventGrp = pevent->OSEventGrp;                /* Copy message queue wait list           */
;;;639        psrc              = &pevent->OSEventTbl[0];
;;;640        pdest             = &pdata->OSEventTbl[0];
;;;641    #if OS_EVENT_TBL_SIZE > 0
;;;642        *pdest++          = *psrc++;
;;;643    #endif
;;;644    
;;;645    #if OS_EVENT_TBL_SIZE > 1
;;;646        *pdest++          = *psrc++;
;;;647    #endif
;;;648    
;;;649    #if OS_EVENT_TBL_SIZE > 2
;;;650        *pdest++          = *psrc++;
;;;651    #endif
;;;652    
;;;653    #if OS_EVENT_TBL_SIZE > 3
;;;654        *pdest++          = *psrc++;
;;;655    #endif
;;;656    
;;;657    #if OS_EVENT_TBL_SIZE > 4
;;;658        *pdest++          = *psrc++;
;;;659    #endif
;;;660    
;;;661    #if OS_EVENT_TBL_SIZE > 5
;;;662        *pdest++          = *psrc++;
;;;663    #endif
;;;664    
;;;665    #if OS_EVENT_TBL_SIZE > 6
;;;666        *pdest++          = *psrc++;
;;;667    #endif
;;;668    
;;;669    #if OS_EVENT_TBL_SIZE > 7
;;;670        *pdest            = *psrc;
;;;671    #endif
;;;672        pq = (OS_Q *)pevent->OSEventPtr;
;;;673        if (pq->OSQEntries > 0) {
;;;674            pdata->OSMsg = *pq->OSQOut;                        /* Get next message to return if available  */
;;;675        } else {
;;;676            pdata->OSMsg = (void *)0;
;;;677        }
;;;678        pdata->OSNMsgs = pq->OSQEntries;
;;;679        pdata->OSQSize = pq->OSQSize;
;;;680        OS_EXIT_CRITICAL();
;;;681        return (OS_NO_ERR);
;;;682    }
000738  e12fff1e          BX       lr
                  |L1.1852|
00073c  e5d50000          LDRB     r0,[r5,#0]            ;633
000740  e3500002          CMP      r0,#2                 ;633
000744  0a000001          BEQ      |L1.1872|
000748  e3a00001          MOV      r0,#1                 ;634
00074c  eafffff8          B        |L1.1844|
                  |L1.1872|
000750  ef000002          SVC      #0x2                  ;637
000754  e5d50001          LDRB     r0,[r5,#1]            ;638
000758  e5c4000a          STRB     r0,[r4,#0xa]          ;638
00075c  e2851008          ADD      r1,r5,#8              ;639
000760  e2840008          ADD      r0,r4,#8              ;640
000764  e5d12000          LDRB     r2,[r1,#0]            ;642
000768  e5c02000          STRB     r2,[r0,#0]            ;642
00076c  e5d11001          LDRB     r1,[r1,#1]            ;646
000770  e5c01001          STRB     r1,[r0,#1]            ;646
000774  e5950004          LDR      r0,[r5,#4]            ;672
000778  e1d011b6          LDRH     r1,[r0,#0x16]         ;673
00077c  e3510000          CMP      r1,#0                 ;673
000780  0a000003          BEQ      |L1.1940|
000784  e5901010          LDR      r1,[r0,#0x10]         ;674
000788  e5911000          LDR      r1,[r1,#0]            ;674
00078c  e5841000          STR      r1,[r4,#0]            ;674
000790  ea000001          B        |L1.1948|
                  |L1.1940|
000794  e3a01000          MOV      r1,#0                 ;676
000798  e5841000          STR      r1,[r4,#0]            ;676
                  |L1.1948|
00079c  e1d011b6          LDRH     r1,[r0,#0x16]         ;678
0007a0  e1c410b4          STRH     r1,[r4,#4]            ;678
0007a4  e1d001b4          LDRH     r0,[r0,#0x14]         ;679
0007a8  e1c400b6          STRH     r0,[r4,#6]            ;679
0007ac  ef000003          SVC      #0x3                  ;680
0007b0  e3a00000          MOV      r0,#0                 ;681
0007b4  eaffffde          B        |L1.1844|
;;;683    #endif                                                     /* OS_Q_QUERY_EN                            */
                          ENDP

                  OS_QInit PROC
;;;713    
;;;714        pq1 = &OSQTbl[0];
0007b8  e59f0048          LDR      r0,|L1.2056|
;;;715        pq2 = &OSQTbl[1];
0007bc  e2803000          ADD      r3,r0,#0
0007c0  e2831018          ADD      r1,r3,#0x18
;;;716        for (i = 0; i < (OS_MAX_QS - 1); i++) {      /* Init. list of free QUEUE control blocks            */
0007c4  e3a02000          MOV      r2,#0
                  |L1.1992|
;;;717            pq1->OSQPtr = pq2;
0007c8  e5801000          STR      r1,[r0,#0]
;;;718            pq1++;
0007cc  e2800018          ADD      r0,r0,#0x18
;;;719            pq2++;
0007d0  e2811018          ADD      r1,r1,#0x18
0007d4  e2822001          ADD      r2,r2,#1              ;716
0007d8  e3c22801          BIC      r2,r2,#0x10000        ;716
0007dc  e3520000          CMP      r2,#0                 ;716
0007e0  0afffff8          BEQ      |L1.1992|
;;;720        }
;;;721        pq1->OSQPtr = (OS_Q *)0;
0007e4  e3a01000          MOV      r1,#0
0007e8  e5801000          STR      r1,[r0,#0]
;;;722        OSQFreeList = &OSQTbl[0];
0007ec  e59f000c          LDR      r0,|L1.2048|
0007f0  e5803000          STR      r3,[r0,#0]  ; OSQFreeList
;;;723    #endif
;;;724    }
0007f4  e12fff1e          BX       lr
;;;725    #endif                                                     /* OS_Q_EN                                  */
                          ENDP

                  |L1.2040|
0007f8  00000000          DCD      OSIntNesting
                  |L1.2044|
0007fc  00000000          DCD      OSEventFreeList
                  |L1.2048|
000800  00000000          DCD      OSQFreeList
                  |L1.2052|
000804  00000000          DCD      OSTCBCur
                  |L1.2056|
000808  00000000          DCD      OSQTbl

⌨️ 快捷键说明

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