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

📄 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 页
字号:
0001a0  ebfffffe          BL       OS_CPU_SR_Restore
0001a4  e3560001          CMP      r6,#1                 ;223
0001a8  0bfffffe          BLEQ     OS_Sched
                  |L1.428|
0001ac  e3a00000          MOV      r0,#0                 ;227
0001b0  e5c5a000          STRB     r10,[r5,#0]           ;226
0001b4  eaffffe7          B        |L1.344|
                  |L1.440|
0001b8  e1a00007          MOV      r0,r7                 ;231
0001bc  ebfffffe          BL       OS_CPU_SR_Restore
0001c0  e3a00007          MOV      r0,#7                 ;232
0001c4  eaffffe1          B        |L1.336|
;;;238    #endif
                          ENDP

                  OSMboxPend PROC
;;;274    void  *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;275    {
0001c8  e92d47f0          PUSH     {r4-r10,lr}
0001cc  e1a06000          MOV      r6,r0
;;;276        void      *pmsg;
;;;277        INT8U      pend_stat;
;;;278    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;279        OS_CPU_SR  cpu_sr = 0;
;;;280    #endif
;;;281    
;;;282    
;;;283    
;;;284    #if OS_ARG_CHK_EN > 0
;;;285        if (perr == (INT8U *)0) {                         /* Validate 'perr'                               */
;;;286            return ((void *)0);
;;;287        }
;;;288        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
;;;289            *perr = OS_ERR_PEVENT_NULL;
;;;290            return ((void *)0);
;;;291        }
;;;292    #endif
;;;293        if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {  /* Validate event block type                     */
0001d0  e5d00000          LDRB     r0,[r0,#0]
0001d4  e1a09001          MOV      r9,r1                 ;275
0001d8  e1a04002          MOV      r4,r2                 ;275
0001dc  e3500001          CMP      r0,#1
;;;294            *perr = OS_ERR_EVENT_TYPE;
0001e0  13a00001          MOVNE    r0,#1
;;;295            return ((void *)0);
0001e4  1a000004          BNE      |L1.508|
;;;296        }
;;;297        if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */
0001e8  e59f0354          LDR      r0,|L1.1348|
0001ec  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0001f0  e3500000          CMP      r0,#0
0001f4  0a000004          BEQ      |L1.524|
;;;298            *perr = OS_ERR_PEND_ISR;                      /* ... can't PEND from an ISR                    */
0001f8  e3a00002          MOV      r0,#2
                  |L1.508|
0001fc  e5c40000          STRB     r0,[r4,#0]            ;294
;;;299            return ((void *)0);
;;;300        }
;;;301        if (OSLockNesting > 0) {                          /* See if called with scheduler locked ...       */
;;;302            *perr = OS_ERR_PEND_LOCKED;                   /* ... can't PEND when locked                    */
;;;303            return ((void *)0);
;;;304        }
;;;305        OS_ENTER_CRITICAL();
;;;306        pmsg = pevent->OSEventPtr;
;;;307        if (pmsg != (void *)0) {                          /* See if there is already a message             */
;;;308            pevent->OSEventPtr = (void *)0;               /* Clear the mailbox                             */
;;;309            OS_EXIT_CRITICAL();
;;;310            *perr = OS_ERR_NONE;
;;;311            return (pmsg);                                /* Return the message received (or NULL)         */
;;;312        }
;;;313        OSTCBCur->OSTCBStat     |= OS_STAT_MBOX;          /* Message not available, task will pend         */
;;;314        OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;
;;;315        OSTCBCur->OSTCBDly       = timeout;               /* Load timeout in TCB                           */
;;;316        OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
;;;317        OS_EXIT_CRITICAL();
;;;318        OS_Sched();                                       /* Find next highest priority task ready to run  */
;;;319        OS_ENTER_CRITICAL();
;;;320        if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* See if we weren't given the message           */
;;;321            pend_stat = OSTCBCur->OSTCBStatPend;
;;;322            OS_EventTOAbort(pevent);                      /* Timed out, Make task ready                    */
;;;323            OS_EXIT_CRITICAL();
;;;324            switch (pend_stat) {
;;;325                case OS_STAT_PEND_TO:
;;;326                default:
;;;327                     *perr = OS_ERR_TIMEOUT;              /* Indicate that a timeout occured               */
;;;328                     break;
;;;329    
;;;330                case OS_STAT_PEND_ABORT:
;;;331                     *perr = OS_ERR_PEND_ABORT;           /* Indicate that we aborted                      */
;;;332                     break;
;;;333            }
;;;334            return ((void *)0);                           /* Return a NULL message                         */
000200  e3a00000          MOV      r0,#0
                  |L1.516|
000204  e8bd47f0          POP      {r4-r10,lr}
;;;335        }
;;;336        pmsg                    = OSTCBCur->OSTCBMsg;
;;;337        OSTCBCur->OSTCBMsg      = (void *)0;              /* Yes, clear message received                   */
;;;338        OSTCBCur->OSTCBStat     = OS_STAT_RDY;
;;;339        OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;          /* No longer waiting for event                   */
;;;340        OS_EXIT_CRITICAL();
;;;341        *perr                   = OS_ERR_NONE;
;;;342        return (pmsg);                                    /* Return the message received                   */
;;;343    }
000208  e12fff1e          BX       lr
                  |L1.524|
00020c  e59f0338          LDR      r0,|L1.1356|
000210  e5d00000          LDRB     r0,[r0,#0]            ;301  ; OSLockNesting
000214  e3500000          CMP      r0,#0                 ;301
000218  13a0000d          MOVNE    r0,#0xd               ;302
00021c  1afffff6          BNE      |L1.508|
000220  ebfffffe          BL       OS_CPU_SR_Save
000224  e5967004          LDR      r7,[r6,#4]            ;306
000228  e1a05000          MOV      r5,r0                 ;305
00022c  e3570000          CMP      r7,#0                 ;307
000230  e3a08000          MOV      r8,#0                 ;306
000234  0a000005          BEQ      |L1.592|
000238  e1a00005          MOV      r0,r5                 ;309
00023c  e5868004          STR      r8,[r6,#4]            ;309
000240  ebfffffe          BL       OS_CPU_SR_Restore
000244  e1a00007          MOV      r0,r7                 ;311
000248  e5c48000          STRB     r8,[r4,#0]            ;310
00024c  eaffffec          B        |L1.516|
                  |L1.592|
000250  e59f72f8          LDR      r7,|L1.1360|
000254  e5971000          LDR      r1,[r7,#0]            ;313  ; OSTCBCur
000258  e5d1002c          LDRB     r0,[r1,#0x2c]         ;313
00025c  e3800002          ORR      r0,r0,#2              ;313
000260  e5c1002c          STRB     r0,[r1,#0x2c]         ;313
000264  e5c1802d          STRB     r8,[r1,#0x2d]         ;314
000268  e1a00006          MOV      r0,r6                 ;316
00026c  e1c192ba          STRH     r9,[r1,#0x2a]         ;315
000270  ebfffffe          BL       OS_EventTaskWait
000274  e1a00005          MOV      r0,r5                 ;317
000278  ebfffffe          BL       OS_CPU_SR_Restore
00027c  ebfffffe          BL       OS_Sched
000280  ebfffffe          BL       OS_CPU_SR_Save
000284  e5971000          LDR      r1,[r7,#0]            ;320  ; OSTCBCur
000288  e1a09000          MOV      r9,r0                 ;319
00028c  e5d1502d          LDRB     r5,[r1,#0x2d]         ;320
000290  e3550000          CMP      r5,#0                 ;320
000294  0a000007          BEQ      |L1.696|
000298  e1a00006          MOV      r0,r6                 ;322
00029c  ebfffffe          BL       OS_EventTOAbort
0002a0  e1a00009          MOV      r0,r9                 ;323
0002a4  ebfffffe          BL       OS_CPU_SR_Restore
0002a8  e3550002          CMP      r5,#2                 ;324
0002ac  03a0000e          MOVEQ    r0,#0xe               ;331
0002b0  13a0000a          MOVNE    r0,#0xa               ;327
0002b4  eaffffd0          B        |L1.508|
                  |L1.696|
0002b8  e5915020          LDR      r5,[r1,#0x20]         ;337
0002bc  e5818020          STR      r8,[r1,#0x20]         ;337
0002c0  e5c1802c          STRB     r8,[r1,#0x2c]         ;338
0002c4  e1a00009          MOV      r0,r9                 ;340
0002c8  e581801c          STR      r8,[r1,#0x1c]         ;340
0002cc  ebfffffe          BL       OS_CPU_SR_Restore
0002d0  e1a00005          MOV      r0,r5                 ;342
0002d4  e5c48000          STRB     r8,[r4,#0]            ;341
0002d8  eaffffc9          B        |L1.516|
;;;344    /*$PAGE*/
                          ENDP

                  OSMboxPendAbort PROC
;;;378    INT8U  OSMboxPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;379    {
0002dc  e92d41f0          PUSH     {r4-r8,lr}
0002e0  e1a08001          MOV      r8,r1
;;;380        INT8U      nbr_tasks;
;;;381    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;382        OS_CPU_SR  cpu_sr = 0;
;;;383    #endif
;;;384    
;;;385    
;;;386    
;;;387    #if OS_ARG_CHK_EN > 0
;;;388        if (perr == (INT8U *)0) {                              /* Validate 'perr'                          */
;;;389            return (0);
;;;390        }
;;;391        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;392            *perr = OS_ERR_PEVENT_NULL;
;;;393            return (0);
;;;394        }
;;;395    #endif
;;;396        if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {       /* Validate event block type                */
0002e4  e5d01000          LDRB     r1,[r0,#0]
0002e8  e1a05000          MOV      r5,r0                 ;379
0002ec  e1a06002          MOV      r6,r2                 ;379
0002f0  e3510001          CMP      r1,#1
0002f4  e3a00001          MOV      r0,#1
0002f8  0a000003          BEQ      |L1.780|
                  |L1.764|
;;;397            *perr = OS_ERR_EVENT_TYPE;
0002fc  e5c60000          STRB     r0,[r6,#0]
;;;398            return (0);
000300  e3a00000          MOV      r0,#0
                  |L1.772|
000304  e8bd41f0          POP      {r4-r8,lr}
;;;399        }
;;;400        OS_ENTER_CRITICAL();
;;;401        if (pevent->OSEventGrp != 0) {                         /* See if any task waiting on mailbox?      */
;;;402            nbr_tasks = 0;
;;;403            switch (opt) {
;;;404                case OS_PEND_OPT_BROADCAST:                    /* Do we need to abort ALL waiting tasks?   */
;;;405                     while (pevent->OSEventGrp != 0) {         /* Yes, ready ALL tasks waiting on mailbox  */
;;;406                         (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MBOX, OS_STAT_PEND_ABORT);
;;;407                         nbr_tasks++;
;;;408                     }
;;;409                     break;
;;;410                 
;;;411                case OS_PEND_OPT_NONE:                         /* No,  ready HPT       waiting on mailbox  */
;;;412                default:    
;;;413                     (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MBOX, OS_STAT_PEND_ABORT);
;;;414                     nbr_tasks++;
;;;415                     break;
;;;416            }
;;;417            OS_EXIT_CRITICAL();
;;;418            OS_Sched();                                        /* Find HPT ready to run                    */
;;;419            *perr = OS_ERR_PEND_ABORT;
;;;420            return (nbr_tasks);
;;;421        }
;;;422        OS_EXIT_CRITICAL();
;;;423        *perr = OS_ERR_NONE;
;;;424        return (0);                                            /* No tasks waiting on mailbox              */
;;;425    }
000308  e12fff1e          BX       lr
                  |L1.780|
00030c  ebfffffe          BL       OS_CPU_SR_Save
000310  e1a07000          MOV      r7,r0                 ;400
000314  e5d5000a          LDRB     r0,[r5,#0xa]          ;401
000318  e3500000          CMP      r0,#0                 ;401
00031c  0a00001a          BEQ      |L1.908|
000320  e3580001          CMP      r8,#1                 ;403
000324  e3a04000          MOV      r4,#0                 ;402
000328  1a00000a          BNE      |L1.856|
                  |L1.812|
00032c  e3a03002          MOV      r3,#2                 ;406
000330  e1a02003          MOV      r2,r3                 ;406
000334  e3a01000          MOV      r1,#0                 ;406
000338  e1a00005          MOV      r0,r5                 ;406
00033c  ebfffffe          BL       OS_EventTaskRdy
000340  e5d5100a          LDRB     r1,[r5,#0xa]          ;405
000344  e2840001          ADD      r0,r4,#1              ;407
000348  e20040ff          AND      r4,r0,#0xff           ;407
00034c  e3510000          CMP      r1,#0                 ;405
000350  1afffff5          BNE      |L1.812|
000354  ea000005          B        |L1.880|
                  |L1.856|
000358  e3a03002          MOV      r3,#2                 ;413
00035c  e1a02003          MOV      r2,r3                 ;413
000360  e3a01000          MOV      r1,#0                 ;413
000364  e1a00005          MOV      r0,r5                 ;413
000368  ebfffffe          BL       OS_EventTaskRdy
00036c  e3a04001          MOV      r4,#1                 ;414
                  |L1.880|
000370  e1a00007          MOV      r0,r7                 ;417
000374  ebfffffe          BL       OS_CPU_SR_Restore
000378  ebfffffe          BL       OS_Sched
00037c  e3a0000e          MOV      r0,#0xe               ;419
000380  e5c60000          STRB     r0,[r6,#0]            ;419
000384  e1a00004          MOV      r0,r4                 ;420
000388  eaffffdd          B        |L1.772|
                  |L1.908|

⌨️ 快捷键说明

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