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

📄 os_q.txt

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 TXT
📖 第 1 页 / 共 5 页
字号:
000458  e3560000          CMP      r6,#0
00045c  1a000002          BNE      |L1.1132|
;;;401            return ((void *)0);
000460  e3a00000          MOV      r0,#0
                  |L1.1124|
000464  e8bd47f0          POP      {r4-r10,lr}
;;;402        }
;;;403        if (pevent == (OS_EVENT *)0) {               /* Validate 'pevent'                                  */
;;;404            *err = OS_ERR_PEVENT_NULL;
;;;405            return ((void *)0);
;;;406        }
;;;407        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type                          */
;;;408            *err = OS_ERR_EVENT_TYPE;
;;;409            return ((void *)0);
;;;410        }
;;;411    #endif
;;;412        if (OSIntNesting > 0) {                      /* See if called from ISR ...                         */
;;;413            *err = OS_ERR_PEND_ISR;                  /* ... can't PEND from an ISR                         */
;;;414            return ((void *)0);
;;;415        }
;;;416        if (OSLockNesting > 0) {                     /* See if called with scheduler locked ...            */
;;;417            *err = OS_ERR_PEND_LOCKED;               /* ... can't PEND when locked                         */
;;;418            return ((void *)0);
;;;419        }
;;;420        OS_ENTER_CRITICAL();
;;;421        pq = (OS_Q *)pevent->OSEventPtr;             /* Point at queue control block                       */
;;;422        if (pq->OSQEntries > 0) {                    /* See if any messages in the queue                   */
;;;423            msg = *pq->OSQOut++;                     /* Yes, extract oldest message from the queue         */
;;;424            pq->OSQEntries--;                        /* Update the number of entries in the queue          */
;;;425            if (pq->OSQOut == pq->OSQEnd) {          /* Wrap OUT pointer if we are at the end of the queue */
;;;426                pq->OSQOut = pq->OSQStart;
;;;427            }
;;;428            OS_EXIT_CRITICAL();
;;;429            *err = OS_ERR_NONE;
;;;430            return (msg);                            /* Return message received                            */
;;;431        }
;;;432        OSTCBCur->OSTCBStat     |= OS_STAT_Q;        /* Task will have to pend for a message to be posted  */
;;;433        OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;
;;;434        OSTCBCur->OSTCBDly       = timeout;          /* Load timeout into TCB                              */
;;;435        OS_EventTaskWait(pevent);                    /* Suspend task until event or timeout occurs         */
;;;436        OS_EXIT_CRITICAL();
;;;437        OS_Sched();                                  /* Find next highest priority task ready to run       */
;;;438        OS_ENTER_CRITICAL();
;;;439        if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* Was task readied because timed-out or aborted?*/
;;;440            pend_stat = OSTCBCur->OSTCBStatPend;
;;;441            OS_EventTOAbort(pevent);
;;;442            OS_EXIT_CRITICAL();
;;;443            switch (pend_stat) {
;;;444                case OS_STAT_PEND_TO:
;;;445                default:
;;;446                     *err = OS_ERR_TIMEOUT;          /*     Indicate a timeout occured                     */
;;;447                     break;
;;;448    
;;;449                case OS_STAT_PEND_ABORT:
;;;450                     *err = OS_ERR_PEND_ABORT;       /*     Indicate that we aborted                       */
;;;451                     break;
;;;452            }
;;;453            return ((void *)0);                      /*     No message received                            */
;;;454        }
;;;455        msg                     = OSTCBCur->OSTCBMsg;/* No, Extract message from TCB (Put there by QPost)  */
;;;456        OSTCBCur->OSTCBMsg      = (void *)0;
;;;457        OSTCBCur->OSTCBStat     = OS_STAT_RDY;
;;;458        OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;     /*     No longer waiting for event                    */
;;;459        OS_EXIT_CRITICAL();
;;;460        *err                    = OS_ERR_NONE;
;;;461        return (msg);                                /*     Return message received                        */
;;;462    }
000468  e12fff1e          BX       lr
                  |L1.1132|
00046c  e3540000          CMP      r4,#0
000470  1a000003          BNE      |L1.1156|
000474  e3a00004          MOV      r0,#4
000478  e5c60000          STRB     r0,[r6,#0]
00047c  e3a00000          MOV      r0,#0
000480  eafffff7          B        |L1.1124|
                  |L1.1156|
000484  e5d40000          LDRB     r0,[r4,#0]
000488  e3500002          CMP      r0,#2
00048c  0a000003          BEQ      |L1.1184|
000490  e3a00001          MOV      r0,#1
000494  e5c60000          STRB     r0,[r6,#0]
000498  e3a00000          MOV      r0,#0
00049c  eafffff0          B        |L1.1124|
                  |L1.1184|
0004a0  e59f06fc          LDR      r0,|L1.2980|
0004a4  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0004a8  e3500000          CMP      r0,#0
0004ac  da000003          BLE      |L1.1216|
0004b0  e3a00002          MOV      r0,#2
0004b4  e5c60000          STRB     r0,[r6,#0]
0004b8  e3a00000          MOV      r0,#0
0004bc  eaffffe8          B        |L1.1124|
                  |L1.1216|
0004c0  e59f06e8          LDR      r0,|L1.2992|
0004c4  e5d00000          LDRB     r0,[r0,#0]  ; OSLockNesting
0004c8  e3500000          CMP      r0,#0
0004cc  da000003          BLE      |L1.1248|
0004d0  e3a0000d          MOV      r0,#0xd
0004d4  e5c60000          STRB     r0,[r6,#0]
0004d8  e3a00000          MOV      r0,#0
0004dc  eaffffe0          B        |L1.1124|
                  |L1.1248|
0004e0  ebfffffe          BL       OS_CPU_SR_Save
0004e4  e1a0a000          MOV      r10,r0
0004e8  e5948004          LDR      r8,[r4,#4]
0004ec  e1d801b6          LDRH     r0,[r8,#0x16]
0004f0  e3500000          CMP      r0,#0
0004f4  da000012          BLE      |L1.1348|
0004f8  e5980010          LDR      r0,[r8,#0x10]
0004fc  e2801004          ADD      r1,r0,#4
000500  e5881010          STR      r1,[r8,#0x10]
000504  e5907000          LDR      r7,[r0,#0]
000508  e1d801b6          LDRH     r0,[r8,#0x16]
00050c  e2400001          SUB      r0,r0,#1
000510  e1c801b6          STRH     r0,[r8,#0x16]
000514  e5980010          LDR      r0,[r8,#0x10]
000518  e5981008          LDR      r1,[r8,#8]
00051c  e1500001          CMP      r0,r1
000520  1a000001          BNE      |L1.1324|
000524  e5980004          LDR      r0,[r8,#4]
000528  e5880010          STR      r0,[r8,#0x10]
                  |L1.1324|
00052c  e1a0000a          MOV      r0,r10
000530  ebfffffe          BL       OS_CPU_SR_Restore
000534  e3a00000          MOV      r0,#0
000538  e5c60000          STRB     r0,[r6,#0]
00053c  e1a00007          MOV      r0,r7
000540  eaffffc7          B        |L1.1124|
                  |L1.1348|
000544  e59f0668          LDR      r0,|L1.2996|
000548  e5900000          LDR      r0,[r0,#0]  ; OSTCBCur
00054c  e5d0002c          LDRB     r0,[r0,#0x2c]
000550  e3800004          ORR      r0,r0,#4
000554  e59f1658          LDR      r1,|L1.2996|
000558  e5911000          LDR      r1,[r1,#0]  ; OSTCBCur
00055c  e5c1002c          STRB     r0,[r1,#0x2c]
000560  e3a00000          MOV      r0,#0
000564  e59f1648          LDR      r1,|L1.2996|
000568  e5911000          LDR      r1,[r1,#0]  ; OSTCBCur
00056c  e5c1002d          STRB     r0,[r1,#0x2d]
000570  e59f063c          LDR      r0,|L1.2996|
000574  e5900000          LDR      r0,[r0,#0]  ; OSTCBCur
000578  e1c052ba          STRH     r5,[r0,#0x2a]
00057c  e1a00004          MOV      r0,r4
000580  ebfffffe          BL       OS_EventTaskWait
000584  e1a0000a          MOV      r0,r10
000588  ebfffffe          BL       OS_CPU_SR_Restore
00058c  ebfffffe          BL       OS_Sched
000590  ebfffffe          BL       OS_CPU_SR_Save
000594  e1a0a000          MOV      r10,r0
000598  e59f0614          LDR      r0,|L1.2996|
00059c  e5900000          LDR      r0,[r0,#0]  ; OSTCBCur
0005a0  e5d0002d          LDRB     r0,[r0,#0x2d]
0005a4  e3500000          CMP      r0,#0
0005a8  0a000017          BEQ      |L1.1548|
0005ac  e59f0600          LDR      r0,|L1.2996|
0005b0  e5900000          LDR      r0,[r0,#0]  ; OSTCBCur
0005b4  e5d0902d          LDRB     r9,[r0,#0x2d]
0005b8  e1a00004          MOV      r0,r4
0005bc  ebfffffe          BL       OS_EventTOAbort
0005c0  e1a0000a          MOV      r0,r10
0005c4  ebfffffe          BL       OS_CPU_SR_Restore
0005c8  e3590001          CMP      r9,#1
0005cc  0a000002          BEQ      |L1.1500|
0005d0  e3590002          CMP      r9,#2
0005d4  0a000005          BEQ      |L1.1520|
0005d8  ea000001          B        |L1.1508|
                  |L1.1500|
0005dc  e1a00000          MOV      r0,r0
0005e0  e1a00000          MOV      r0,r0
                  |L1.1508|
0005e4  e3a0000a          MOV      r0,#0xa
0005e8  e5c60000          STRB     r0,[r6,#0]
0005ec  ea000003          B        |L1.1536|
                  |L1.1520|
0005f0  e1a00000          MOV      r0,r0
0005f4  e3a0000e          MOV      r0,#0xe
0005f8  e5c60000          STRB     r0,[r6,#0]
0005fc  e1a00000          MOV      r0,r0
                  |L1.1536|
000600  e1a00000          MOV      r0,r0
000604  e3a00000          MOV      r0,#0
000608  eaffff95          B        |L1.1124|
                  |L1.1548|
00060c  e59f05a0          LDR      r0,|L1.2996|
000610  e5900000          LDR      r0,[r0,#0]  ; OSTCBCur
000614  e5907020          LDR      r7,[r0,#0x20]
000618  e3a00000          MOV      r0,#0
00061c  e59f1590          LDR      r1,|L1.2996|
000620  e5911000          LDR      r1,[r1,#0]  ; OSTCBCur
000624  e5810020          STR      r0,[r1,#0x20]
000628  e59f1584          LDR      r1,|L1.2996|
00062c  e5911000          LDR      r1,[r1,#0]  ; OSTCBCur
000630  e5c1002c          STRB     r0,[r1,#0x2c]
000634  e59f1578          LDR      r1,|L1.2996|
000638  e5911000          LDR      r1,[r1,#0]  ; OSTCBCur
00063c  e581001c          STR      r0,[r1,#0x1c]
000640  e1a0000a          MOV      r0,r10
000644  ebfffffe          BL       OS_CPU_SR_Restore
000648  e3a00000          MOV      r0,#0
00064c  e5c60000          STRB     r0,[r6,#0]
000650  e1a00007          MOV      r0,r7
000654  eaffff82          B        |L1.1124|
                          ENDP

                  OSQPendAbort PROC
;;;497    INT8U  OSQPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;498    {
000658  e92d41f0          PUSH     {r4-r8,lr}
00065c  e1a04000          MOV      r4,r0
000660  e1a05001          MOV      r5,r1
000664  e1a06002          MOV      r6,r2
;;;499        INT8U      nbr_tasks;
;;;500    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;501        OS_CPU_SR  cpu_sr = 0;
000668  e3a08000          MOV      r8,#0
;;;502    #endif
;;;503    
;;;504    
;;;505    
;;;506    #if OS_ARG_CHK_EN > 0
;;;507        if (err == (INT8U *)0) {                               /* Validate 'err'                           */
00066c  e3560000          CMP      r6,#0
000670  1a000002          BNE      |L1.1664|
;;;508            return (0);
000674  e3a00000          MOV      r0,#0
                  |L1.1656|
000678  e8bd41f0          POP      {r4-r8,lr}
;;;509        }
;;;510        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;511            *err = OS_ERR_PEVENT_NULL;
;;;512            return (0);
;;;513        }
;;;514    #endif
;;;515        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {          /* Validate event block type                */
;;;516            *err = OS_ERR_EVENT_TYPE;
;;;517            return (0);
;;;518        }
;;;519        OS_ENTER_CRITICAL();
;;;520        if (pevent->OSEventGrp != 0) {                         /* See if any task waiting on queue?        */
;;;521            nbr_tasks = 0;
;;;522            switch (opt) {
;;;523                case OS_PEND_OPT_BROADCAST:                    /* Do we need to abort ALL waiting tasks?   */
;;;524                     while (pevent->OSEventGrp != 0) {         /* Yes, ready ALL tasks waiting on queue    */
;;;525                         (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q, OS_STAT_PEND_ABORT);
;;;526                         nbr_tasks++;
;;;527                     }
;;;528                     break;
;;;529                   
;;;530                case OS_PEND_OPT_NONE:                         /* No,  ready HPT       waiting on queue    */
;;;531                default:   
;;;532                     (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q, OS_STAT_PEND_ABORT);
;;;533                     nbr_tasks++;
;;;534                     break;
;;;535            }
;;;536            OS_EXIT_CRITICAL();
;;;537            OS_Sched();                                        /* Find HPT ready to run                    */
;;;538            *err = OS_ERR_PEND_ABORT;
;;;539            return (nbr_tasks);
;;;540        }
;;;541        OS_EXIT_CRITICAL();
;;;542        *err = OS_ERR_NONE;
;;;543        return (0);                                            /* No tasks waiting on queue                */
;;;544    }
00067c  e12fff1e          BX       lr
                  |L1.1664|
000680  e3540000          CMP      r4,#0
000684  1a000003          BNE      |L1.1688|
000688  e3a00004          MOV      r0,#4
00068c  e5c60000          STRB     r0,[r6,#0]
000690  e3a00000          MOV      r0,#0

⌨️ 快捷键说明

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