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

📄 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 页
字号:
;;;264                     OS_EXIT_CRITICAL();
000200  e1a00007          MOV      r0,r7
000204  ebfffffe          BL       OS_CPU_SR_Restore
;;;265                     *perr                  = OS_ERR_TASK_WAITING;
000208  e3a00049          MOV      r0,#0x49
                  |L1.524|
;;;266                     pevent_return          = pevent;
;;;267                 }
;;;268                 break;
;;;269    
;;;270            case OS_DEL_ALWAYS:                                /* Always delete the queue                  */
;;;271                 while (pevent->OSEventGrp != 0) {             /* Ready ALL tasks waiting for queue        */
;;;272                     (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q, OS_STAT_PEND_OK);
;;;273                 }
;;;274    #if OS_EVENT_NAME_SIZE > 1
;;;275                 pevent->OSEventName[0] = '?';                 /* Unknown name                             */
;;;276                 pevent->OSEventName[1] = OS_ASCII_NUL;
;;;277    #endif
;;;278                 pq                     = (OS_Q *)pevent->OSEventPtr;   /* Return OS_Q to free list        */
;;;279                 pq->OSQPtr             = OSQFreeList;
;;;280                 OSQFreeList            = pq;
;;;281                 pevent->OSEventType    = OS_EVENT_TYPE_UNUSED;
;;;282                 pevent->OSEventPtr     = OSEventFreeList;     /* Return Event Control Block to free list  */
;;;283                 pevent->OSEventCnt     = 0;
;;;284                 OSEventFreeList        = pevent;              /* Get next free event control block        */
;;;285                 OS_EXIT_CRITICAL();
;;;286                 if (tasks_waiting == OS_TRUE) {               /* Reschedule only if task(s) were waiting  */
;;;287                     OS_Sched();                               /* Find highest priority task ready to run  */
;;;288                 }
;;;289                 *perr                  = OS_ERR_NONE;
;;;290                 pevent_return          = (OS_EVENT *)0;       /* Queue has been deleted                   */
;;;291                 break;
;;;292    
;;;293            default:
;;;294                 OS_EXIT_CRITICAL();
;;;295                 *perr                  = OS_ERR_INVALID_OPT;
00020c  e5c50000          STRB     r0,[r5,#0]
;;;296                 pevent_return          = pevent;
000210  e1a00004          MOV      r0,r4
                  |L1.532|
000214  e8bd5ff0          POP      {r4-r12,lr}
;;;297                 break;
;;;298        }
;;;299        return (pevent_return);
;;;300    }
000218  e12fff1e          BX       lr
                  |L1.540|
00021c  e3a03000          MOV      r3,#0                 ;272
000220  e3a02004          MOV      r2,#4                 ;272
000224  e1a01003          MOV      r1,r3                 ;272
000228  e1a00004          MOV      r0,r4                 ;272
00022c  ebfffffe          BL       OS_EventTaskRdy
                  |L1.560|
000230  e5d4000a          LDRB     r0,[r4,#0xa]          ;271
000234  e3500000          CMP      r0,#0                 ;271
000238  1afffff7          BNE      |L1.540|
00023c  e5c4800f          STRB     r8,[r4,#0xf]          ;275
000240  e5c4b010          STRB     r11,[r4,#0x10]        ;276
000244  e5940004          LDR      r0,[r4,#4]            ;279
000248  e5991000          LDR      r1,[r9,#0]            ;279  ; OSQFreeList
00024c  e5801000          STR      r1,[r0,#0]            ;280
000250  e5890000          STR      r0,[r9,#0]            ;280  ; OSQFreeList
000254  e5c4b000          STRB     r11,[r4,#0]           ;281
000258  e59a0000          LDR      r0,[r10,#0]           ;282  ; OSEventFreeList
00025c  e5840004          STR      r0,[r4,#4]            ;282
000260  e1c4b0b8          STRH     r11,[r4,#8]           ;283
000264  e1a00007          MOV      r0,r7                 ;285
000268  e58a4000          STR      r4,[r10,#0]           ;285  ; OSEventFreeList
00026c  ebfffffe          BL       OS_CPU_SR_Restore
000270  e3560001          CMP      r6,#1                 ;286
000274  0bfffffe          BLEQ     OS_Sched
                  |L1.632|
000278  e3a00000          MOV      r0,#0                 ;290
00027c  e5c5b000          STRB     r11,[r5,#0]           ;289
000280  eaffffe3          B        |L1.532|
                  |L1.644|
000284  e1a00007          MOV      r0,r7                 ;294
000288  ebfffffe          BL       OS_CPU_SR_Restore
00028c  e3a00007          MOV      r0,#7                 ;295
000290  eaffffdd          B        |L1.524|
;;;301    #endif
                          ENDP

                  OSQFlush PROC
;;;324    INT8U  OSQFlush (OS_EVENT *pevent)
;;;325    {
000294  e92d4010          PUSH     {r4,lr}
000298  e1a04000          MOV      r4,r0
;;;326        OS_Q      *pq;
;;;327    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;328        OS_CPU_SR  cpu_sr = 0;
;;;329    #endif
;;;330    
;;;331    
;;;332    
;;;333    #if OS_ARG_CHK_EN > 0
;;;334        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
;;;335            return (OS_ERR_PEVENT_NULL);
;;;336        }
;;;337        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* Validate event block type                     */
;;;338            return (OS_ERR_EVENT_TYPE);
;;;339        }
;;;340    #endif
;;;341        OS_ENTER_CRITICAL();
00029c  ebfffffe          BL       OS_CPU_SR_Save
;;;342        pq             = (OS_Q *)pevent->OSEventPtr;      /* Point to queue storage structure              */
;;;343        pq->OSQIn      = pq->OSQStart;
0002a0  e5941004          LDR      r1,[r4,#4]
0002a4  e5912004          LDR      r2,[r1,#4]
;;;344        pq->OSQOut     = pq->OSQStart;
0002a8  e581200c          STR      r2,[r1,#0xc]
0002ac  e5812010          STR      r2,[r1,#0x10]
;;;345        pq->OSQEntries = 0;
0002b0  e3a02000          MOV      r2,#0
0002b4  e1c121b6          STRH     r2,[r1,#0x16]
;;;346        OS_EXIT_CRITICAL();
0002b8  ebfffffe          BL       OS_CPU_SR_Restore
;;;347        return (OS_ERR_NONE);
0002bc  e8bd4010          POP      {r4,lr}
0002c0  e3a00000          MOV      r0,#0
;;;348    }
0002c4  e12fff1e          BX       lr
;;;349    #endif
                          ENDP

                  OSQPend PROC
;;;388    void  *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;389    {
0002c8  e92d47f0          PUSH     {r4-r10,lr}
0002cc  e1a07000          MOV      r7,r0
;;;390        void      *pmsg;
;;;391        OS_Q      *pq;
;;;392        INT8U      pend_stat;
;;;393    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;394        OS_CPU_SR  cpu_sr = 0;
;;;395    #endif
;;;396    
;;;397    
;;;398    
;;;399    #if OS_ARG_CHK_EN > 0
;;;400        if (perr == (INT8U *)0) {                    /* Validate 'perr'                                    */
;;;401            return ((void *)0);
;;;402        }
;;;403        if (pevent == (OS_EVENT *)0) {               /* Validate 'pevent'                                  */
;;;404            *perr = OS_ERR_PEVENT_NULL;
;;;405            return ((void *)0);
;;;406        }
;;;407        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type                          */
;;;408            *perr = OS_ERR_EVENT_TYPE;
;;;409            return ((void *)0);
;;;410        }
;;;411    #endif
;;;412        if (OSIntNesting > 0) {                      /* See if called from ISR ...                         */
0002d0  e59f0544          LDR      r0,|L1.2076|
0002d4  e1a08001          MOV      r8,r1                 ;389
0002d8  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0002dc  e1a04002          MOV      r4,r2                 ;389
0002e0  e3500000          CMP      r0,#0
;;;413            *perr = OS_ERR_PEND_ISR;                 /* ... can't PEND from an ISR                         */
0002e4  13a00002          MOVNE    r0,#2
;;;414            return ((void *)0);
0002e8  1a000004          BNE      |L1.768|
;;;415        }
;;;416        if (OSLockNesting > 0) {                     /* See if called with scheduler locked ...            */
0002ec  e59f0534          LDR      r0,|L1.2088|
0002f0  e5d00000          LDRB     r0,[r0,#0]  ; OSLockNesting
0002f4  e3500000          CMP      r0,#0
0002f8  0a000004          BEQ      |L1.784|
;;;417            *perr = OS_ERR_PEND_LOCKED;              /* ... can't PEND when locked                         */
0002fc  e3a0000d          MOV      r0,#0xd
                  |L1.768|
000300  e5c40000          STRB     r0,[r4,#0]            ;413
;;;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            pmsg = *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            *perr = OS_ERR_NONE;
;;;430            return (pmsg);                           /* 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                     *perr = OS_ERR_TIMEOUT;         /*     Indicate a timeout occured                     */
;;;447                     break;
;;;448    
;;;449                case OS_STAT_PEND_ABORT:
;;;450                     *perr = OS_ERR_PEND_ABORT;      /*     Indicate that we aborted                       */
;;;451                     break;
;;;452            }
;;;453            return ((void *)0);                      /*     No message received                            */
000304  e3a00000          MOV      r0,#0
                  |L1.776|
000308  e8bd47f0          POP      {r4-r10,lr}
;;;454        }
;;;455        pmsg                    = 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        *perr                   = OS_ERR_NONE;
;;;461        return (pmsg);                               /*     Return message received                        */
;;;462    }
00030c  e12fff1e          BX       lr
                  |L1.784|
000310  ebfffffe          BL       OS_CPU_SR_Save
000314  e5971004          LDR      r1,[r7,#4]            ;421
000318  e1a05000          MOV      r5,r0                 ;420
00031c  e1d101b6          LDRH     r0,[r1,#0x16]         ;422
000320  e3a06000          MOV      r6,#0                 ;422
000324  e3500000          CMP      r0,#0                 ;422
000328  0a00000f          BEQ      |L1.876|
00032c  e5910010          LDR      r0,[r1,#0x10]         ;423
000330  e2802004          ADD      r2,r0,#4              ;423
000334  e5812010          STR      r2,[r1,#0x10]         ;423
000338  e5907000          LDR      r7,[r0,#0]            ;423
00033c  e1d101b6          LDRH     r0,[r1,#0x16]         ;424
000340  e2400001          SUB      r0,r0,#1              ;424
000344  e1c101b6          STRH     r0,[r1,#0x16]         ;424
000348  e5910008          LDR      r0,[r1,#8]            ;425
00034c  e1520000          CMP      r2,r0                 ;425
000350  05910004          LDREQ    r0,[r1,#4]            ;426
000354  05810010          STREQ    r0,[r1,#0x10]         ;426
000358  e1a00005          MOV      r0,r5                 ;428
00035c  ebfffffe          BL       OS_CPU_SR_Restore
000360  e1a00007          MOV      r0,r7                 ;430
000364  e5c46000          STRB     r6,[r4,#0]            ;429
000368  eaffffe6          B        |L1.776|
                  |L1.876|
00036c  e59f94b8          LDR      r9,|L1.2092|
000370  e5991000          LDR      r1,[r9,#0]            ;432  ; OSTCBCur
000374  e5d1002c          LDRB     r0,[r1,#0x2c]         ;432
000378  e3800004          ORR      r0,r0,#4              ;432
00037c  e5c1002c          STRB     r0,[r1,#0x2c]         ;432
000380  e5c1602d          STRB     r6,[r1,#0x2d]         ;433
000384  e1a00007          MOV      r0,r7                 ;435
000388  e1c182ba          STRH     r8,[r1,#0x2a]         ;434
00038c  ebfffffe          BL       OS_EventTaskWait
000390  e1a00005          MOV      r0,r5                 ;436
000394  ebfffffe          BL       OS_CPU_SR_Restore
000398  ebfffffe          BL       OS_Sched
00039c  ebfffffe          BL       OS_CPU_SR_Save
0003a0  e5991000          LDR      r1,[r9,#0]            ;439  ; OSTCBCur
0003a4  e1a08000          MOV      r8,r0                 ;438
0003a8  e5d1502d          LDRB     r5,[r1,#0x2d]         ;439
0003ac  e3550000          CMP      r5,#0                 ;439
0003b0  0a000007          BEQ      |L1.980|
0003b4  e1a00007          MOV      r0,r7                 ;441
0003b8  ebfffffe          BL       OS_EventTOAbort
0003bc  e1a00008          MOV      r0,r8                 ;442
0003c0  ebfffffe          BL       OS_CPU_SR_Restore
0003c4  e3550002          CMP      r5,#2                 ;443
0003c8  03a0000e          MOVEQ    r0,#0xe               ;450
0003cc  13a0000a          MOVNE    r0,#0xa               ;446
0003d0  eaffffca          B        |L1.768|
                  |L1.980|
0003d4  e5915020          LDR      r5,[r1,#0x20]         ;456
0003d8  e5816020          STR      r6,[r1,#0x20]         ;456
0003dc  e5c1602c          STRB     r6,[r1,#0x2c]         ;457
0003e0  e1a00008          MOV      r0,r8                 ;459
0003e4  e581601c          STR      r6,[r1,#0x1c]         ;459
0003e8  ebfffffe          BL       OS_CPU_SR_Restore
0003ec  e1a00005          MOV      r0,r5                 ;461
0003f0  e5c46000          STRB     r6,[r4,#0]            ;460
0003f4  eaffffc3          B        |L1.776|
;;;463    /*$PAGE*/
                          ENDP

                  OSQPendAbort PROC
;;;497    INT8U  OSQPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;498    {
0003f8  e92d41f0          PUSH     {r4-r8,lr}

⌨️ 快捷键说明

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