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

📄 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 页
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 919] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_q.o --depend=.\rvmdk\os_q.d --device=DARMP --apcs=interwork -I. -I..\BSP -I..\..\..\..\..\uCOS-II\Ports\ARM\Generic\RealView -I..\..\..\..\..\uCOS-II\Source -I..\..\..\..\..\uCOSView\Source -I..\..\..\..\..\uCOSView\Ports\ARM7\LPC2000\IAR -I..\..\..\..\..\uC-CPU -I..\..\..\..\..\uC-CPU\ARM\RealView -I..\..\..\..\..\uC-LIB -I..\..\..\..\..\uC-Probe\Target\Plugins\uCOS-II -IC:\Keil\ARM\INC\Philips --omf_browse=.\rvmdk\os_q.crf ..\..\..\..\..\uCOS-II\Source\os_q.c]
                          ARM

                          AREA ||.text||, CODE, READONLY, ALIGN=2

                  OSQAccept PROC
;;;61     void  *OSQAccept (OS_EVENT *pevent, INT8U *perr)
;;;62     {
000000  e92d4070          PUSH     {r4-r6,lr}
000004  e1a05000          MOV      r5,r0
;;;63         void      *pmsg;
;;;64         OS_Q      *pq;
;;;65     #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;66         OS_CPU_SR  cpu_sr = 0;
;;;67     #endif
;;;68     
;;;69     
;;;70     
;;;71     #if OS_ARG_CHK_EN > 0
;;;72         if (perr == (INT8U *)0) {                    /* Validate 'perr'                                    */
;;;73             return ((void *)0);
;;;74         }
;;;75         if (pevent == (OS_EVENT *)0) {               /* Validate 'pevent'                                  */
;;;76             *perr = OS_ERR_PEVENT_NULL;
;;;77             return ((void *)0);
;;;78         }
;;;79     #endif
;;;80         if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type                          */
000008  e5d00000          LDRB     r0,[r0,#0]
00000c  e1a04001          MOV      r4,r1                 ;62
000010  e3500002          CMP      r0,#2
;;;81             *perr = OS_ERR_EVENT_TYPE;
000014  13a00001          MOVNE    r0,#1
000018  15c40000          STRBNE   r0,[r4,#0]
;;;82             return ((void *)0);
00001c  13a00000          MOVNE    r0,#0
000020  1a000016          BNE      |L1.128|
;;;83         }
;;;84         OS_ENTER_CRITICAL();
000024  ebfffffe          BL       OS_CPU_SR_Save
;;;85         pq = (OS_Q *)pevent->OSEventPtr;             /* Point at queue control block                       */
000028  e5951004          LDR      r1,[r5,#4]
;;;86         if (pq->OSQEntries > 0) {                    /* See if any messages in the queue                   */
00002c  e1d121b6          LDRH     r2,[r1,#0x16]
000030  e3520000          CMP      r2,#0
;;;87             pmsg = *pq->OSQOut++;                    /* Yes, extract oldest message from the queue         */
;;;88             pq->OSQEntries--;                        /* Update the number of entries in the queue          */
;;;89             if (pq->OSQOut == pq->OSQEnd) {          /* Wrap OUT pointer if we are at the end of the queue */
;;;90                 pq->OSQOut = pq->OSQStart;
;;;91             }
;;;92             *perr = OS_ERR_NONE;
;;;93         } else {
;;;94             *perr = OS_ERR_Q_EMPTY;
000034  03a0101f          MOVEQ    r1,#0x1f
;;;95             pmsg  = (void *)0;                       /* Queue is empty                                     */
000038  03a05000          MOVEQ    r5,#0
00003c  05c41000          STRBEQ   r1,[r4,#0]            ;94
000040  0a00000c          BEQ      |L1.120|
000044  e5913010          LDR      r3,[r1,#0x10]         ;87
000048  e2832004          ADD      r2,r3,#4              ;87
00004c  e5812010          STR      r2,[r1,#0x10]         ;87
000050  e5935000          LDR      r5,[r3,#0]            ;87
000054  e1d131b6          LDRH     r3,[r1,#0x16]         ;88
000058  e2433001          SUB      r3,r3,#1              ;88
00005c  e1c131b6          STRH     r3,[r1,#0x16]         ;88
000060  e5913008          LDR      r3,[r1,#8]            ;89
000064  e1520003          CMP      r2,r3                 ;89
000068  05912004          LDREQ    r2,[r1,#4]            ;90
00006c  05812010          STREQ    r2,[r1,#0x10]         ;90
000070  e3a01000          MOV      r1,#0                 ;92
000074  e5c41000          STRB     r1,[r4,#0]            ;92
                  |L1.120|
;;;96         }
;;;97         OS_EXIT_CRITICAL();
000078  ebfffffe          BL       OS_CPU_SR_Restore
;;;98         return (pmsg);                               /* Return message received (or NULL)                  */
00007c  e1a00005          MOV      r0,r5
                  |L1.128|
000080  e8bd4070          POP      {r4-r6,lr}
;;;99     }
000084  e12fff1e          BX       lr
;;;100    #endif
                          ENDP

                  OSQCreate PROC
;;;121    OS_EVENT  *OSQCreate (void **start, INT16U size)
;;;122    {
000088  e92d41f0          PUSH     {r4-r8,lr}
00008c  e1a06000          MOV      r6,r0
;;;123        OS_EVENT  *pevent;
;;;124        OS_Q      *pq;
;;;125    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;126        OS_CPU_SR  cpu_sr = 0;
;;;127    #endif
;;;128    
;;;129    
;;;130    
;;;131        if (OSIntNesting > 0) {                      /* See if called from ISR ...                         */
000090  e59f0784          LDR      r0,|L1.2076|
000094  e1a08001          MOV      r8,r1                 ;122
000098  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
00009c  e3500000          CMP      r0,#0
;;;132            return ((OS_EVENT *)0);                  /* ... can't CREATE from an ISR                       */
0000a0  13a00000          MOVNE    r0,#0
0000a4  1a000028          BNE      |L1.332|
;;;133        }
;;;134        OS_ENTER_CRITICAL();
0000a8  ebfffffe          BL       OS_CPU_SR_Save
;;;135        pevent = OSEventFreeList;                    /* Get next free event control block                  */
0000ac  e59f776c          LDR      r7,|L1.2080|
0000b0  e5974000          LDR      r4,[r7,#0]  ; OSEventFreeList
;;;136        if (OSEventFreeList != (OS_EVENT *)0) {      /* See if pool of free ECB pool was empty             */
0000b4  e3540000          CMP      r4,#0
;;;137            OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
0000b8  15941004          LDRNE    r1,[r4,#4]
0000bc  15871000          STRNE    r1,[r7,#0]  ; OSEventFreeList
;;;138        }
;;;139        OS_EXIT_CRITICAL();
0000c0  ebfffffe          BL       OS_CPU_SR_Restore
;;;140        if (pevent != (OS_EVENT *)0) {               /* See if we have an event control block              */
0000c4  e3540000          CMP      r4,#0
0000c8  0a00001e          BEQ      |L1.328|
;;;141            OS_ENTER_CRITICAL();
0000cc  ebfffffe          BL       OS_CPU_SR_Save
;;;142            pq = OSQFreeList;                        /* Get a free queue control block                     */
0000d0  e59f174c          LDR      r1,|L1.2084|
0000d4  e5915000          LDR      r5,[r1,#0]  ; OSQFreeList
;;;143            if (pq != (OS_Q *)0) {                   /* Were we able to get a queue control block ?        */
0000d8  e3550000          CMP      r5,#0
0000dc  0a000014          BEQ      |L1.308|
;;;144                OSQFreeList            = OSQFreeList->OSQPtr; /* Yes, Adjust free list pointer to next free*/
0000e0  e5952000          LDR      r2,[r5,#0]
0000e4  e5812000          STR      r2,[r1,#0]  ; OSQFreeList
;;;145                OS_EXIT_CRITICAL();
0000e8  ebfffffe          BL       OS_CPU_SR_Restore
;;;146                pq->OSQStart           = start;               /*      Initialize the queue                 */
;;;147                pq->OSQEnd             = &start[size];
0000ec  e0860108          ADD      r0,r6,r8,LSL #2
;;;148                pq->OSQIn              = start;
;;;149                pq->OSQOut             = start;
0000f0  e2851008          ADD      r1,r5,#8
0000f4  e5856004          STR      r6,[r5,#4]            ;146
0000f8  e8810041          STM      r1,{r0,r6}
0000fc  e5856010          STR      r6,[r5,#0x10]
;;;150                pq->OSQSize            = size;
;;;151                pq->OSQEntries         = 0;
000100  e3a00000          MOV      r0,#0
000104  e1c581b4          STRH     r8,[r5,#0x14]         ;150
;;;152                pevent->OSEventType    = OS_EVENT_TYPE_Q;
000108  e3a01002          MOV      r1,#2
00010c  e1c501b6          STRH     r0,[r5,#0x16]         ;151
000110  e5c41000          STRB     r1,[r4,#0]
;;;153                pevent->OSEventCnt     = 0;
000114  e1c400b8          STRH     r0,[r4,#8]
;;;154                pevent->OSEventPtr     = pq;
;;;155    #if OS_EVENT_NAME_SIZE > 1
;;;156                pevent->OSEventName[0] = '?';                  /* Unknown name                             */
000118  e3a0103f          MOV      r1,#0x3f
00011c  e5845004          STR      r5,[r4,#4]
000120  e5c4100f          STRB     r1,[r4,#0xf]
;;;157                pevent->OSEventName[1] = OS_ASCII_NUL;
000124  e5c40010          STRB     r0,[r4,#0x10]
;;;158    #endif
;;;159                OS_EventWaitListInit(pevent);                 /*      Initalize the wait list              */
000128  e1a00004          MOV      r0,r4
00012c  ebfffffe          BL       OS_EventWaitListInit
000130  ea000004          B        |L1.328|
                  |L1.308|
;;;160            } else {
;;;161                pevent->OSEventPtr = (void *)OSEventFreeList; /* No,  Return event control block on error  */
000134  e5971000          LDR      r1,[r7,#0]  ; OSEventFreeList
;;;162                OSEventFreeList    = pevent;
000138  e5841004          STR      r1,[r4,#4]
00013c  e5874000          STR      r4,[r7,#0]  ; OSEventFreeList
;;;163                OS_EXIT_CRITICAL();
000140  ebfffffe          BL       OS_CPU_SR_Restore
;;;164                pevent = (OS_EVENT *)0;
000144  e3a04000          MOV      r4,#0
                  |L1.328|
;;;165            }
;;;166        }
;;;167        return (pevent);
000148  e1a00004          MOV      r0,r4
                  |L1.332|
00014c  e8bd41f0          POP      {r4-r8,lr}
;;;168    }
000150  e12fff1e          BX       lr
;;;169    /*$PAGE*/
                          ENDP

                  OSQDel PROC
;;;212    OS_EVENT  *OSQDel (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;213    {
000154  e92d5ff0          PUSH     {r4-r12,lr}
000158  e1a04000          MOV      r4,r0
;;;214        BOOLEAN    tasks_waiting;
;;;215        OS_EVENT  *pevent_return;
;;;216        OS_Q      *pq;
;;;217    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;218        OS_CPU_SR  cpu_sr = 0;
;;;219    #endif
;;;220    
;;;221    
;;;222    
;;;223    #if OS_ARG_CHK_EN > 0
;;;224        if (perr == (INT8U *)0) {                              /* Validate 'perr'                          */
;;;225            return (pevent);
;;;226        }
;;;227        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;228            *perr = OS_ERR_PEVENT_NULL;
;;;229            return (pevent);
;;;230        }
;;;231    #endif
;;;232        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {          /* Validate event block type                */
00015c  e5d00000          LDRB     r0,[r0,#0]
000160  e1a08001          MOV      r8,r1                 ;213
000164  e1a05002          MOV      r5,r2                 ;213
000168  e3500002          CMP      r0,#2
;;;233            *perr = OS_ERR_EVENT_TYPE;
00016c  13a00001          MOVNE    r0,#1
;;;234            return (pevent);
000170  1a000025          BNE      |L1.524|
;;;235        }
;;;236        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
000174  e59f06a0          LDR      r0,|L1.2076|
000178  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
00017c  e3500000          CMP      r0,#0
;;;237            *perr = OS_ERR_DEL_ISR;                            /* ... can't DELETE from an ISR             */
000180  13a0000f          MOVNE    r0,#0xf
;;;238            return (pevent);
000184  1a000020          BNE      |L1.524|
;;;239        }
;;;240        OS_ENTER_CRITICAL();
000188  ebfffffe          BL       OS_CPU_SR_Save
00018c  e1a07000          MOV      r7,r0
;;;241        if (pevent->OSEventGrp != 0) {                         /* See if any tasks waiting on queue        */
000190  e5d4000a          LDRB     r0,[r4,#0xa]
;;;242            tasks_waiting = OS_TRUE;                           /* Yes                                      */
;;;243        } else {
;;;244            tasks_waiting = OS_FALSE;                          /* No                                       */
;;;245        }
;;;246        switch (opt) {
000194  e59f9688          LDR      r9,|L1.2084|
000198  e59fa680          LDR      r10,|L1.2080|
00019c  e2906000          ADDS     r6,r0,#0              ;241
0001a0  13a06001          MOVNE    r6,#1                 ;242
0001a4  e1b00008          MOVS     r0,r8
0001a8  e3a0803f          MOV      r8,#0x3f
0001ac  e3a0b000          MOV      r11,#0
0001b0  0a000002          BEQ      |L1.448|
0001b4  e3500001          CMP      r0,#1
0001b8  1a000031          BNE      |L1.644|
0001bc  ea00001b          B        |L1.560|
                  |L1.448|
;;;247            case OS_DEL_NO_PEND:                               /* Delete queue only if no task waiting     */
;;;248                 if (tasks_waiting == OS_FALSE) {
0001c0  e3560000          CMP      r6,#0
0001c4  1a00000d          BNE      |L1.512|
;;;249    #if OS_EVENT_NAME_SIZE > 1
;;;250                     pevent->OSEventName[0] = '?';             /* Unknown name                             */
0001c8  e5c4800f          STRB     r8,[r4,#0xf]
;;;251                     pevent->OSEventName[1] = OS_ASCII_NUL;
0001cc  e5c4b010          STRB     r11,[r4,#0x10]
;;;252    #endif
;;;253                     pq                     = (OS_Q *)pevent->OSEventPtr;  /* Return OS_Q to free list     */
;;;254                     pq->OSQPtr             = OSQFreeList;
0001d0  e5940004          LDR      r0,[r4,#4]
0001d4  e5991000          LDR      r1,[r9,#0]  ; OSQFreeList
;;;255                     OSQFreeList            = pq;
0001d8  e5801000          STR      r1,[r0,#0]
0001dc  e5890000          STR      r0,[r9,#0]  ; OSQFreeList
;;;256                     pevent->OSEventType    = OS_EVENT_TYPE_UNUSED;
0001e0  e5c4b000          STRB     r11,[r4,#0]
;;;257                     pevent->OSEventPtr     = OSEventFreeList; /* Return Event Control Block to free list  */
0001e4  e59a0000          LDR      r0,[r10,#0]  ; OSEventFreeList
0001e8  e5840004          STR      r0,[r4,#4]
;;;258                     pevent->OSEventCnt     = 0;
0001ec  e1c4b0b8          STRH     r11,[r4,#8]
;;;259                     OSEventFreeList        = pevent;          /* Get next free event control block        */
;;;260                     OS_EXIT_CRITICAL();
0001f0  e1a00007          MOV      r0,r7
0001f4  e58a4000          STR      r4,[r10,#0]  ; OSEventFreeList
0001f8  ebfffffe          BL       OS_CPU_SR_Restore
;;;261                     *perr                  = OS_ERR_NONE;
;;;262                     pevent_return          = (OS_EVENT *)0;   /* Queue has been deleted                   */
0001fc  ea00001d          B        |L1.632|
                  |L1.512|
;;;263                 } else {

⌨️ 快捷键说明

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