os_q.txt

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

TXT
1,063
字号
000180  e12fff1e          BX       lr
                  |L1.388|
000184  e3540000          CMP      r4,#0                 ;191
000188  1a000003          BNE      |L1.412|
00018c  e3a00004          MOV      r0,#4                 ;192
000190  e5c50000          STRB     r0,[r5,#0]            ;192
000194  e1a00004          MOV      r0,r4                 ;193
000198  eafffff7          B        |L1.380|
                  |L1.412|
00019c  e5d40000          LDRB     r0,[r4,#0]            ;195
0001a0  e3500002          CMP      r0,#2                 ;195
0001a4  0a000003          BEQ      |L1.440|
0001a8  e3a00001          MOV      r0,#1                 ;196
0001ac  e5c50000          STRB     r0,[r5,#0]            ;196
0001b0  e1a00004          MOV      r0,r4                 ;197
0001b4  eafffff0          B        |L1.380|
                  |L1.440|
0001b8  ef000002          SVC      #0x2                  ;200
0001bc  e5d40001          LDRB     r0,[r4,#1]            ;201
0001c0  e3500000          CMP      r0,#0                 ;201
0001c4  0a000001          BEQ      |L1.464|
0001c8  e3a06001          MOV      r6,#1                 ;202
0001cc  ea000000          B        |L1.468|
                  |L1.464|
0001d0  e3a06000          MOV      r6,#0                 ;204
                  |L1.468|
0001d4  e59f7624          LDR      r7,|L1.2048|
0001d8  e59f861c          LDR      r8,|L1.2044|
0001dc  e35a0000          CMP      r10,#0                ;206
0001e0  e3a09000          MOV      r9,#0                 ;204
0001e4  0a000002          BEQ      |L1.500|
0001e8  e35a0001          CMP      r10,#1                ;206
0001ec  1a000029          BNE      |L1.664|
0001f0  ea000016          B        |L1.592|
                  |L1.500|
0001f4  e3560000          CMP      r6,#0                 ;208
0001f8  1a00000b          BNE      |L1.556|
0001fc  e5940004          LDR      r0,[r4,#4]            ;209
000200  e5971000          LDR      r1,[r7,#0]            ;210  ; OSQFreeList
000204  e5801000          STR      r1,[r0,#0]            ;210
000208  e5870000          STR      r0,[r7,#0]            ;211  ; OSQFreeList
00020c  e5c49000          STRB     r9,[r4,#0]            ;212
000210  e5980000          LDR      r0,[r8,#0]            ;213  ; OSEventFreeList
000214  e5840004          STR      r0,[r4,#4]            ;213
000218  e5884000          STR      r4,[r8,#0]            ;214  ; OSEventFreeList
00021c  ef000003          SVC      #0x3                  ;215
000220  e5c59000          STRB     r9,[r5,#0]            ;216
000224  e3a00000          MOV      r0,#0                 ;217
000228  eaffffd3          B        |L1.380|
                  |L1.556|
00022c  ef000003          SVC      #0x3                  ;219
000230  e3a00008          MOV      r0,#8                 ;220
000234  e5c50000          STRB     r0,[r5,#0]            ;220
000238  e1a00004          MOV      r0,r4                 ;221
00023c  eaffffce          B        |L1.380|
                  |L1.576|
000240  e3a02004          MOV      r2,#4                 ;226
000244  e3a01000          MOV      r1,#0                 ;226
000248  e1a00004          MOV      r0,r4                 ;226
00024c  ebfffffe          BL       OS_EventTaskRdy
                  |L1.592|
000250  e5d40001          LDRB     r0,[r4,#1]            ;225
000254  e3500000          CMP      r0,#0                 ;225
000258  1afffff8          BNE      |L1.576|
00025c  e5940004          LDR      r0,[r4,#4]            ;228
000260  e5971000          LDR      r1,[r7,#0]            ;229  ; OSQFreeList
000264  e5801000          STR      r1,[r0,#0]            ;229
000268  e5870000          STR      r0,[r7,#0]            ;230  ; OSQFreeList
00026c  e5c49000          STRB     r9,[r4,#0]            ;231
000270  e5980000          LDR      r0,[r8,#0]            ;232  ; OSEventFreeList
000274  e5840004          STR      r0,[r4,#4]            ;232
000278  e5884000          STR      r4,[r8,#0]            ;233  ; OSEventFreeList
00027c  ef000003          SVC      #0x3                  ;234
000280  e3560001          CMP      r6,#1                 ;235
000284  1a000000          BNE      |L1.652|
000288  ebfffffe          BL       OS_Sched
                  |L1.652|
00028c  e5c59000          STRB     r9,[r5,#0]            ;238
000290  e3a00000          MOV      r0,#0                 ;239
000294  eaffffb8          B        |L1.380|
                  |L1.664|
000298  ef000003          SVC      #0x3                  ;242
00029c  e3a00007          MOV      r0,#7                 ;243
0002a0  e5c50000          STRB     r0,[r5,#0]            ;243
0002a4  e1a00004          MOV      r0,r4                 ;244
0002a8  eaffffb3          B        |L1.380|
;;;247    #endif
                          ENDP

                  OSQFlush PROC
;;;265    INT8U  OSQFlush (OS_EVENT *pevent)
;;;266    {
0002ac  e92d4010          PUSH     {r4,lr}
0002b0  e1a04000          MOV      r4,r0
;;;267    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;268        OS_CPU_SR  cpu_sr;
;;;269    #endif
;;;270        OS_Q      *pq;
;;;271    
;;;272    
;;;273    #if OS_ARG_CHK_EN > 0
;;;274        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
0002b4  e3540000          CMP      r4,#0
0002b8  1a000002          BNE      |L1.712|
;;;275            return (OS_ERR_PEVENT_NULL);
0002bc  e3a00004          MOV      r0,#4
                  |L1.704|
0002c0  e8bd4010          POP      {r4,lr}
;;;276        }
;;;277        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* Validate event block type                     */
;;;278            return (OS_ERR_EVENT_TYPE);
;;;279        }
;;;280    #endif
;;;281        OS_ENTER_CRITICAL();
;;;282        pq             = (OS_Q *)pevent->OSEventPtr;      /* Point to queue storage structure              */
;;;283        pq->OSQIn      = pq->OSQStart;
;;;284        pq->OSQOut     = pq->OSQStart;
;;;285        pq->OSQEntries = 0;
;;;286        OS_EXIT_CRITICAL();
;;;287        return (OS_NO_ERR);
;;;288    }
0002c4  e12fff1e          BX       lr
                  |L1.712|
0002c8  e5d40000          LDRB     r0,[r4,#0]            ;277
0002cc  e3500002          CMP      r0,#2                 ;277
0002d0  0a000001          BEQ      |L1.732|
0002d4  e3a00001          MOV      r0,#1                 ;278
0002d8  eafffff8          B        |L1.704|
                  |L1.732|
0002dc  ef000002          SVC      #0x2                  ;281
0002e0  e5940004          LDR      r0,[r4,#4]            ;282
0002e4  e5901004          LDR      r1,[r0,#4]            ;283
0002e8  e580100c          STR      r1,[r0,#0xc]          ;283
0002ec  e5901004          LDR      r1,[r0,#4]            ;284
0002f0  e5801010          STR      r1,[r0,#0x10]         ;284
0002f4  e3a01000          MOV      r1,#0                 ;285
0002f8  e1c011b6          STRH     r1,[r0,#0x16]         ;285
0002fc  ef000003          SVC      #0x3                  ;286
000300  e3a00000          MOV      r0,#0                 ;287
000304  eaffffed          B        |L1.704|
;;;289    #endif
                          ENDP

                  OSQPend PROC
;;;323    void  *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
;;;324    {
000308  e92d41f0          PUSH     {r4-r8,lr}
00030c  e1a05000          MOV      r5,r0
000310  e1a06001          MOV      r6,r1
000314  e1a04002          MOV      r4,r2
;;;325    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;326        OS_CPU_SR  cpu_sr;
;;;327    #endif
;;;328        void      *msg;
;;;329        OS_Q      *pq;
;;;330    
;;;331    
;;;332        if (OSIntNesting > 0) {                      /* See if called from ISR ...                         */
000318  e59f04d8          LDR      r0,|L1.2040|
00031c  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000320  e3500000          CMP      r0,#0
000324  0a000004          BEQ      |L1.828|
;;;333            *err = OS_ERR_PEND_ISR;                  /* ... can't PEND from an ISR                         */
000328  e3a00002          MOV      r0,#2
00032c  e5c40000          STRB     r0,[r4,#0]
;;;334            return ((void *)0);
000330  e3a00000          MOV      r0,#0
                  |L1.820|
000334  e8bd41f0          POP      {r4-r8,lr}
;;;335        }
;;;336    #if OS_ARG_CHK_EN > 0
;;;337        if (pevent == (OS_EVENT *)0) {               /* Validate 'pevent'                                  */
;;;338            *err = OS_ERR_PEVENT_NULL;
;;;339            return ((void *)0);
;;;340        }
;;;341        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type                          */
;;;342            *err = OS_ERR_EVENT_TYPE;
;;;343            return ((void *)0);
;;;344        }
;;;345    #endif
;;;346        OS_ENTER_CRITICAL();
;;;347        pq = (OS_Q *)pevent->OSEventPtr;             /* Point at queue control block                       */
;;;348        if (pq->OSQEntries > 0) {                    /* See if any messages in the queue                   */
;;;349            msg = *pq->OSQOut++;                     /* Yes, extract oldest message from the queue         */
;;;350            pq->OSQEntries--;                        /* Update the number of entries in the queue          */
;;;351            if (pq->OSQOut == pq->OSQEnd) {          /* Wrap OUT pointer if we are at the end of the queue */
;;;352                pq->OSQOut = pq->OSQStart;
;;;353            }
;;;354            OS_EXIT_CRITICAL();
;;;355            *err = OS_NO_ERR;
;;;356            return (msg);                            /* Return message received                            */
;;;357        }
;;;358        OSTCBCur->OSTCBStat |= OS_STAT_Q;            /* Task will have to pend for a message to be posted  */
;;;359        OSTCBCur->OSTCBDly   = timeout;              /* Load timeout into TCB                              */
;;;360        OS_EventTaskWait(pevent);                    /* Suspend task until event or timeout occurs         */
;;;361        OS_EXIT_CRITICAL();
;;;362        OS_Sched();                                  /* Find next highest priority task ready to run       */
;;;363        OS_ENTER_CRITICAL();
;;;364        msg = OSTCBCur->OSTCBMsg;
;;;365        if (msg != (void *)0) {                      /* Did we get a message?                              */
;;;366            OSTCBCur->OSTCBMsg      = (void *)0;     /* Extract message from TCB (Put there by QPost)      */
;;;367            OSTCBCur->OSTCBStat     = OS_STAT_RDY;
;;;368            OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event                        */
;;;369            OS_EXIT_CRITICAL();
;;;370            *err                    = OS_NO_ERR;
;;;371            return (msg);                            /* Return message received                            */
;;;372        }
;;;373        OS_EventTO(pevent);                          /* Timed out                                          */
;;;374        OS_EXIT_CRITICAL();
;;;375        *err = OS_TIMEOUT;                           /* Indicate a timeout occured                         */
;;;376        return ((void *)0);                          /* No message received                                */
;;;377    }
000338  e12fff1e          BX       lr
                  |L1.828|
00033c  e3550000          CMP      r5,#0                 ;337
000340  1a000003          BNE      |L1.852|
000344  e3a00004          MOV      r0,#4                 ;338
000348  e5c40000          STRB     r0,[r4,#0]            ;338
00034c  e3a00000          MOV      r0,#0                 ;339
000350  eafffff7          B        |L1.820|
                  |L1.852|
000354  e5d50000          LDRB     r0,[r5,#0]            ;341
000358  e3500002          CMP      r0,#2                 ;341
00035c  0a000003          BEQ      |L1.880|
000360  e3a00001          MOV      r0,#1                 ;342
000364  e5c40000          STRB     r0,[r4,#0]            ;342
000368  e3a00000          MOV      r0,#0                 ;343
00036c  eafffff0          B        |L1.820|
                  |L1.880|
000370  ef000002          SVC      #0x2                  ;346
000374  e5950004          LDR      r0,[r5,#4]            ;347
000378  e3a07000          MOV      r7,#0                 ;348
00037c  e1d011b6          LDRH     r1,[r0,#0x16]         ;348
000380  e3510000          CMP      r1,#0                 ;348
000384  0a00000f          BEQ      |L1.968|
000388  e5901010          LDR      r1,[r0,#0x10]         ;349
00038c  e2812004          ADD      r2,r1,#4              ;349
000390  e5802010          STR      r2,[r0,#0x10]         ;349
000394  e5915000          LDR      r5,[r1,#0]            ;349
000398  e1d011b6          LDRH     r1,[r0,#0x16]         ;350
00039c  e2411001          SUB      r1,r1,#1              ;350
0003a0  e1c011b6          STRH     r1,[r0,#0x16]         ;350
0003a4  e5901008          LDR      r1,[r0,#8]            ;351
0003a8  e1520001          CMP      r2,r1                 ;351
0003ac  1a000001          BNE      |L1.952|
0003b0  e5901004          LDR      r1,[r0,#4]            ;352
0003b4  e5801010          STR      r1,[r0,#0x10]         ;352
                  |L1.952|
0003b8  ef000003          SVC      #0x3                  ;354
0003bc  e5c47000          STRB     r7,[r4,#0]            ;355
0003c0  e1a00005          MOV      r0,r5                 ;356
0003c4  eaffffda          B        |L1.820|
                  |L1.968|
0003c8  e59f8434          LDR      r8,|L1.2052|
0003cc  e5980000          LDR      r0,[r8,#0]            ;358  ; OSTCBCur
0003d0  e5d0102c          LDRB     r1,[r0,#0x2c]         ;358
0003d4  e3811004          ORR      r1,r1,#4              ;358
0003d8  e5c0102c          STRB     r1,[r0,#0x2c]         ;358
0003dc  e1c062ba          STRH     r6,[r0,#0x2a]         ;359
0003e0  e1a00005          MOV      r0,r5                 ;360
0003e4  ebfffffe          BL       OS_EventTaskWait
0003e8  ef000003          SVC      #0x3                  ;361
0003ec  ebfffffe          BL       OS_Sched
0003f0  ef000002          SVC      #0x2                  ;363
0003f4  e5980000          LDR      r0,[r8,#0]            ;364  ; OSTCBCur
0003f8  e5906020          LDR      r6,[r0,#0x20]         ;364

⌨️ 快捷键说明

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