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

📄 os_q.txt

📁 在KEIL下成功使用UCOS-II嵌入式操作系统
💻 TXT
📖 第 1 页 / 共 4 页
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 947] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\os_q.o --device=DARMP -O0 -IC:\Keil\ARM\INC\Philips ..\Source\OS_Q.C]

                          ARM

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

                  OSQAccept PROC
;;;39     void  *OSQAccept (OS_EVENT *pevent)
;;;40     {
000000  e92d4070          PUSH     {r4-r6,lr}
000004  e1a04000          MOV      r4,r0
;;;41     #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;42         OS_CPU_SR  cpu_sr;
;;;43     #endif    
;;;44         void      *msg;
;;;45         OS_Q      *pq;
;;;46     
;;;47     
;;;48     #if OS_ARG_CHK_EN > 0
;;;49         if (pevent == (OS_EVENT *)0) {               /* Validate 'pevent'                                  */
000008  e3540000          CMP      r4,#0
00000c  1a000001          BNE      |L1.24|
;;;50             return ((void *)0);
000010  e3a00000          MOV      r0,#0
;;;51         }
;;;52         if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type                          */
;;;53             return ((void *)0);
;;;54         }
;;;55     #endif
;;;56         OS_ENTER_CRITICAL();
;;;57         pq = (OS_Q *)pevent->OSEventPtr;             /* Point at queue control block                       */
;;;58         if (pq->OSQEntries != 0) {                   /* See if any messages in the queue                   */
;;;59             msg = *pq->OSQOut++;                     /* Yes, extract oldest message from the queue         */
;;;60             pq->OSQEntries--;                        /* Update the number of entries in the queue          */
;;;61             if (pq->OSQOut == pq->OSQEnd) {          /* Wrap OUT pointer if we are at the end of the queue */
;;;62                 pq->OSQOut = pq->OSQStart;
;;;63             }
;;;64         } else {
;;;65             msg = (void *)0;                         /* Queue is empty                                     */
;;;66         }
;;;67         OS_EXIT_CRITICAL();
;;;68         return (msg);                                /* Return message received (or NULL)                  */
;;;69     }
                  |L1.20|
000014  e8bd8070          POP      {r4-r6,pc}
                  |L1.24|
000018  e5d40000          LDRB     r0,[r4,#0]            ;52
00001c  e3500002          CMP      r0,#2                 ;52
000020  0a000001          BEQ      |L1.44|               ;52
000024  e3a00000          MOV      r0,#0                 ;53
000028  eafffff9          B        |L1.20|               ;53
                  |L1.44|
00002c  ef000002          SVC      0x2  ; formerly SWI   ;56
000030  e5945004          LDR      r5,[r4,#4]            ;57
000034  e1d501b6          LDRH     r0,[r5,#0x16]         ;58
000038  e3500000          CMP      r0,#0                 ;58
00003c  0a00000d          BEQ      |L1.120|              ;58
000040  e5950010          LDR      r0,[r5,#0x10]         ;59
000044  e2801004          ADD      r1,r0,#4              ;59
000048  e5851010          STR      r1,[r5,#0x10]         ;59
00004c  e5906000          LDR      r6,[r0,#0]            ;59
000050  e1d501b6          LDRH     r0,[r5,#0x16]         ;60
000054  e2400001          SUB      r0,r0,#1              ;60
000058  e1c501b6          STRH     r0,[r5,#0x16]         ;60
00005c  e5950010          LDR      r0,[r5,#0x10]         ;61
000060  e5951008          LDR      r1,[r5,#8]            ;61
000064  e1500001          CMP      r0,r1                 ;61
000068  1a000003          BNE      |L1.124|              ;61
00006c  e5950004          LDR      r0,[r5,#4]            ;62
000070  e5850010          STR      r0,[r5,#0x10]         ;62
000074  ea000000          B        |L1.124|              ;62
                  |L1.120|
000078  e3a06000          MOV      r6,#0                 ;65
                  |L1.124|
00007c  ef000003          SVC      0x3  ; formerly SWI   ;67
000080  e1a00006          MOV      r0,r6                 ;68
000084  eaffffe2          B        |L1.20|               ;68
                          ENDP

                  OSQCreate PROC
;;;91     OS_EVENT  *OSQCreate (void **start, INT16U size)
;;;92     {
000088  e92d41f0          PUSH     {r4-r8,lr}
00008c  e1a04000          MOV      r4,r0
000090  e1a05001          MOV      r5,r1
;;;93     #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;94         OS_CPU_SR  cpu_sr;
;;;95     #endif    
;;;96         OS_EVENT  *pevent;
;;;97         OS_Q      *pq;
;;;98     
;;;99     
;;;100        if (OSIntNesting > 0) {                      /* See if called from ISR ...                         */
000094  e59f07e4          LDR      r0,|L1.2176|
000098  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
00009c  e3500000          CMP      r0,#0
0000a0  da000001          BLE      |L1.172|
;;;101            return ((OS_EVENT *)0);                  /* ... can't CREATE from an ISR                       */
0000a4  e3a00000          MOV      r0,#0
;;;102        }
;;;103        OS_ENTER_CRITICAL();
;;;104        pevent = OSEventFreeList;                    /* Get next free event control block                  */
;;;105        if (OSEventFreeList != (OS_EVENT *)0) {      /* See if pool of free ECB pool was empty             */
;;;106            OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
;;;107        }
;;;108        OS_EXIT_CRITICAL();
;;;109        if (pevent != (OS_EVENT *)0) {               /* See if we have an event control block              */
;;;110            OS_ENTER_CRITICAL();                     /* Get a free queue control block                     */
;;;111            pq = OSQFreeList;
;;;112            if (OSQFreeList != (OS_Q *)0) {
;;;113                OSQFreeList = OSQFreeList->OSQPtr;
;;;114            }
;;;115            OS_EXIT_CRITICAL();
;;;116            if (pq != (OS_Q *)0) {                   /* See if we were able to get a queue control block   */
;;;117                pq->OSQStart        = start;         /* Yes, initialize the queue                          */
;;;118                pq->OSQEnd          = &start[size];
;;;119                pq->OSQIn           = start;
;;;120                pq->OSQOut          = start;
;;;121                pq->OSQSize         = size;
;;;122                pq->OSQEntries      = 0;
;;;123                pevent->OSEventType = OS_EVENT_TYPE_Q;
;;;124                pevent->OSEventPtr  = pq;
;;;125                OS_EventWaitListInit(pevent);
;;;126            } else {                                 /* No,  since we couldn't get a queue control block   */
;;;127                OS_ENTER_CRITICAL();                 /* Return event control block on error                */
;;;128                pevent->OSEventPtr = (void *)OSEventFreeList;
;;;129                OSEventFreeList    = pevent;
;;;130                OS_EXIT_CRITICAL();
;;;131                pevent = (OS_EVENT *)0;
;;;132            }
;;;133        }
;;;134        return (pevent);
;;;135    }
                  |L1.168|
0000a8  e8bd81f0          POP      {r4-r8,pc}
                  |L1.172|
0000ac  ef000002          SVC      0x2  ; formerly SWI   ;103
0000b0  e59f07cc          LDR      r0,|L1.2180|          ;104
0000b4  e5906000          LDR      r6,[r0,#0]            ;104  ; OSEventFreeList
0000b8  e5900000          LDR      r0,[r0,#0]            ;105  ; OSEventFreeList
0000bc  e3500000          CMP      r0,#0                 ;105
0000c0  0a000004          BEQ      |L1.216|              ;105
0000c4  e59f07b8          LDR      r0,|L1.2180|          ;106
0000c8  e5900000          LDR      r0,[r0,#0]            ;106  ; OSEventFreeList
0000cc  e5900004          LDR      r0,[r0,#4]            ;106
0000d0  e59f17ac          LDR      r1,|L1.2180|          ;106
0000d4  e5810000          STR      r0,[r1,#0]            ;106  ; OSEventFreeList
                  |L1.216|
0000d8  ef000003          SVC      0x3  ; formerly SWI   ;108
0000dc  e3560000          CMP      r6,#0                 ;109
0000e0  0a000023          BEQ      |L1.372|              ;109
0000e4  ef000002          SVC      0x2  ; formerly SWI   ;110
0000e8  e59f0798          LDR      r0,|L1.2184|          ;111
0000ec  e5907000          LDR      r7,[r0,#0]            ;111  ; OSQFreeList
0000f0  e5900000          LDR      r0,[r0,#0]            ;112  ; OSQFreeList
0000f4  e3500000          CMP      r0,#0                 ;112
0000f8  0a000004          BEQ      |L1.272|              ;112
0000fc  e59f0784          LDR      r0,|L1.2184|          ;113
000100  e5900000          LDR      r0,[r0,#0]            ;113  ; OSQFreeList
000104  e5900000          LDR      r0,[r0,#0]            ;113
000108  e59f1778          LDR      r1,|L1.2184|          ;113
00010c  e5810000          STR      r0,[r1,#0]            ;113  ; OSQFreeList
                  |L1.272|
000110  ef000003          SVC      0x3  ; formerly SWI   ;115
000114  e3570000          CMP      r7,#0                 ;116
000118  0a00000d          BEQ      |L1.340|              ;116
00011c  e5874004          STR      r4,[r7,#4]            ;117
000120  e0840105          ADD      r0,r4,r5,LSL #2       ;118
000124  e5870008          STR      r0,[r7,#8]            ;118
000128  e587400c          STR      r4,[r7,#0xc]          ;119
00012c  e5874010          STR      r4,[r7,#0x10]         ;120
000130  e1c751b4          STRH     r5,[r7,#0x14]         ;121
000134  e3a00000          MOV      r0,#0                 ;122
000138  e1c701b6          STRH     r0,[r7,#0x16]         ;122
00013c  e3a00002          MOV      r0,#2                 ;123
000140  e5c60000          STRB     r0,[r6,#0]            ;123
000144  e5867004          STR      r7,[r6,#4]            ;124
000148  e1a00006          MOV      r0,r6                 ;125
00014c  ebfffffe          BL       OS_EventWaitListInit  ;125
000150  ea000007          B        |L1.372|              ;125
                  |L1.340|
000154  ef000002          SVC      0x2  ; formerly SWI   ;127
000158  e59f0724          LDR      r0,|L1.2180|          ;128
00015c  e5900000          LDR      r0,[r0,#0]            ;128  ; OSEventFreeList
000160  e5860004          STR      r0,[r6,#4]            ;128
000164  e59f0718          LDR      r0,|L1.2180|          ;129
000168  e5806000          STR      r6,[r0,#0]            ;129  ; OSEventFreeList
00016c  ef000003          SVC      0x3  ; formerly SWI   ;130
000170  e3a06000          MOV      r6,#0                 ;131
                  |L1.372|
000174  e1a00006          MOV      r0,r6                 ;134
000178  eaffffca          B        |L1.168|              ;134
                          ENDP

                  OSQDel PROC
;;;179    OS_EVENT  *OSQDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;180    {
00017c  e92d41f0          PUSH     {r4-r8,lr}
000180  e1a04000          MOV      r4,r0
000184  e1a05001          MOV      r5,r1
000188  e1a06002          MOV      r6,r2
;;;181    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;182        OS_CPU_SR  cpu_sr;
;;;183    #endif    
;;;184        BOOLEAN    tasks_waiting;
;;;185        OS_Q      *pq;
;;;186    
;;;187    
;;;188        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
00018c  e59f06ec          LDR      r0,|L1.2176|
000190  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000194  e3500000          CMP      r0,#0
000198  da000003          BLE      |L1.428|
;;;189            *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
00019c  e3a0008c          MOV      r0,#0x8c
0001a0  e5c60000          STRB     r0,[r6,#0]
;;;190            return ((OS_EVENT *)0);
0001a4  e3a00000          MOV      r0,#0
;;;191        }
;;;192    #if OS_ARG_CHK_EN > 0
;;;193        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;194            *err = OS_ERR_PEVENT_NULL;
;;;195            return (pevent);
;;;196        }
;;;197        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {          /* Validate event block type                */
;;;198            *err = OS_ERR_EVENT_TYPE;
;;;199            return (pevent);
;;;200        }
;;;201    #endif
;;;202        OS_ENTER_CRITICAL();
;;;203        if (pevent->OSEventGrp != 0x00) {                      /* See if any tasks waiting on queue        */
;;;204            tasks_waiting = TRUE;                              /* Yes                                      */
;;;205        } else {
;;;206            tasks_waiting = FALSE;                             /* No                                       */
;;;207        }
;;;208        switch (opt) {
;;;209            case OS_DEL_NO_PEND:                               /* Delete queue only if no task waiting     */
;;;210                 if (tasks_waiting == FALSE) {
;;;211                     pq                  = pevent->OSEventPtr; /* Return OS_Q to free list                 */ 
;;;212                     pq->OSQPtr          = OSQFreeList;
;;;213                     OSQFreeList         = pq;
;;;214                     pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;215                     pevent->OSEventPtr  = OSEventFreeList;    /* Return Event Control Block to free list  */
;;;216                     OSEventFreeList     = pevent;             /* Get next free event control block        */
;;;217                     OS_EXIT_CRITICAL();
;;;218                     *err = OS_NO_ERR;
;;;219                     return ((OS_EVENT *)0);                   /* Queue has been deleted                   */
;;;220                 } else {
;;;221                     OS_EXIT_CRITICAL();
;;;222                     *err = OS_ERR_TASK_WAITING;
;;;223                     return (pevent);
;;;224                 }
;;;225    
;;;226            case OS_DEL_ALWAYS:                                /* Always delete the queue                  */
;;;227                 while (pevent->OSEventGrp != 0x00) {          /* Ready ALL tasks waiting for queue        */
;;;228                     OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q);
;;;229                 }
;;;230                 pq                  = pevent->OSEventPtr;     /* Return OS_Q to free list                 */ 
;;;231                 pq->OSQPtr          = OSQFreeList;
;;;232                 OSQFreeList         = pq;
;;;233                 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;234                 pevent->OSEventPtr  = OSEventFreeList;        /* Return Event Control Block to free list  */
;;;235                 OSEventFreeList     = pevent;                 /* Get next free event control block        */
;;;236                 OS_EXIT_CRITICAL();
;;;237                 if (tasks_waiting == TRUE) {                  /* Reschedule only if task(s) were waiting  */
;;;238                     OS_Sched();                               /* Find highest priority task ready to run  */
;;;239                 }
;;;240                 *err = OS_NO_ERR;
;;;241                 return ((OS_EVENT *)0);                       /* Queue has been deleted                   */
;;;242    
;;;243            default:
;;;244                 OS_EXIT_CRITICAL();
;;;245                 *err = OS_ERR_INVALID_OPT;

⌨️ 快捷键说明

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