os_q.txt

来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 1,063 行 · 第 1/4 页

TXT
1,063
字号
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 934] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_q.o --depend=.\rvmdk\os_q.d --device=DARMP --apcs=interwork -O1 -I. -I..\BSP -I..\..\..\..\uCOS-II\Ports\ARM\Generic\RealView -I..\..\..\..\uCOS-II\Source -I..\..\..\..\uC-CPU -I..\..\..\..\uC-CPU\ARM\RealView -I..\..\..\..\uC-LIB -I..\..\..\..\uC-TCPIP\IF -I..\..\..\..\uC-TCPIP\IF\Ether -I..\..\..\..\uC-TCPIP\NIC\ETHER\LPC2378 -I..\..\..\..\uC-TCPIP\NIC\ETHER\PHY -I..\..\..\..\uC-TCPIP\NIC\ETHER\PHY\DP83848 -I..\..\..\..\uC-TCPIP\OS\uCOS-II -I..\..\..\..\uC-TCPIP\Source -I..\..\..\..\uC-LCD\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\RS-232\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\TCPIP\Source -I..\..\..\..\uC-Probe\Target\Plugins\uCOS-II -Ie:\Keil_ARM\ARM\INC\Philips -D__IN_CHIP --omf_browse=.\rvmdk\os_q.crf ..\Source\OS_Q.C]
                          ARM

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

                  OSQAccept PROC
;;;39     void  *OSQAccept (OS_EVENT *pevent)
;;;40     {
000000  e92d4010          PUSH     {r4,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  1a000002          BNE      |L1.28|
;;;50             return ((void *)0);
000010  e3a00000          MOV      r0,#0
                  |L1.20|
000014  e8bd4010          POP      {r4,lr}
;;;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     }
000018  e12fff1e          BX       lr
                  |L1.28|
00001c  e5d40000          LDRB     r0,[r4,#0]            ;52
000020  e3500002          CMP      r0,#2                 ;52
000024  0a000001          BEQ      |L1.48|
000028  e3a00000          MOV      r0,#0                 ;53
00002c  eafffff8          B        |L1.20|
                  |L1.48|
000030  ef000002          SVC      #0x2                  ;56
000034  e5940004          LDR      r0,[r4,#4]            ;57
000038  e1d011b6          LDRH     r1,[r0,#0x16]         ;58
00003c  e3510000          CMP      r1,#0                 ;58
000040  0a00000c          BEQ      |L1.120|
000044  e5902010          LDR      r2,[r0,#0x10]         ;59
000048  e2821004          ADD      r1,r2,#4              ;59
00004c  e5801010          STR      r1,[r0,#0x10]         ;59
000050  e5924000          LDR      r4,[r2,#0]            ;59
000054  e1d021b6          LDRH     r2,[r0,#0x16]         ;60
000058  e2422001          SUB      r2,r2,#1              ;60
00005c  e1c021b6          STRH     r2,[r0,#0x16]         ;60
000060  e5902008          LDR      r2,[r0,#8]            ;61
000064  e1510002          CMP      r1,r2                 ;61
000068  1a000003          BNE      |L1.124|
00006c  e5901004          LDR      r1,[r0,#4]            ;62
000070  e5801010          STR      r1,[r0,#0x10]         ;62
000074  ea000000          B        |L1.124|
                  |L1.120|
000078  e3a04000          MOV      r4,#0                 ;65
                  |L1.124|
00007c  ef000003          SVC      #0x3                  ;67
000080  e1a00004          MOV      r0,r4                 ;68
000084  eaffffe2          B        |L1.20|
;;;70     #endif
                          ENDP

                  OSQCreate PROC
;;;91     OS_EVENT  *OSQCreate (void **start, INT16U size)
;;;92     {
000088  e92d41f0          PUSH     {r4-r8,lr}
00008c  e1a06000          MOV      r6,r0
000090  e1a08001          MOV      r8,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  e59f075c          LDR      r0,|L1.2040|
000098  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
00009c  e3500000          CMP      r0,#0
0000a0  0a000002          BEQ      |L1.176|
;;;101            return ((OS_EVENT *)0);                  /* ... can't CREATE from an ISR                       */
0000a4  e3a00000          MOV      r0,#0
                  |L1.168|
0000a8  e8bd41f0          POP      {r4-r8,lr}
;;;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();
;;;111            pq = OSQFreeList;                        /* Get a free queue control block                     */
;;;112            if (pq != (OS_Q *)0) {                   /* Were we able to get a queue control block ?        */
;;;113                OSQFreeList         = OSQFreeList->OSQPtr;    /* Yes, Adjust free list pointer to next free*/
;;;114                OS_EXIT_CRITICAL();
;;;115                pq->OSQStart        = start;                  /*      Initialize the queue                 */
;;;116                pq->OSQEnd          = &start[size];
;;;117                pq->OSQIn           = start;
;;;118                pq->OSQOut          = start;
;;;119                pq->OSQSize         = size;
;;;120                pq->OSQEntries      = 0;
;;;121                pevent->OSEventType = OS_EVENT_TYPE_Q;
;;;122                pevent->OSEventCnt  = 0;
;;;123                pevent->OSEventPtr  = pq;
;;;124                OS_EventWaitListInit(pevent);                 /*      Initalize the wait list              */
;;;125            } else {
;;;126                pevent->OSEventPtr = (void *)OSEventFreeList; /* No,  Return event control block on error  */
;;;127                OSEventFreeList    = pevent;
;;;128                OS_EXIT_CRITICAL();
;;;129                pevent = (OS_EVENT *)0;
;;;130            }
;;;131        }
;;;132        return (pevent);
;;;133    }
0000ac  e12fff1e          BX       lr
                  |L1.176|
0000b0  ef000002          SVC      #0x2                  ;103
0000b4  e59f7740          LDR      r7,|L1.2044|
0000b8  e5975000          LDR      r5,[r7,#0]            ;104  ; OSEventFreeList
0000bc  e3550000          CMP      r5,#0                 ;105
0000c0  0a000001          BEQ      |L1.204|
0000c4  e5950004          LDR      r0,[r5,#4]            ;106
0000c8  e5870000          STR      r0,[r7,#0]            ;106  ; OSEventFreeList
                  |L1.204|
0000cc  ef000003          SVC      #0x3                  ;108
0000d0  e3550000          CMP      r5,#0                 ;109
0000d4  0a00001b          BEQ      |L1.328|
0000d8  ef000002          SVC      #0x2                  ;110
0000dc  e59f071c          LDR      r0,|L1.2048|
0000e0  e5904000          LDR      r4,[r0,#0]            ;111  ; OSQFreeList
0000e4  e3540000          CMP      r4,#0                 ;112
0000e8  0a000011          BEQ      |L1.308|
0000ec  e5941000          LDR      r1,[r4,#0]            ;113
0000f0  e5801000          STR      r1,[r0,#0]            ;113  ; OSQFreeList
0000f4  ef000003          SVC      #0x3                  ;114
0000f8  e5846004          STR      r6,[r4,#4]            ;115
0000fc  e0860108          ADD      r0,r6,r8,LSL #2       ;116
000100  e5840008          STR      r0,[r4,#8]            ;116
000104  e584600c          STR      r6,[r4,#0xc]          ;117
000108  e5846010          STR      r6,[r4,#0x10]         ;118
00010c  e1c481b4          STRH     r8,[r4,#0x14]         ;119
000110  e3a00000          MOV      r0,#0                 ;120
000114  e1c401b6          STRH     r0,[r4,#0x16]         ;120
000118  e3a01002          MOV      r1,#2                 ;121
00011c  e5c51000          STRB     r1,[r5,#0]            ;121
000120  e1c500b2          STRH     r0,[r5,#2]            ;122
000124  e5854004          STR      r4,[r5,#4]            ;123
000128  e1a00005          MOV      r0,r5                 ;124
00012c  ebfffffe          BL       OS_EventWaitListInit
000130  ea000004          B        |L1.328|
                  |L1.308|
000134  e5970000          LDR      r0,[r7,#0]            ;126  ; OSEventFreeList
000138  e5850004          STR      r0,[r5,#4]            ;126
00013c  e5875000          STR      r5,[r7,#0]            ;127  ; OSEventFreeList
000140  ef000003          SVC      #0x3                  ;128
000144  e3a05000          MOV      r5,#0                 ;129
                  |L1.328|
000148  e1a00005          MOV      r0,r5                 ;132
00014c  eaffffd5          B        |L1.168|
;;;134    /*$PAGE*/
                          ENDP

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

⌨️ 快捷键说明

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