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

📄 os_mbox.txt

📁 ucos2 is a file system for embedded applications which can be used on any media, for which you can p
💻 TXT
📖 第 1 页 / 共 3 页
字号:
00038c  e1a00007          MOV      r0,r7                 ;422
000390  ebfffffe          BL       OS_CPU_SR_Restore
000394  e3a00000          MOV      r0,#0                 ;423
000398  eaffffd7          B        |L1.764|
;;;426    #endif
                          ENDP

                  OSMboxPost PROC
;;;452    INT8U  OSMboxPost (OS_EVENT *pevent, void *pmsg)
;;;453    {
00039c  e92d4070          PUSH     {r4-r6,lr}
0003a0  e1a04000          MOV      r4,r0
;;;454    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;455        OS_CPU_SR  cpu_sr = 0;
;;;456    #endif
;;;457    
;;;458    
;;;459    
;;;460    #if OS_ARG_CHK_EN > 0
;;;461        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
;;;462            return (OS_ERR_PEVENT_NULL);
;;;463        }
;;;464        if (pmsg == (void *)0) {                          /* Make sure we are not posting a NULL pointer   */
;;;465            return (OS_ERR_POST_NULL_PTR);
;;;466        }
;;;467    #endif
;;;468        if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {  /* Validate event block type                     */
0003a4  e5d00000          LDRB     r0,[r0,#0]
0003a8  e1a06001          MOV      r6,r1                 ;453
0003ac  e3500001          CMP      r0,#1
;;;469            return (OS_ERR_EVENT_TYPE);
0003b0  13a00001          MOVNE    r0,#1
0003b4  1a000013          BNE      |L1.1032|
;;;470        }
;;;471        OS_ENTER_CRITICAL();
0003b8  ebfffffe          BL       OS_CPU_SR_Save
0003bc  e1a05000          MOV      r5,r0
;;;472        if (pevent->OSEventGrp != 0) {                    /* See if any task pending on mailbox            */
0003c0  e5d4000a          LDRB     r0,[r4,#0xa]
0003c4  e3500000          CMP      r0,#0
0003c8  0a000008          BEQ      |L1.1008|
;;;473                                                          /* Ready HPT waiting on event                    */
;;;474            (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
0003cc  e3a03000          MOV      r3,#0
0003d0  e3a02002          MOV      r2,#2
0003d4  e1a01006          MOV      r1,r6
0003d8  e1a00004          MOV      r0,r4
0003dc  ebfffffe          BL       OS_EventTaskRdy
;;;475            OS_EXIT_CRITICAL();
0003e0  e1a00005          MOV      r0,r5
0003e4  ebfffffe          BL       OS_CPU_SR_Restore
;;;476            OS_Sched();                                   /* Find highest priority task ready to run       */
0003e8  ebfffffe          BL       OS_Sched
;;;477            return (OS_ERR_NONE);
0003ec  ea00000a          B        |L1.1052|
                  |L1.1008|
;;;478        }
;;;479        if (pevent->OSEventPtr != (void *)0) {            /* Make sure mailbox doesn't already have a msg  */
0003f0  e5940004          LDR      r0,[r4,#4]
0003f4  e3500000          CMP      r0,#0
0003f8  0a000004          BEQ      |L1.1040|
;;;480            OS_EXIT_CRITICAL();
0003fc  e1a00005          MOV      r0,r5
000400  ebfffffe          BL       OS_CPU_SR_Restore
;;;481            return (OS_ERR_MBOX_FULL);
000404  e3a00014          MOV      r0,#0x14
                  |L1.1032|
000408  e8bd4070          POP      {r4-r6,lr}
;;;482        }
;;;483        pevent->OSEventPtr = pmsg;                        /* Place message in mailbox                      */
;;;484        OS_EXIT_CRITICAL();
;;;485        return (OS_ERR_NONE);
;;;486    }
00040c  e12fff1e          BX       lr
                  |L1.1040|
000410  e1a00005          MOV      r0,r5                 ;484
000414  e5846004          STR      r6,[r4,#4]            ;484
000418  ebfffffe          BL       OS_CPU_SR_Restore
                  |L1.1052|
00041c  e3a00000          MOV      r0,#0                 ;485
000420  eafffff8          B        |L1.1032|
;;;487    #endif
                          ENDP

                  OSMboxPostOpt PROC
;;;523    INT8U  OSMboxPostOpt (OS_EVENT *pevent, void *pmsg, INT8U opt)
;;;524    {
000424  e92d41f0          PUSH     {r4-r8,lr}
000428  e1a04000          MOV      r4,r0
;;;525    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;526        OS_CPU_SR  cpu_sr = 0;
;;;527    #endif
;;;528    
;;;529    
;;;530    
;;;531    #if OS_ARG_CHK_EN > 0
;;;532        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
;;;533            return (OS_ERR_PEVENT_NULL);
;;;534        }
;;;535        if (pmsg == (void *)0) {                          /* Make sure we are not posting a NULL pointer   */
;;;536            return (OS_ERR_POST_NULL_PTR);
;;;537        }
;;;538    #endif
;;;539        if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {  /* Validate event block type                     */
00042c  e5d00000          LDRB     r0,[r0,#0]
000430  e1a06001          MOV      r6,r1                 ;524
000434  e1a05002          MOV      r5,r2                 ;524
000438  e3500001          CMP      r0,#1
;;;540            return (OS_ERR_EVENT_TYPE);
00043c  13a00001          MOVNE    r0,#1
000440  1a000019          BNE      |L1.1196|
;;;541        }
;;;542        OS_ENTER_CRITICAL();
000444  ebfffffe          BL       OS_CPU_SR_Save
000448  e1a07000          MOV      r7,r0
;;;543        if (pevent->OSEventGrp != 0) {                    /* See if any task pending on mailbox            */
00044c  e5d4000a          LDRB     r0,[r4,#0xa]
000450  e3500000          CMP      r0,#0
000454  0a000016          BEQ      |L1.1204|
;;;544            if ((opt & OS_POST_OPT_BROADCAST) != 0x00) {  /* Do we need to post msg to ALL waiting tasks ? */
000458  e3150001          TST      r5,#1
00045c  0a000008          BEQ      |L1.1156|
                  |L1.1120|
;;;545                while (pevent->OSEventGrp != 0) {         /* Yes, Post to ALL tasks waiting on mailbox     */
;;;546                    (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
000460  e3a03000          MOV      r3,#0
000464  e3a02002          MOV      r2,#2
000468  e1a01006          MOV      r1,r6
00046c  e1a00004          MOV      r0,r4
000470  ebfffffe          BL       OS_EventTaskRdy
000474  e5d4000a          LDRB     r0,[r4,#0xa]          ;545
000478  e3500000          CMP      r0,#0                 ;545
00047c  1afffff7          BNE      |L1.1120|
000480  ea000004          B        |L1.1176|
                  |L1.1156|
;;;547                }
;;;548            } else {                                      /* No,  Post to HPT waiting on mbox              */
;;;549                (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
000484  e3a03000          MOV      r3,#0
000488  e3a02002          MOV      r2,#2
00048c  e1a01006          MOV      r1,r6
000490  e1a00004          MOV      r0,r4
000494  ebfffffe          BL       OS_EventTaskRdy
                  |L1.1176|
;;;550            }
;;;551            OS_EXIT_CRITICAL();
000498  e1a00007          MOV      r0,r7
00049c  ebfffffe          BL       OS_CPU_SR_Restore
;;;552            if ((opt & OS_POST_OPT_NO_SCHED) == 0) {	  /* See if scheduler needs to be invoked          */
0004a0  e3150004          TST      r5,#4
;;;553                OS_Sched();                               /* Find HPT ready to run                         */
0004a4  0bfffffe          BLEQ     OS_Sched
                  |L1.1192|
;;;554            }
;;;555            return (OS_ERR_NONE);
0004a8  e3a00000          MOV      r0,#0
                  |L1.1196|
0004ac  e8bd41f0          POP      {r4-r8,lr}
;;;556        }
;;;557        if (pevent->OSEventPtr != (void *)0) {            /* Make sure mailbox doesn't already have a msg  */
;;;558            OS_EXIT_CRITICAL();
;;;559            return (OS_ERR_MBOX_FULL);
;;;560        }
;;;561        pevent->OSEventPtr = pmsg;                        /* Place message in mailbox                      */
;;;562        OS_EXIT_CRITICAL();
;;;563        return (OS_ERR_NONE);
;;;564    }
0004b0  e12fff1e          BX       lr
                  |L1.1204|
0004b4  e5940004          LDR      r0,[r4,#4]            ;557
0004b8  e3500000          CMP      r0,#0                 ;557
0004bc  0a000003          BEQ      |L1.1232|
0004c0  e1a00007          MOV      r0,r7                 ;558
0004c4  ebfffffe          BL       OS_CPU_SR_Restore
0004c8  e3a00014          MOV      r0,#0x14              ;559
0004cc  eafffff6          B        |L1.1196|
                  |L1.1232|
0004d0  e1a00007          MOV      r0,r7                 ;562
0004d4  e5846004          STR      r6,[r4,#4]            ;562
0004d8  ebfffffe          BL       OS_CPU_SR_Restore
0004dc  eafffff1          B        |L1.1192|
;;;565    #endif
                          ENDP

                  OSMboxQuery PROC
;;;587    INT8U  OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *p_mbox_data)
;;;588    {
0004e0  e92d4070          PUSH     {r4-r6,lr}
0004e4  e1a04000          MOV      r4,r0
;;;589        INT8U      i;
;;;590    #if OS_LOWEST_PRIO <= 63
;;;591        INT8U     *psrc;
;;;592        INT8U     *pdest;
;;;593    #else
;;;594        INT16U    *psrc;
;;;595        INT16U    *pdest;
;;;596    #endif
;;;597    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;598        OS_CPU_SR  cpu_sr = 0;
;;;599    #endif
;;;600    
;;;601    
;;;602    
;;;603    #if OS_ARG_CHK_EN > 0
;;;604        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;605            return (OS_ERR_PEVENT_NULL);
;;;606        }
;;;607        if (p_mbox_data == (OS_MBOX_DATA *)0) {                /* Validate 'p_mbox_data'                   */
;;;608            return (OS_ERR_PDATA_NULL);
;;;609        }
;;;610    #endif
;;;611        if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {       /* Validate event block type                */
0004e8  e5d00000          LDRB     r0,[r0,#0]
0004ec  e1a05001          MOV      r5,r1                 ;588
0004f0  e3500001          CMP      r0,#1
;;;612            return (OS_ERR_EVENT_TYPE);
0004f4  13a00001          MOVNE    r0,#1
0004f8  1a00000f          BNE      |L1.1340|
;;;613        }
;;;614        OS_ENTER_CRITICAL();
0004fc  ebfffffe          BL       OS_CPU_SR_Save
;;;615        p_mbox_data->OSEventGrp = pevent->OSEventGrp;          /* Copy message mailbox wait list           */
000500  e5d4100a          LDRB     r1,[r4,#0xa]
;;;616        psrc                    = &pevent->OSEventTbl[0];
000504  e284200b          ADD      r2,r4,#0xb
;;;617        pdest                   = &p_mbox_data->OSEventTbl[0];
000508  e2853004          ADD      r3,r5,#4
00050c  e5c51008          STRB     r1,[r5,#8]            ;615
;;;618        for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
000510  e3a01000          MOV      r1,#0
                  |L1.1300|
;;;619            *pdest++ = *psrc++;
000514  e4d2c001          LDRB     r12,[r2],#1
000518  e2811001          ADD      r1,r1,#1              ;618
00051c  e20110ff          AND      r1,r1,#0xff           ;618
000520  e3510004          CMP      r1,#4                 ;618
000524  e4c3c001          STRB     r12,[r3],#1
000528  3afffff9          BCC      |L1.1300|
;;;620        }
;;;621        p_mbox_data->OSMsg = pevent->OSEventPtr;               /* Get message from mailbox                 */
00052c  e5941004          LDR      r1,[r4,#4]
000530  e5851000          STR      r1,[r5,#0]
;;;622        OS_EXIT_CRITICAL();
000534  ebfffffe          BL       OS_CPU_SR_Restore
;;;623        return (OS_ERR_NONE);
000538  e3a00000          MOV      r0,#0
                  |L1.1340|
00053c  e8bd4070          POP      {r4-r6,lr}
;;;624    }
000540  e12fff1e          BX       lr
;;;625    #endif                                                     /* OS_MBOX_QUERY_EN                         */
                          ENDP

                  |L1.1348|
000544  00000000          DCD      OSIntNesting
                  |L1.1352|
000548  00000000          DCD      OSEventFreeList
                  |L1.1356|
00054c  00000000          DCD      OSLockNesting
                  |L1.1360|
000550  00000000          DCD      OSTCBCur

⌨️ 快捷键说明

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