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

📄 os_q.txt

📁 一个电力系统谐波检测的程序
💻 TXT
📖 第 1 页 / 共 4 页
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 951] for uVision
; commandline ArmCC [--debug -c --asm --interleave -oos_q.o --device=DARMP --apcs=interwork -O0 -IC:\Keil\ARM\INC\Philips uCosii\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  1a000002          BNE      |L1.28|
;;;50             return ((void *)0);
000010  e3a00000          MOV      r0,#0
                  |L1.20|
000014  e8bd4070          POP      {r4-r6,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|               ;52
000028  e3a00000          MOV      r0,#0                 ;53
00002c  eafffff8          B        |L1.20|               ;53
                  |L1.48|
000030  ef000002          SVC      0x2  ; formerly SWI   ;56
000034  e5945004          LDR      r5,[r4,#4]            ;57
000038  e1d501b6          LDRH     r0,[r5,#0x16]         ;58
00003c  e3500000          CMP      r0,#0                 ;58
000040  da00000d          BLE      |L1.124|              ;58
000044  e5950010          LDR      r0,[r5,#0x10]         ;59
000048  e2801004          ADD      r1,r0,#4              ;59
00004c  e5851010          STR      r1,[r5,#0x10]         ;59
000050  e5906000          LDR      r6,[r0,#0]            ;59
000054  e1d501b6          LDRH     r0,[r5,#0x16]         ;60
000058  e2400001          SUB      r0,r0,#1              ;60
00005c  e1c501b6          STRH     r0,[r5,#0x16]         ;60
000060  e5950010          LDR      r0,[r5,#0x10]         ;61
000064  e5951008          LDR      r1,[r5,#8]            ;61
000068  e1500001          CMP      r0,r1                 ;61
00006c  1a000003          BNE      |L1.128|              ;61
000070  e5950004          LDR      r0,[r5,#4]            ;62
000074  e5850010          STR      r0,[r5,#0x10]         ;62
000078  ea000000          B        |L1.128|              ;62
                  |L1.124|
00007c  e3a06000          MOV      r6,#0                 ;65
                  |L1.128|
000080  ef000003          SVC      0x3  ; formerly SWI   ;67
000084  e1a00006          MOV      r0,r6                 ;68
000088  eaffffe1          B        |L1.20|               ;68
                          ENDP

                  OSQCreate PROC
;;;91     OS_EVENT  *OSQCreate (void **start, INT16U size)
;;;92     {
00008c  e92d41f0          PUSH     {r4-r8,lr}
000090  e1a04000          MOV      r4,r0
000094  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 ...                         */
000098  e59f07fc          LDR      r0,|L1.2204|
00009c  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0000a0  e3500000          CMP      r0,#0
0000a4  da000002          BLE      |L1.180|
;;;101            return ((OS_EVENT *)0);                  /* ... can't CREATE from an ISR                       */
0000a8  e3a00000          MOV      r0,#0
                  |L1.172|
0000ac  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    }
0000b0  e12fff1e          BX       lr
                  |L1.180|
0000b4  ef000002          SVC      0x2  ; formerly SWI   ;103
0000b8  e59f07e0          LDR      r0,|L1.2208|          ;104
0000bc  e5907000          LDR      r7,[r0,#0]            ;104  ; OSEventFreeList
0000c0  e5900000          LDR      r0,[r0,#0]            ;105  ; OSEventFreeList
0000c4  e3500000          CMP      r0,#0                 ;105
0000c8  0a000004          BEQ      |L1.224|              ;105
0000cc  e59f07cc          LDR      r0,|L1.2208|          ;106
0000d0  e5900000          LDR      r0,[r0,#0]            ;106  ; OSEventFreeList
0000d4  e5900004          LDR      r0,[r0,#4]            ;106
0000d8  e59f17c0          LDR      r1,|L1.2208|          ;106
0000dc  e5810000          STR      r0,[r1,#0]            ;106  ; OSEventFreeList
                  |L1.224|
0000e0  ef000003          SVC      0x3  ; formerly SWI   ;108
0000e4  e3570000          CMP      r7,#0                 ;109
0000e8  0a000020          BEQ      |L1.368|              ;109
0000ec  ef000002          SVC      0x2  ; formerly SWI   ;110
0000f0  e59f07ac          LDR      r0,|L1.2212|          ;111
0000f4  e5906000          LDR      r6,[r0,#0]            ;111  ; OSQFreeList
0000f8  e3560000          CMP      r6,#0                 ;112
0000fc  0a000014          BEQ      |L1.340|              ;112
000100  e5900000          LDR      r0,[r0,#0]            ;113  ; OSQFreeList
000104  e5900000          LDR      r0,[r0,#0]            ;113
000108  e59f1794          LDR      r1,|L1.2212|          ;113
00010c  e5810000          STR      r0,[r1,#0]            ;113  ; OSQFreeList
000110  ef000003          SVC      0x3  ; formerly SWI   ;114
000114  e5864004          STR      r4,[r6,#4]            ;115
000118  e0840105          ADD      r0,r4,r5,LSL #2       ;116
00011c  e5860008          STR      r0,[r6,#8]            ;116
000120  e586400c          STR      r4,[r6,#0xc]          ;117
000124  e5864010          STR      r4,[r6,#0x10]         ;118
000128  e1c651b4          STRH     r5,[r6,#0x14]         ;119
00012c  e3a00000          MOV      r0,#0                 ;120
000130  e1c601b6          STRH     r0,[r6,#0x16]         ;120
000134  e3a00002          MOV      r0,#2                 ;121
000138  e5c70000          STRB     r0,[r7,#0]            ;121
00013c  e3a00000          MOV      r0,#0                 ;122
000140  e1c700b2          STRH     r0,[r7,#2]            ;122
000144  e5876004          STR      r6,[r7,#4]            ;123
000148  e1a00007          MOV      r0,r7                 ;124
00014c  ebfffffe          BL       OS_EventWaitListInit  ;124
000150  ea000006          B        |L1.368|              ;124
                  |L1.340|
000154  e59f0744          LDR      r0,|L1.2208|          ;126
000158  e5900000          LDR      r0,[r0,#0]            ;126  ; OSEventFreeList
00015c  e5870004          STR      r0,[r7,#4]            ;126
000160  e59f0738          LDR      r0,|L1.2208|          ;127
000164  e5807000          STR      r7,[r0,#0]            ;127  ; OSEventFreeList
000168  ef000003          SVC      0x3  ; formerly SWI   ;128
00016c  e3a07000          MOV      r7,#0                 ;129
                  |L1.368|
000170  e1a00007          MOV      r0,r7                 ;132
000174  eaffffcc          B        |L1.172|              ;132
                          ENDP

                  OSQDel PROC
;;;177    OS_EVENT  *OSQDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;178    {
000178  e92d41f0          PUSH     {r4-r8,lr}
00017c  e1a04000          MOV      r4,r0
000180  e1a05001          MOV      r5,r1
000184  e1a06002          MOV      r6,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 ...               */
000188  e59f070c          LDR      r0,|L1.2204|
00018c  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000190  e3500000          CMP      r0,#0
000194  da000004          BLE      |L1.428|
;;;187            *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
000198  e3a0008c          MOV      r0,#0x8c
00019c  e5c60000          STRB     r0,[r6,#0]
;;;188            return ((OS_EVENT *)0);
0001a0  e3a00000          MOV      r0,#0
                  |L1.420|
0001a4  e8bd41f0          POP      {r4-r8,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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -