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

📄 os_mbox.txt

📁 ucos2.86版本结合STM板极支持包
💻 TXT
📖 第 1 页 / 共 3 页
字号:
0002ae  2000              MOVS     r0,#0
0002b0  7030              STRB     r0,[r6,#0]
;;;424        return (0);                                            /* No tasks waiting on mailbox              */
;;;425    }
0002b2  e8bde8bd          POP      {r4-r8,pc}
;;;426    #endif
                          ENDP

                  OSMboxPost PROC
;;;452    INT8U  OSMboxPost (OS_EVENT *pevent, void *pmsg)
;;;453    {
0002b6  b570              PUSH     {r4-r6,lr}
0002b8  4604              MOV      r4,r0
0002ba  460d              MOV      r5,r1
;;;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'                             */
0002bc  b90c              CBNZ     r4,|L1.706|
;;;462            return (OS_ERR_PEVENT_NULL);
0002be  2004              MOVS     r0,#4
;;;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                     */
;;;469            return (OS_ERR_EVENT_TYPE);
;;;470        }
;;;471        OS_ENTER_CRITICAL();
;;;472        if (pevent->OSEventGrp != 0) {                    /* See if any task pending on mailbox            */
;;;473                                                          /* Ready HPT waiting on event                    */
;;;474            (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
;;;475            OS_EXIT_CRITICAL();
;;;476            OS_Sched();                                   /* Find highest priority task ready to run       */
;;;477            return (OS_ERR_NONE);
;;;478        }
;;;479        if (pevent->OSEventPtr != (void *)0) {            /* Make sure mailbox doesn't already have a msg  */
;;;480            OS_EXIT_CRITICAL();
;;;481            return (OS_ERR_MBOX_FULL);
;;;482        }
;;;483        pevent->OSEventPtr = pmsg;                        /* Place message in mailbox                      */
;;;484        OS_EXIT_CRITICAL();
;;;485        return (OS_ERR_NONE);
;;;486    }
0002c0  bd70              POP      {r4-r6,pc}
                  |L1.706|
0002c2  b90d              CBNZ     r5,|L1.712|
0002c4  2003              MOVS     r0,#3
0002c6  bd70              POP      {r4-r6,pc}
                  |L1.712|
0002c8  7820              LDRB     r0,[r4,#0]
0002ca  2801              CMP      r0,#1
0002cc  d001              BEQ      |L1.722|
0002ce  2001              MOVS     r0,#1
0002d0  bd70              POP      {r4-r6,pc}
                  |L1.722|
0002d2  f7fff7ff          BL       OS_CPU_SR_Save
0002d6  4606              MOV      r6,r0
0002d8  7aa0              LDRB     r0,[r4,#0xa]
0002da  b160              CBZ      r0,|L1.758|
0002dc  2300              MOVS     r3,#0
0002de  2202              MOVS     r2,#2
0002e0  4629              MOV      r1,r5
0002e2  4620              MOV      r0,r4
0002e4  f7fff7ff          BL       OS_EventTaskRdy
0002e8  4630              MOV      r0,r6
0002ea  f7fff7ff          BL       OS_CPU_SR_Restore
0002ee  f7fff7ff          BL       OS_Sched
0002f2  2000              MOVS     r0,#0
0002f4  bd70              POP      {r4-r6,pc}
                  |L1.758|
0002f6  6860              LDR      r0,[r4,#4]
0002f8  b120              CBZ      r0,|L1.772|
0002fa  4630              MOV      r0,r6
0002fc  f7fff7ff          BL       OS_CPU_SR_Restore
000300  2014              MOVS     r0,#0x14
000302  bd70              POP      {r4-r6,pc}
                  |L1.772|
000304  6065              STR      r5,[r4,#4]
000306  4630              MOV      r0,r6
000308  f7fff7ff          BL       OS_CPU_SR_Restore
00030c  2000              MOVS     r0,#0
00030e  bd70              POP      {r4-r6,pc}
;;;487    #endif
                          ENDP

                  OSMboxPostOpt PROC
;;;523    INT8U  OSMboxPostOpt (OS_EVENT *pevent, void *pmsg, INT8U opt)
;;;524    {
000310  e92de92d          PUSH     {r4-r8,lr}
000314  4604              MOV      r4,r0
000316  460d              MOV      r5,r1
000318  4616              MOV      r6,r2
;;;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'                             */
00031a  b914              CBNZ     r4,|L1.802|
;;;533            return (OS_ERR_PEVENT_NULL);
00031c  2004              MOVS     r0,#4
00031e  e8bde8bd          POP      {r4-r8,pc}
                  |L1.802|
;;;534        }
;;;535        if (pmsg == (void *)0) {                          /* Make sure we are not posting a NULL pointer   */
000322  b915              CBNZ     r5,|L1.810|
;;;536            return (OS_ERR_POST_NULL_PTR);
000324  2003              MOVS     r0,#3
000326  e8bde8bd          POP      {r4-r8,pc}
                  |L1.810|
;;;537        }
;;;538    #endif
;;;539        if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {  /* Validate event block type                     */
00032a  7820              LDRB     r0,[r4,#0]
00032c  2801              CMP      r0,#1
00032e  d002              BEQ      |L1.822|
;;;540            return (OS_ERR_EVENT_TYPE);
000330  2001              MOVS     r0,#1
000332  e8bde8bd          POP      {r4-r8,pc}
                  |L1.822|
;;;541        }
;;;542        OS_ENTER_CRITICAL();
000336  f7fff7ff          BL       OS_CPU_SR_Save
00033a  4607              MOV      r7,r0
;;;543        if (pevent->OSEventGrp != 0) {                    /* See if any task pending on mailbox            */
00033c  7aa0              LDRB     r0,[r4,#0xa]
00033e  b1e8              CBZ      r0,|L1.892|
;;;544            if ((opt & OS_POST_OPT_BROADCAST) != 0x00) {  /* Do we need to post msg to ALL waiting tasks ? */
000340  f016f016          TST      r6,#1
000344  d009              BEQ      |L1.858|
                  |L1.838|
000346  2300              MOVS     r3,#0
000348  2202              MOVS     r2,#2
00034a  4629              MOV      r1,r5
00034c  4620              MOV      r0,r4
00034e  f7fff7ff          BL       OS_EventTaskRdy
;;;545                while (pevent->OSEventGrp != 0) {         /* Yes, Post to ALL tasks waiting on mailbox     */
000352  7aa0              LDRB     r0,[r4,#0xa]
000354  2800              CMP      r0,#0
000356  d1f6              BNE      |L1.838|
000358  e005              B        |L1.870|
                  |L1.858|
;;;546                    (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
;;;547                }
;;;548            } else {                                      /* No,  Post to HPT waiting on mbox              */
;;;549                (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
00035a  2300              MOVS     r3,#0
00035c  2202              MOVS     r2,#2
00035e  4629              MOV      r1,r5
000360  4620              MOV      r0,r4
000362  f7fff7ff          BL       OS_EventTaskRdy
                  |L1.870|
;;;550            }
;;;551            OS_EXIT_CRITICAL();
000366  4638              MOV      r0,r7
000368  f7fff7ff          BL       OS_CPU_SR_Restore
;;;552            if ((opt & OS_POST_OPT_NO_SCHED) == 0) {	  /* See if scheduler needs to be invoked          */
00036c  f016f016          TST      r6,#4
000370  d101              BNE      |L1.886|
;;;553                OS_Sched();                               /* Find HPT ready to run                         */
000372  f7fff7ff          BL       OS_Sched
                  |L1.886|
;;;554            }
;;;555            return (OS_ERR_NONE);
000376  2000              MOVS     r0,#0
000378  e8bde8bd          POP      {r4-r8,pc}
                  |L1.892|
;;;556        }
;;;557        if (pevent->OSEventPtr != (void *)0) {            /* Make sure mailbox doesn't already have a msg  */
00037c  6860              LDR      r0,[r4,#4]
00037e  b128              CBZ      r0,|L1.908|
;;;558            OS_EXIT_CRITICAL();
000380  4638              MOV      r0,r7
000382  f7fff7ff          BL       OS_CPU_SR_Restore
;;;559            return (OS_ERR_MBOX_FULL);
000386  2014              MOVS     r0,#0x14
000388  e8bde8bd          POP      {r4-r8,pc}
                  |L1.908|
;;;560        }
;;;561        pevent->OSEventPtr = pmsg;                        /* Place message in mailbox                      */
00038c  6065              STR      r5,[r4,#4]
;;;562        OS_EXIT_CRITICAL();
00038e  4638              MOV      r0,r7
000390  f7fff7ff          BL       OS_CPU_SR_Restore
;;;563        return (OS_ERR_NONE);
000394  2000              MOVS     r0,#0
;;;564    }
000396  e8bde8bd          POP      {r4-r8,pc}
;;;565    #endif
                          ENDP

                  OSMboxQuery PROC
;;;587    INT8U  OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *p_mbox_data)
;;;588    {
00039a  b570              PUSH     {r4-r6,lr}
00039c  4604              MOV      r4,r0
00039e  460d              MOV      r5,r1
;;;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'                        */
0003a0  b90c              CBNZ     r4,|L1.934|
;;;605            return (OS_ERR_PEVENT_NULL);
0003a2  2004              MOVS     r0,#4
;;;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                */
;;;612            return (OS_ERR_EVENT_TYPE);
;;;613        }
;;;614        OS_ENTER_CRITICAL();
;;;615        p_mbox_data->OSEventGrp = pevent->OSEventGrp;          /* Copy message mailbox wait list           */
;;;616        psrc                    = &pevent->OSEventTbl[0];
;;;617        pdest                   = &p_mbox_data->OSEventTbl[0];
;;;618        for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
;;;619            *pdest++ = *psrc++;
;;;620        }
;;;621        p_mbox_data->OSMsg = pevent->OSEventPtr;               /* Get message from mailbox                 */
;;;622        OS_EXIT_CRITICAL();
;;;623        return (OS_ERR_NONE);
;;;624    }
0003a4  bd70              POP      {r4-r6,pc}
                  |L1.934|
0003a6  b90d              CBNZ     r5,|L1.940|
0003a8  2009              MOVS     r0,#9
0003aa  bd70              POP      {r4-r6,pc}
                  |L1.940|
0003ac  7820              LDRB     r0,[r4,#0]
0003ae  2801              CMP      r0,#1
0003b0  d001              BEQ      |L1.950|
0003b2  2001              MOVS     r0,#1
0003b4  bd70              POP      {r4-r6,pc}
                  |L1.950|
0003b6  f7fff7ff          BL       OS_CPU_SR_Save
0003ba  7aa1              LDRB     r1,[r4,#0xa]
0003bc  7229              STRB     r1,[r5,#8]
0003be  f104f104          ADD      r2,r4,#0xb
0003c2  1d2b              ADDS     r3,r5,#4
0003c4  2100              MOVS     r1,#0
                  |L1.966|
0003c6  f812f812          LDRB     r12,[r2],#1
0003ca  f803f803          STRB     r12,[r3],#1
0003ce  1c49              ADDS     r1,r1,#1
0003d0  b2c9              UXTB     r1,r1
0003d2  2904              CMP      r1,#4
0003d4  d3f7              BCC      |L1.966|
0003d6  6861              LDR      r1,[r4,#4]
0003d8  6029              STR      r1,[r5,#0]
0003da  f7fff7ff          BL       OS_CPU_SR_Restore
0003de  2000              MOVS     r0,#0
0003e0  bd70              POP      {r4-r6,pc}
;;;625    #endif                                                     /* OS_MBOX_QUERY_EN                         */
                          ENDP

0003e2  0000              DCW      0x0000
                  |L1.996|
0003e4  00000000          DCD      OSIntNesting
                  |L1.1000|
0003e8  00000000          DCD      OSEventFreeList
                  |L1.1004|
0003ec  00000000          DCD      OSLockNesting
                  |L1.1008|
0003f0  00000000          DCD      OSTCBCur

⌨️ 快捷键说明

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