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

📄 os_q.txt

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 TXT
📖 第 1 页 / 共 5 页
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 903] for uVision
; commandline ArmCC [--debug -c --asm --interleave -oos_q.o --depend=os_q.d --device=DARMP --apcs=interwork -I. -I..\BSP -I..\..\..\..\..\uCOS-II\Ports\ARM\Generic\RVMDK -I..\..\..\..\..\uCOS-II\Source -I..\..\..\..\..\uC-CPU -I..\..\..\..\..\uC-CPU\ARM\RVMDK -I..\..\..\..\..\uC-LIB -I..\..\..\..\..\uCOSView\Source -I..\..\..\..\..\uCOSView\Ports\ARM7\LPC2468\IAR -Id:\Keil\ARM\INC\Philips ..\..\..\..\..\uCOS-II\Source\os_q.c]
                          ARM

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

                  OSQAccept PROC
;;;61     void  *OSQAccept (OS_EVENT *pevent, INT8U *err)
;;;62     {
000000  e92d41f0          PUSH     {r4-r8,lr}
000004  e1a04000          MOV      r4,r0
000008  e1a05001          MOV      r5,r1
;;;63         void      *msg;
;;;64         OS_Q      *pq;
;;;65     #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;66         OS_CPU_SR  cpu_sr = 0;
00000c  e3a08000          MOV      r8,#0
;;;67     #endif
;;;68     
;;;69     
;;;70     
;;;71     #if OS_ARG_CHK_EN > 0
;;;72         if (err == (INT8U *)0) {                     /* Validate 'err'                                     */
000010  e3550000          CMP      r5,#0
000014  1a000002          BNE      |L1.36|
;;;73             return ((void *)0);
000018  e3a00000          MOV      r0,#0
                  |L1.28|
00001c  e8bd41f0          POP      {r4-r8,lr}
;;;74         }
;;;75         if (pevent == (OS_EVENT *)0) {               /* Validate 'pevent'                                  */
;;;76             *err = OS_ERR_PEVENT_NULL;
;;;77             return ((void *)0);
;;;78         }
;;;79     #endif
;;;80         if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type                          */
;;;81             *err = OS_ERR_EVENT_TYPE;
;;;82             return ((void *)0);
;;;83         }
;;;84         OS_ENTER_CRITICAL();
;;;85         pq = (OS_Q *)pevent->OSEventPtr;             /* Point at queue control block                       */
;;;86         if (pq->OSQEntries > 0) {                    /* See if any messages in the queue                   */
;;;87             msg = *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             *err = OS_ERR_NONE;
;;;93         } else {
;;;94             *err = OS_ERR_Q_EMPTY;
;;;95             msg  = (void *)0;                        /* Queue is empty                                     */
;;;96         }
;;;97         OS_EXIT_CRITICAL();
;;;98         return (msg);                                /* Return message received (or NULL)                  */
;;;99     }
000020  e12fff1e          BX       lr
                  |L1.36|
000024  e3540000          CMP      r4,#0
000028  1a000003          BNE      |L1.60|
00002c  e3a00004          MOV      r0,#4
000030  e5c50000          STRB     r0,[r5,#0]
000034  e3a00000          MOV      r0,#0
000038  eafffff7          B        |L1.28|
                  |L1.60|
00003c  e5d40000          LDRB     r0,[r4,#0]
000040  e3500002          CMP      r0,#2
000044  0a000003          BEQ      |L1.88|
000048  e3a00001          MOV      r0,#1
00004c  e5c50000          STRB     r0,[r5,#0]
000050  e3a00000          MOV      r0,#0
000054  eafffff0          B        |L1.28|
                  |L1.88|
000058  ebfffffe          BL       OS_CPU_SR_Save
00005c  e1a08000          MOV      r8,r0
000060  e5947004          LDR      r7,[r4,#4]
000064  e1d701b6          LDRH     r0,[r7,#0x16]
000068  e3500000          CMP      r0,#0
00006c  da00000f          BLE      |L1.176|
000070  e5970010          LDR      r0,[r7,#0x10]
000074  e2801004          ADD      r1,r0,#4
000078  e5871010          STR      r1,[r7,#0x10]
00007c  e5906000          LDR      r6,[r0,#0]
000080  e1d701b6          LDRH     r0,[r7,#0x16]
000084  e2400001          SUB      r0,r0,#1
000088  e1c701b6          STRH     r0,[r7,#0x16]
00008c  e5970010          LDR      r0,[r7,#0x10]
000090  e5971008          LDR      r1,[r7,#8]
000094  e1500001          CMP      r0,r1
000098  1a000001          BNE      |L1.164|
00009c  e5970004          LDR      r0,[r7,#4]
0000a0  e5870010          STR      r0,[r7,#0x10]
                  |L1.164|
0000a4  e3a00000          MOV      r0,#0
0000a8  e5c50000          STRB     r0,[r5,#0]
0000ac  ea000002          B        |L1.188|
                  |L1.176|
0000b0  e3a0001f          MOV      r0,#0x1f
0000b4  e5c50000          STRB     r0,[r5,#0]
0000b8  e3a06000          MOV      r6,#0
                  |L1.188|
0000bc  e1a00008          MOV      r0,r8
0000c0  ebfffffe          BL       OS_CPU_SR_Restore
0000c4  e1a00006          MOV      r0,r6
0000c8  eaffffd3          B        |L1.28|
                          ENDP

                  OSQCreate PROC
;;;121    OS_EVENT  *OSQCreate (void **start, INT16U size)
;;;122    {
0000cc  e92d41f0          PUSH     {r4-r8,lr}
0000d0  e1a04000          MOV      r4,r0
0000d4  e1a05001          MOV      r5,r1
;;;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;
0000d8  e3a08000          MOV      r8,#0
;;;127    #endif
;;;128    
;;;129    
;;;130    
;;;131        if (OSIntNesting > 0) {                      /* See if called from ISR ...                         */
0000dc  e59f0ac0          LDR      r0,|L1.2980|
0000e0  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0000e4  e3500000          CMP      r0,#0
0000e8  da000002          BLE      |L1.248|
;;;132            return ((OS_EVENT *)0);                  /* ... can't CREATE from an ISR                       */
0000ec  e3a00000          MOV      r0,#0
                  |L1.240|
0000f0  e8bd41f0          POP      {r4-r8,lr}
;;;133        }
;;;134        OS_ENTER_CRITICAL();
;;;135        pevent = OSEventFreeList;                    /* Get next free event control block                  */
;;;136        if (OSEventFreeList != (OS_EVENT *)0) {      /* See if pool of free ECB pool was empty             */
;;;137            OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
;;;138        }
;;;139        OS_EXIT_CRITICAL();
;;;140        if (pevent != (OS_EVENT *)0) {               /* See if we have an event control block              */
;;;141            OS_ENTER_CRITICAL();
;;;142            pq = OSQFreeList;                        /* Get a free queue control block                     */
;;;143            if (pq != (OS_Q *)0) {                   /* Were we able to get a queue control block ?        */
;;;144                OSQFreeList            = OSQFreeList->OSQPtr; /* Yes, Adjust free list pointer to next free*/
;;;145                OS_EXIT_CRITICAL();
;;;146                pq->OSQStart           = start;               /*      Initialize the queue                 */
;;;147                pq->OSQEnd             = &start[size];
;;;148                pq->OSQIn              = start;
;;;149                pq->OSQOut             = start;
;;;150                pq->OSQSize            = size;
;;;151                pq->OSQEntries         = 0;
;;;152                pevent->OSEventType    = OS_EVENT_TYPE_Q;
;;;153                pevent->OSEventCnt     = 0;
;;;154                pevent->OSEventPtr     = pq;
;;;155    #if OS_EVENT_NAME_SIZE > 1
;;;156                pevent->OSEventName[0] = '?';                  /* Unknown name                             */
;;;157                pevent->OSEventName[1] = OS_ASCII_NUL;
;;;158    #endif
;;;159                OS_EventWaitListInit(pevent);                 /*      Initalize the wait list              */
;;;160            } else {
;;;161                pevent->OSEventPtr = (void *)OSEventFreeList; /* No,  Return event control block on error  */
;;;162                OSEventFreeList    = pevent;
;;;163                OS_EXIT_CRITICAL();
;;;164                pevent = (OS_EVENT *)0;
;;;165            }
;;;166        }
;;;167        return (pevent);
;;;168    }
0000f4  e12fff1e          BX       lr
                  |L1.248|
0000f8  ebfffffe          BL       OS_CPU_SR_Save
0000fc  e1a08000          MOV      r8,r0
000100  e59f0aa0          LDR      r0,|L1.2984|
000104  e5906000          LDR      r6,[r0,#0]  ; OSEventFreeList
000108  e5900000          LDR      r0,[r0,#0]  ; OSEventFreeList
00010c  e3500000          CMP      r0,#0
000110  0a000004          BEQ      |L1.296|
000114  e59f0a8c          LDR      r0,|L1.2984|
000118  e5900000          LDR      r0,[r0,#0]  ; OSEventFreeList
00011c  e5900004          LDR      r0,[r0,#4]
000120  e59f1a80          LDR      r1,|L1.2984|
000124  e5810000          STR      r0,[r1,#0]  ; OSEventFreeList
                  |L1.296|
000128  e1a00008          MOV      r0,r8
00012c  ebfffffe          BL       OS_CPU_SR_Restore
000130  e3560000          CMP      r6,#0
000134  0a000028          BEQ      |L1.476|
000138  ebfffffe          BL       OS_CPU_SR_Save
00013c  e1a08000          MOV      r8,r0
000140  e59f0a64          LDR      r0,|L1.2988|
000144  e5907000          LDR      r7,[r0,#0]  ; OSQFreeList
000148  e3570000          CMP      r7,#0
00014c  0a00001a          BEQ      |L1.444|
000150  e59f0a54          LDR      r0,|L1.2988|
000154  e5900000          LDR      r0,[r0,#0]  ; OSQFreeList
000158  e5900000          LDR      r0,[r0,#0]
00015c  e59f1a48          LDR      r1,|L1.2988|
000160  e5810000          STR      r0,[r1,#0]  ; OSQFreeList
000164  e1a00008          MOV      r0,r8
000168  ebfffffe          BL       OS_CPU_SR_Restore
00016c  e5874004          STR      r4,[r7,#4]
000170  e0840105          ADD      r0,r4,r5,LSL #2
000174  e5870008          STR      r0,[r7,#8]
000178  e587400c          STR      r4,[r7,#0xc]
00017c  e5874010          STR      r4,[r7,#0x10]
000180  e1c751b4          STRH     r5,[r7,#0x14]
000184  e3a00000          MOV      r0,#0
000188  e1c701b6          STRH     r0,[r7,#0x16]
00018c  e3a00002          MOV      r0,#2
000190  e5c60000          STRB     r0,[r6,#0]
000194  e3a00000          MOV      r0,#0
000198  e1c600b8          STRH     r0,[r6,#8]
00019c  e5867004          STR      r7,[r6,#4]
0001a0  e3a0003f          MOV      r0,#0x3f
0001a4  e5c6000f          STRB     r0,[r6,#0xf]
0001a8  e3a00000          MOV      r0,#0
0001ac  e5c60010          STRB     r0,[r6,#0x10]
0001b0  e1a00006          MOV      r0,r6
0001b4  ebfffffe          BL       OS_EventWaitListInit
0001b8  ea000007          B        |L1.476|
                  |L1.444|
0001bc  e59f09e4          LDR      r0,|L1.2984|
0001c0  e5900000          LDR      r0,[r0,#0]  ; OSEventFreeList
0001c4  e5860004          STR      r0,[r6,#4]
0001c8  e59f09d8          LDR      r0,|L1.2984|
0001cc  e5806000          STR      r6,[r0,#0]  ; OSEventFreeList
0001d0  e1a00008          MOV      r0,r8
0001d4  ebfffffe          BL       OS_CPU_SR_Restore
0001d8  e3a06000          MOV      r6,#0
                  |L1.476|
0001dc  e1a00006          MOV      r0,r6
0001e0  eaffffc2          B        |L1.240|
                          ENDP

                  OSQDel PROC
;;;212    OS_EVENT  *OSQDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;213    {
0001e4  e92d47f0          PUSH     {r4-r10,lr}
0001e8  e1a04000          MOV      r4,r0
0001ec  e1a05001          MOV      r5,r1
0001f0  e1a06002          MOV      r6,r2
;;;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;
0001f4  e3a0a000          MOV      r10,#0
;;;219    #endif
;;;220    
;;;221    
;;;222    
;;;223    #if OS_ARG_CHK_EN > 0
;;;224        if (err == (INT8U *)0) {                               /* Validate 'err'                           */
0001f8  e3560000          CMP      r6,#0
0001fc  1a000002          BNE      |L1.524|
;;;225            return (pevent);
000200  e1a00004          MOV      r0,r4
                  |L1.516|
000204  e8bd47f0          POP      {r4-r10,lr}
;;;226        }
;;;227        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;228            *err = OS_ERR_PEVENT_NULL;
;;;229            return (pevent);
;;;230        }
;;;231    #endif
;;;232        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {          /* Validate event block type                */
;;;233            *err = OS_ERR_EVENT_TYPE;
;;;234            return (pevent);
;;;235        }
;;;236        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
;;;237            *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
;;;238            return (pevent);
;;;239        }

⌨️ 快捷键说明

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