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

📄 os_q.txt

📁 ucos2.86版本结合STM板极支持包
💻 TXT
📖 第 1 页 / 共 5 页
字号:
0004ca  d1f6              BNE      |L1.1210|
0004cc  e005              B        |L1.1242|
                  |L1.1230|
;;;722                    (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_Q, OS_STAT_PEND_OK);
;;;723                }
;;;724            } else {                                      /* No,  Post to HPT waiting on queue             */
;;;725                (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_Q, OS_STAT_PEND_OK);
0004ce  2300              MOVS     r3,#0
0004d0  2204              MOVS     r2,#4
0004d2  4631              MOV      r1,r6
0004d4  4620              MOV      r0,r4
0004d6  f7fff7ff          BL       OS_EventTaskRdy
                  |L1.1242|
;;;726            }
;;;727            OS_EXIT_CRITICAL();
0004da  4638              MOV      r0,r7
0004dc  f7fff7ff          BL       OS_CPU_SR_Restore
;;;728            if ((opt & OS_POST_OPT_NO_SCHED) == 0) {	  /* See if scheduler needs to be invoked          */
0004e0  f015f015          TST      r5,#4
0004e4  d101              BNE      |L1.1258|
;;;729                OS_Sched();                               /* Find highest priority task ready to run       */
0004e6  f7fff7ff          BL       OS_Sched
                  |L1.1258|
;;;730            }
;;;731            return (OS_ERR_NONE);
0004ea  2000              MOVS     r0,#0
0004ec  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1264|
;;;732        }
;;;733        pq = (OS_Q *)pevent->OSEventPtr;                  /* Point to queue control block                  */
0004f0  6861              LDR      r1,[r4,#4]
;;;734        if (pq->OSQEntries >= pq->OSQSize) {              /* Make sure queue is not full                   */
0004f2  8ac8              LDRH     r0,[r1,#0x16]
0004f4  8a8a              LDRH     r2,[r1,#0x14]
0004f6  4290              CMP      r0,r2
0004f8  d305              BCC      |L1.1286|
;;;735            OS_EXIT_CRITICAL();
0004fa  4638              MOV      r0,r7
0004fc  f7fff7ff          BL       OS_CPU_SR_Restore
;;;736            return (OS_ERR_Q_FULL);
000500  201e              MOVS     r0,#0x1e
000502  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1286|
;;;737        }
;;;738        if ((opt & OS_POST_OPT_FRONT) != 0x00) {          /* Do we post to the FRONT of the queue?         */
000506  f015f015          TST      r5,#2
00050a  d00a              BEQ      |L1.1314|
;;;739            if (pq->OSQOut == pq->OSQStart) {             /* Yes, Post as LIFO, Wrap OUT pointer if we ... */
00050c  684a              LDR      r2,[r1,#4]
00050e  6908              LDR      r0,[r1,#0x10]
000510  4290              CMP      r0,r2
000512  d101              BNE      |L1.1304|
;;;740                pq->OSQOut = pq->OSQEnd;                  /*      ... are at the 1st queue entry           */
000514  6888              LDR      r0,[r1,#8]
000516  6108              STR      r0,[r1,#0x10]
                  |L1.1304|
;;;741            }
;;;742            pq->OSQOut--;
000518  6908              LDR      r0,[r1,#0x10]
00051a  1f02              SUBS     r2,r0,#4
00051c  610a              STR      r2,[r1,#0x10]
;;;743            *pq->OSQOut = pmsg;                           /*      Insert message into queue                */
00051e  6016              STR      r6,[r2,#0]
000520  e009              B        |L1.1334|
                  |L1.1314|
;;;744        } else {                                          /* No,  Post as FIFO                             */
;;;745            *pq->OSQIn++ = pmsg;                          /*      Insert message into queue                */
000522  68c8              LDR      r0,[r1,#0xc]
000524  1d02              ADDS     r2,r0,#4
000526  60ca              STR      r2,[r1,#0xc]
000528  6006              STR      r6,[r0,#0]
;;;746            if (pq->OSQIn == pq->OSQEnd) {                /*      Wrap IN ptr if we are at end of queue    */
00052a  688a              LDR      r2,[r1,#8]
00052c  68c8              LDR      r0,[r1,#0xc]
00052e  4290              CMP      r0,r2
000530  d101              BNE      |L1.1334|
;;;747                pq->OSQIn = pq->OSQStart;
000532  6848              LDR      r0,[r1,#4]
000534  60c8              STR      r0,[r1,#0xc]
                  |L1.1334|
;;;748            }
;;;749        }
;;;750        pq->OSQEntries++;                                 /* Update the nbr of entries in the queue        */
000536  8ac8              LDRH     r0,[r1,#0x16]
000538  1c40              ADDS     r0,r0,#1
00053a  82c8              STRH     r0,[r1,#0x16]
;;;751        OS_EXIT_CRITICAL();
00053c  4638              MOV      r0,r7
00053e  f7fff7ff          BL       OS_CPU_SR_Restore
;;;752        return (OS_ERR_NONE);
000542  2000              MOVS     r0,#0
;;;753    }
000544  e8bde8bd          POP      {r4-r8,pc}
;;;754    #endif
                          ENDP

                  OSQQuery PROC
;;;775    INT8U  OSQQuery (OS_EVENT *pevent, OS_Q_DATA *p_q_data)
;;;776    {
000548  b570              PUSH     {r4-r6,lr}
00054a  4605              MOV      r5,r0
00054c  460c              MOV      r4,r1
;;;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'                            */
00054e  b90d              CBNZ     r5,|L1.1364|
;;;794            return (OS_ERR_PEVENT_NULL);
000550  2004              MOVS     r0,#4
;;;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                    */
;;;801            return (OS_ERR_EVENT_TYPE);
;;;802        }
;;;803        OS_ENTER_CRITICAL();
;;;804        p_q_data->OSEventGrp = pevent->OSEventGrp;         /* Copy message queue wait list                 */
;;;805        psrc                 = &pevent->OSEventTbl[0];
;;;806        pdest                = &p_q_data->OSEventTbl[0];
;;;807        for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
;;;808            *pdest++ = *psrc++;
;;;809        }
;;;810        pq = (OS_Q *)pevent->OSEventPtr;
;;;811        if (pq->OSQEntries > 0) {
;;;812            p_q_data->OSMsg = *pq->OSQOut;                 /* Get next message to return if available      */
;;;813        } else {
;;;814            p_q_data->OSMsg = (void *)0;
;;;815        }
;;;816        p_q_data->OSNMsgs = pq->OSQEntries;
;;;817        p_q_data->OSQSize = pq->OSQSize;
;;;818        OS_EXIT_CRITICAL();
;;;819        return (OS_ERR_NONE);
;;;820    }
000552  bd70              POP      {r4-r6,pc}
                  |L1.1364|
000554  b90c              CBNZ     r4,|L1.1370|
000556  2009              MOVS     r0,#9
000558  bd70              POP      {r4-r6,pc}
                  |L1.1370|
00055a  7828              LDRB     r0,[r5,#0]
00055c  2802              CMP      r0,#2
00055e  d001              BEQ      |L1.1380|
000560  2001              MOVS     r0,#1
000562  bd70              POP      {r4-r6,pc}
                  |L1.1380|
000564  f7fff7ff          BL       OS_CPU_SR_Save
000568  7aa9              LDRB     r1,[r5,#0xa]
00056a  7321              STRB     r1,[r4,#0xc]
00056c  f105f105          ADD      r2,r5,#0xb
000570  f104f104          ADD      r3,r4,#8
000574  2100              MOVS     r1,#0
                  |L1.1398|
000576  f812f812          LDRB     r12,[r2],#1
00057a  f803f803          STRB     r12,[r3],#1
00057e  1c49              ADDS     r1,r1,#1
000580  b2c9              UXTB     r1,r1
000582  2904              CMP      r1,#4
000584  d3f7              BCC      |L1.1398|
000586  6869              LDR      r1,[r5,#4]
000588  8aca              LDRH     r2,[r1,#0x16]
00058a  b11a              CBZ      r2,|L1.1428|
00058c  690a              LDR      r2,[r1,#0x10]
00058e  6812              LDR      r2,[r2,#0]
000590  6022              STR      r2,[r4,#0]
000592  e001              B        |L1.1432|
                  |L1.1428|
000594  2200              MOVS     r2,#0
000596  6022              STR      r2,[r4,#0]
                  |L1.1432|
000598  8aca              LDRH     r2,[r1,#0x16]
00059a  80a2              STRH     r2,[r4,#4]
00059c  8a89              LDRH     r1,[r1,#0x14]
00059e  80e1              STRH     r1,[r4,#6]
0005a0  f7fff7ff          BL       OS_CPU_SR_Restore
0005a4  2000              MOVS     r0,#0
0005a6  bd70              POP      {r4-r6,pc}
;;;821    #endif                                                 /* OS_Q_QUERY_EN                                */
                          ENDP

                  OS_QInit PROC
;;;839    void  OS_QInit (void)
;;;840    {
0005a8  b510              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                          */
0005aa  2160              MOVS     r1,#0x60
0005ac  4809              LDR      r0,|L1.1492|
0005ae  f7fff7ff          BL       OS_MemClr
;;;854        pq1 = &OSQTbl[0];
0005b2  4808              LDR      r0,|L1.1492|
;;;855        pq2 = &OSQTbl[1];
0005b4  4603              MOV      r3,r0
0005b6  f103f103          ADD      r1,r3,#0x18
;;;856        for (i = 0; i < (OS_MAX_QS - 1); i++) {          /* Init. list of free QUEUE control blocks        */
0005ba  2200              MOVS     r2,#0
                  |L1.1468|
;;;857            pq1->OSQPtr = pq2;
0005bc  6001              STR      r1,[r0,#0]
;;;858            pq1++;
0005be  3018              ADDS     r0,r0,#0x18
;;;859            pq2++;
0005c0  3118              ADDS     r1,r1,#0x18
0005c2  1c52              ADDS     r2,r2,#1
0005c4  b292              UXTH     r2,r2
0005c6  2a03              CMP      r2,#3
0005c8  d3f8              BCC      |L1.1468|
;;;860        }
;;;861        pq1->OSQPtr = (OS_Q *)0;
0005ca  2100              MOVS     r1,#0
0005cc  6001              STR      r1,[r0,#0]
;;;862        OSQFreeList = &OSQTbl[0];
0005ce  4802              LDR      r0,|L1.1496|
0005d0  6003              STR      r3,[r0,#0]  ; OSQFreeList
;;;863    #endif
;;;864    }
0005d2  bd10              POP      {r4,pc}
;;;865    #endif                                               /* OS_Q_EN                                        */
                          ENDP

                  |L1.1492|
0005d4  00000000          DCD      OSQTbl
                  |L1.1496|
0005d8  00000000          DCD      OSQFreeList

⌨️ 快捷键说明

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