os_q.txt

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

TXT
1,063
字号
0003fc  e3560000          CMP      r6,#0                 ;365
000400  0a000006          BEQ      |L1.1056|
000404  e5807020          STR      r7,[r0,#0x20]         ;366
000408  e5c0702c          STRB     r7,[r0,#0x2c]         ;367
00040c  e580701c          STR      r7,[r0,#0x1c]         ;368
000410  ef000003          SVC      #0x3                  ;369
000414  e5c47000          STRB     r7,[r4,#0]            ;370
000418  e1a00006          MOV      r0,r6                 ;371
00041c  eaffffc4          B        |L1.820|
                  |L1.1056|
000420  e1a00005          MOV      r0,r5                 ;373
000424  ebfffffe          BL       OS_EventTO
000428  ef000003          SVC      #0x3                  ;374
00042c  e3a0000a          MOV      r0,#0xa               ;375
000430  e5c40000          STRB     r0,[r4,#0]            ;375
000434  e3a00000          MOV      r0,#0                 ;376
000438  eaffffbd          B        |L1.820|
;;;378    /*$PAGE*/
                          ENDP

                  OSQPost PROC
;;;398    INT8U  OSQPost (OS_EVENT *pevent, void *msg)
;;;399    {
00043c  e92d4070          PUSH     {r4-r6,lr}
000440  e1a04000          MOV      r4,r0
000444  e1a05001          MOV      r5,r1
;;;400    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;401        OS_CPU_SR  cpu_sr;
;;;402    #endif
;;;403        OS_Q      *pq;
;;;404    
;;;405    
;;;406    #if OS_ARG_CHK_EN > 0
;;;407        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
000448  e3540000          CMP      r4,#0
00044c  1a000002          BNE      |L1.1116|
;;;408            return (OS_ERR_PEVENT_NULL);
000450  e3a00004          MOV      r0,#4
                  |L1.1108|
000454  e8bd4070          POP      {r4-r6,lr}
;;;409        }
;;;410        if (msg == (void *)0) {                           /* Make sure we are not posting a NULL pointer   */
;;;411            return (OS_ERR_POST_NULL_PTR);
;;;412        }
;;;413        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* Validate event block type                     */
;;;414            return (OS_ERR_EVENT_TYPE);
;;;415        }
;;;416    #endif
;;;417        OS_ENTER_CRITICAL();
;;;418        if (pevent->OSEventGrp != 0x00) {                 /* See if any task pending on queue              */
;;;419            OS_EventTaskRdy(pevent, msg, OS_STAT_Q);      /* Ready highest priority task waiting on event  */
;;;420            OS_EXIT_CRITICAL();
;;;421            OS_Sched();                                   /* Find highest priority task ready to run       */
;;;422            return (OS_NO_ERR);
;;;423        }
;;;424        pq = (OS_Q *)pevent->OSEventPtr;                  /* Point to queue control block                  */
;;;425        if (pq->OSQEntries >= pq->OSQSize) {              /* Make sure queue is not full                   */
;;;426            OS_EXIT_CRITICAL();
;;;427            return (OS_Q_FULL);
;;;428        }
;;;429        *pq->OSQIn++ = msg;                               /* Insert message into queue                     */
;;;430        pq->OSQEntries++;                                 /* Update the nbr of entries in the queue        */
;;;431        if (pq->OSQIn == pq->OSQEnd) {                    /* Wrap IN ptr if we are at end of queue         */
;;;432            pq->OSQIn = pq->OSQStart;
;;;433        }
;;;434        OS_EXIT_CRITICAL();
;;;435        return (OS_NO_ERR);
;;;436    }
000458  e12fff1e          BX       lr
                  |L1.1116|
00045c  e3550000          CMP      r5,#0                 ;410
000460  1a000001          BNE      |L1.1132|
000464  e3a00003          MOV      r0,#3                 ;411
000468  eafffff9          B        |L1.1108|
                  |L1.1132|
00046c  e5d40000          LDRB     r0,[r4,#0]            ;413
000470  e3500002          CMP      r0,#2                 ;413
000474  0a000001          BEQ      |L1.1152|
000478  e3a00001          MOV      r0,#1                 ;414
00047c  eafffff4          B        |L1.1108|
                  |L1.1152|
000480  ef000002          SVC      #0x2                  ;417
000484  e5d40001          LDRB     r0,[r4,#1]            ;418
000488  e3500000          CMP      r0,#0                 ;418
00048c  0a000007          BEQ      |L1.1200|
000490  e3a02004          MOV      r2,#4                 ;419
000494  e1a01005          MOV      r1,r5                 ;419
000498  e1a00004          MOV      r0,r4                 ;419
00049c  ebfffffe          BL       OS_EventTaskRdy
0004a0  ef000003          SVC      #0x3                  ;420
0004a4  ebfffffe          BL       OS_Sched
0004a8  e3a00000          MOV      r0,#0                 ;422
0004ac  eaffffe8          B        |L1.1108|
                  |L1.1200|
0004b0  e5940004          LDR      r0,[r4,#4]            ;424
0004b4  e1d011b6          LDRH     r1,[r0,#0x16]         ;425
0004b8  e1d021b4          LDRH     r2,[r0,#0x14]         ;425
0004bc  e1510002          CMP      r1,r2                 ;425
0004c0  3a000002          BCC      |L1.1232|
0004c4  ef000003          SVC      #0x3                  ;426
0004c8  e3a0001e          MOV      r0,#0x1e              ;427
0004cc  eaffffe0          B        |L1.1108|
                  |L1.1232|
0004d0  e590100c          LDR      r1,[r0,#0xc]          ;429
0004d4  e2812004          ADD      r2,r1,#4              ;429
0004d8  e580200c          STR      r2,[r0,#0xc]          ;429
0004dc  e5815000          STR      r5,[r1,#0]            ;429
0004e0  e1d011b6          LDRH     r1,[r0,#0x16]         ;430
0004e4  e2811001          ADD      r1,r1,#1              ;430
0004e8  e1c011b6          STRH     r1,[r0,#0x16]         ;430
0004ec  e590100c          LDR      r1,[r0,#0xc]          ;431
0004f0  e5902008          LDR      r2,[r0,#8]            ;431
0004f4  e1510002          CMP      r1,r2                 ;431
0004f8  1a000001          BNE      |L1.1284|
0004fc  e5901004          LDR      r1,[r0,#4]            ;432
000500  e580100c          STR      r1,[r0,#0xc]          ;432
                  |L1.1284|
000504  ef000003          SVC      #0x3                  ;434
000508  e3a00000          MOV      r0,#0                 ;435
00050c  eaffffd0          B        |L1.1108|
;;;437    #endif
                          ENDP

                  OSQPostFront PROC
;;;460    INT8U  OSQPostFront (OS_EVENT *pevent, void *msg)
;;;461    {
000510  e92d4070          PUSH     {r4-r6,lr}
000514  e1a04000          MOV      r4,r0
000518  e1a05001          MOV      r5,r1
;;;462    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;463        OS_CPU_SR  cpu_sr;
;;;464    #endif
;;;465        OS_Q      *pq;
;;;466    
;;;467    
;;;468    #if OS_ARG_CHK_EN > 0
;;;469        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
00051c  e3540000          CMP      r4,#0
000520  1a000002          BNE      |L1.1328|
;;;470            return (OS_ERR_PEVENT_NULL);
000524  e3a00004          MOV      r0,#4
                  |L1.1320|
000528  e8bd4070          POP      {r4-r6,lr}
;;;471        }
;;;472        if (msg == (void *)0) {                           /* Make sure we are not posting a NULL pointer   */
;;;473            return (OS_ERR_POST_NULL_PTR);
;;;474        }
;;;475        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* Validate event block type                     */
;;;476            return (OS_ERR_EVENT_TYPE);
;;;477        }
;;;478    #endif
;;;479        OS_ENTER_CRITICAL();
;;;480        if (pevent->OSEventGrp != 0x00) {                 /* See if any task pending on queue              */
;;;481            OS_EventTaskRdy(pevent, msg, OS_STAT_Q);      /* Ready highest priority task waiting on event  */
;;;482            OS_EXIT_CRITICAL();
;;;483            OS_Sched();                                   /* Find highest priority task ready to run       */
;;;484            return (OS_NO_ERR);
;;;485        }
;;;486        pq = (OS_Q *)pevent->OSEventPtr;                  /* Point to queue control block                  */
;;;487        if (pq->OSQEntries >= pq->OSQSize) {              /* Make sure queue is not full                   */
;;;488            OS_EXIT_CRITICAL();
;;;489            return (OS_Q_FULL);
;;;490        }
;;;491        if (pq->OSQOut == pq->OSQStart) {                 /* Wrap OUT ptr if we are at the 1st queue entry */
;;;492            pq->OSQOut = pq->OSQEnd;
;;;493        }
;;;494        pq->OSQOut--;
;;;495        *pq->OSQOut = msg;                                /* Insert message into queue                     */
;;;496        pq->OSQEntries++;                                 /* Update the nbr of entries in the queue        */
;;;497        OS_EXIT_CRITICAL();
;;;498        return (OS_NO_ERR);
;;;499    }
00052c  e12fff1e          BX       lr
                  |L1.1328|
000530  e3550000          CMP      r5,#0                 ;472
000534  1a000001          BNE      |L1.1344|
000538  e3a00003          MOV      r0,#3                 ;473
00053c  eafffff9          B        |L1.1320|
                  |L1.1344|
000540  e5d40000          LDRB     r0,[r4,#0]            ;475
000544  e3500002          CMP      r0,#2                 ;475
000548  0a000001          BEQ      |L1.1364|
00054c  e3a00001          MOV      r0,#1                 ;476
000550  eafffff4          B        |L1.1320|
                  |L1.1364|
000554  ef000002          SVC      #0x2                  ;479
000558  e5d40001          LDRB     r0,[r4,#1]            ;480
00055c  e3500000          CMP      r0,#0                 ;480
000560  0a000007          BEQ      |L1.1412|
000564  e3a02004          MOV      r2,#4                 ;481
000568  e1a01005          MOV      r1,r5                 ;481
00056c  e1a00004          MOV      r0,r4                 ;481
000570  ebfffffe          BL       OS_EventTaskRdy
000574  ef000003          SVC      #0x3                  ;482
000578  ebfffffe          BL       OS_Sched
00057c  e3a00000          MOV      r0,#0                 ;484
000580  eaffffe8          B        |L1.1320|
                  |L1.1412|
000584  e5940004          LDR      r0,[r4,#4]            ;486
000588  e1d011b6          LDRH     r1,[r0,#0x16]         ;487
00058c  e1d021b4          LDRH     r2,[r0,#0x14]         ;487
000590  e1510002          CMP      r1,r2                 ;487
000594  3a000002          BCC      |L1.1444|
000598  ef000003          SVC      #0x3                  ;488
00059c  e3a0001e          MOV      r0,#0x1e              ;489
0005a0  eaffffe0          B        |L1.1320|
                  |L1.1444|
0005a4  e5901010          LDR      r1,[r0,#0x10]         ;491
0005a8  e5902004          LDR      r2,[r0,#4]            ;491
0005ac  e1510002          CMP      r1,r2                 ;491
0005b0  1a000001          BNE      |L1.1468|
0005b4  e5901008          LDR      r1,[r0,#8]            ;492
0005b8  e5801010          STR      r1,[r0,#0x10]         ;492
                  |L1.1468|
0005bc  e5901010          LDR      r1,[r0,#0x10]         ;494
0005c0  e2411004          SUB      r1,r1,#4              ;494
0005c4  e5801010          STR      r1,[r0,#0x10]         ;494
0005c8  e5815000          STR      r5,[r1,#0]            ;495
0005cc  e1d011b6          LDRH     r1,[r0,#0x16]         ;496
0005d0  e2811001          ADD      r1,r1,#1              ;496
0005d4  e1c011b6          STRH     r1,[r0,#0x16]         ;496
0005d8  ef000003          SVC      #0x3                  ;497
0005dc  e3a00000          MOV      r0,#0                 ;498
0005e0  eaffffd0          B        |L1.1320|
;;;500    #endif
                          ENDP

                  OSQPostOpt PROC
;;;546    INT8U  OSQPostOpt (OS_EVENT *pevent, void *msg, INT8U opt)
;;;547    {
0005e4  e92d4070          PUSH     {r4-r6,lr}
0005e8  e1a04000          MOV      r4,r0
0005ec  e1a05001          MOV      r5,r1
0005f0  e1a06002          MOV      r6,r2
;;;548    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;549        OS_CPU_SR  cpu_sr;
;;;550    #endif
;;;551        OS_Q      *pq;
;;;552    
;;;553    
;;;554    #if OS_ARG_CHK_EN > 0
;;;555        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
0005f4  e3540000          CMP      r4,#0
0005f8  1a000002          BNE      |L1.1544|
;;;556            return (OS_ERR_PEVENT_NULL);
0005fc  e3a00004          MOV      r0,#4
                  |L1.1536|
000600  e8bd4070          POP      {r4-r6,lr}
;;;557        }
;;;558        if (msg == (void *)0) {                           /* Make sure we are not posting a NULL pointer   */
;;;559            return (OS_ERR_POST_NULL_PTR);
;;;560        }
;;;561        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* Validate event block type                     */
;;;562            return (OS_ERR_EVENT_TYPE);
;;;563        }
;;;564    #endif
;;;565        OS_ENTER_CRITICAL();
;;;566        if (pevent->OSEventGrp != 0x00) {                 /* See if any task pending on queue              */
;;;567            if ((opt & OS_POST_OPT_BROADCAST) != 0x00) {  /* Do we need to post msg to ALL waiting tasks ? */
;;;568                while (pevent->OSEventGrp != 0x00) {      /* Yes, Post to ALL tasks waiting on queue       */
;;;569                    OS_EventTaskRdy(pevent, msg, OS_STAT_Q);
;;;570                }
;;;571            } else {
;;;572                OS_EventTaskRdy(pevent, msg, OS_STAT_Q);  /* No,  Post to HPT waiting on queue             */
;;;573            }
;;;574            OS_EXIT_CRITICAL();

⌨️ 快捷键说明

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