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

📄 os_mbox.txt

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 TXT
📖 第 1 页 / 共 4 页
字号:
0003c4  e1a00009          MOV      r0,r9
0003c8  ebfffffe          BL       OS_CPU_SR_Restore
0003cc  ebfffffe          BL       OS_Sched
0003d0  ebfffffe          BL       OS_CPU_SR_Save
0003d4  e1a09000          MOV      r9,r0
0003d8  e59f0414          LDR      r0,|L1.2036|
0003dc  e5900000          LDR      r0,[r0,#0]  ; OSTCBCur
0003e0  e5d0002d          LDRB     r0,[r0,#0x2d]
0003e4  e3500000          CMP      r0,#0
0003e8  0a000017          BEQ      |L1.1100|
0003ec  e59f0400          LDR      r0,|L1.2036|
0003f0  e5900000          LDR      r0,[r0,#0]  ; OSTCBCur
0003f4  e5d0802d          LDRB     r8,[r0,#0x2d]
0003f8  e1a00004          MOV      r0,r4
0003fc  ebfffffe          BL       OS_EventTOAbort
000400  e1a00009          MOV      r0,r9
000404  ebfffffe          BL       OS_CPU_SR_Restore
000408  e3580001          CMP      r8,#1
00040c  0a000002          BEQ      |L1.1052|
000410  e3580002          CMP      r8,#2
000414  0a000005          BEQ      |L1.1072|
000418  ea000001          B        |L1.1060|
                  |L1.1052|
00041c  e1a00000          MOV      r0,r0
000420  e1a00000          MOV      r0,r0
                  |L1.1060|
000424  e3a0000a          MOV      r0,#0xa
000428  e5c60000          STRB     r0,[r6,#0]
00042c  ea000003          B        |L1.1088|
                  |L1.1072|
000430  e1a00000          MOV      r0,r0
000434  e3a0000e          MOV      r0,#0xe
000438  e5c60000          STRB     r0,[r6,#0]
00043c  e1a00000          MOV      r0,r0
                  |L1.1088|
000440  e1a00000          MOV      r0,r0
000444  e3a00000          MOV      r0,#0
000448  eaffffa1          B        |L1.724|
                  |L1.1100|
00044c  e59f03a0          LDR      r0,|L1.2036|
000450  e5900000          LDR      r0,[r0,#0]  ; OSTCBCur
000454  e5907020          LDR      r7,[r0,#0x20]
000458  e3a00000          MOV      r0,#0
00045c  e59f1390          LDR      r1,|L1.2036|
000460  e5911000          LDR      r1,[r1,#0]  ; OSTCBCur
000464  e5810020          STR      r0,[r1,#0x20]
000468  e59f1384          LDR      r1,|L1.2036|
00046c  e5911000          LDR      r1,[r1,#0]  ; OSTCBCur
000470  e5c1002c          STRB     r0,[r1,#0x2c]
000474  e59f1378          LDR      r1,|L1.2036|
000478  e5911000          LDR      r1,[r1,#0]  ; OSTCBCur
00047c  e581001c          STR      r0,[r1,#0x1c]
000480  e1a00009          MOV      r0,r9
000484  ebfffffe          BL       OS_CPU_SR_Restore
000488  e3a00000          MOV      r0,#0
00048c  e5c60000          STRB     r0,[r6,#0]
000490  e1a00007          MOV      r0,r7
000494  eaffff8e          B        |L1.724|
                          ENDP

                  OSMboxPendAbort PROC
;;;378    INT8U  OSMboxPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;379    {
000498  e92d41f0          PUSH     {r4-r8,lr}
00049c  e1a04000          MOV      r4,r0
0004a0  e1a05001          MOV      r5,r1
0004a4  e1a06002          MOV      r6,r2
;;;380        INT8U      nbr_tasks;
;;;381    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;382        OS_CPU_SR  cpu_sr = 0;
0004a8  e3a08000          MOV      r8,#0
;;;383    #endif
;;;384    
;;;385    
;;;386    
;;;387    #if OS_ARG_CHK_EN > 0
;;;388        if (err == (INT8U *)0) {                               /* Validate 'err'                           */
0004ac  e3560000          CMP      r6,#0
0004b0  1a000002          BNE      |L1.1216|
;;;389            return (0);
0004b4  e3a00000          MOV      r0,#0
                  |L1.1208|
0004b8  e8bd41f0          POP      {r4-r8,lr}
;;;390        }
;;;391        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;392            *err = OS_ERR_PEVENT_NULL;
;;;393            return (0);
;;;394        }
;;;395    #endif
;;;396        if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {       /* Validate event block type                */
;;;397            *err = OS_ERR_EVENT_TYPE;
;;;398            return (0);
;;;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            *err = OS_ERR_PEND_ABORT;
;;;420            return (nbr_tasks);
;;;421        }
;;;422        OS_EXIT_CRITICAL();
;;;423        *err = OS_ERR_NONE;
;;;424        return (0);                                            /* No tasks waiting on mailbox              */
;;;425    }
0004bc  e12fff1e          BX       lr
                  |L1.1216|
0004c0  e3540000          CMP      r4,#0
0004c4  1a000003          BNE      |L1.1240|
0004c8  e3a00004          MOV      r0,#4
0004cc  e5c60000          STRB     r0,[r6,#0]
0004d0  e3a00000          MOV      r0,#0
0004d4  eafffff7          B        |L1.1208|
                  |L1.1240|
0004d8  e5d40000          LDRB     r0,[r4,#0]
0004dc  e3500001          CMP      r0,#1
0004e0  0a000003          BEQ      |L1.1268|
0004e4  e3a00001          MOV      r0,#1
0004e8  e5c60000          STRB     r0,[r6,#0]
0004ec  e3a00000          MOV      r0,#0
0004f0  eafffff0          B        |L1.1208|
                  |L1.1268|
0004f4  ebfffffe          BL       OS_CPU_SR_Save
0004f8  e1a08000          MOV      r8,r0
0004fc  e5d4000a          LDRB     r0,[r4,#0xa]
000500  e3500000          CMP      r0,#0
000504  0a000023          BEQ      |L1.1432|
000508  e3a07000          MOV      r7,#0
00050c  e3550000          CMP      r5,#0
000510  0a00000e          BEQ      |L1.1360|
000514  e3550001          CMP      r5,#1
000518  1a00000e          BNE      |L1.1368|
00051c  e1a00000          MOV      r0,r0
000520  ea000006          B        |L1.1344|
                  |L1.1316|
000524  e3a03002          MOV      r3,#2
000528  e1a02003          MOV      r2,r3
00052c  e3a01000          MOV      r1,#0
000530  e1a00004          MOV      r0,r4
000534  ebfffffe          BL       OS_EventTaskRdy
000538  e2870001          ADD      r0,r7,#1
00053c  e20070ff          AND      r7,r0,#0xff
                  |L1.1344|
000540  e5d4000a          LDRB     r0,[r4,#0xa]
000544  e3500000          CMP      r0,#0
000548  1afffff5          BNE      |L1.1316|
00054c  ea000009          B        |L1.1400|
                  |L1.1360|
000550  e1a00000          MOV      r0,r0
000554  e1a00000          MOV      r0,r0
                  |L1.1368|
000558  e3a03002          MOV      r3,#2
00055c  e1a02003          MOV      r2,r3
000560  e3a01000          MOV      r1,#0
000564  e1a00004          MOV      r0,r4
000568  ebfffffe          BL       OS_EventTaskRdy
00056c  e2870001          ADD      r0,r7,#1
000570  e20070ff          AND      r7,r0,#0xff
000574  e1a00000          MOV      r0,r0
                  |L1.1400|
000578  e1a00000          MOV      r0,r0
00057c  e1a00008          MOV      r0,r8
000580  ebfffffe          BL       OS_CPU_SR_Restore
000584  ebfffffe          BL       OS_Sched
000588  e3a0000e          MOV      r0,#0xe
00058c  e5c60000          STRB     r0,[r6,#0]
000590  e1a00007          MOV      r0,r7
000594  eaffffc7          B        |L1.1208|
                  |L1.1432|
000598  e1a00008          MOV      r0,r8
00059c  ebfffffe          BL       OS_CPU_SR_Restore
0005a0  e3a00000          MOV      r0,#0
0005a4  e5c60000          STRB     r0,[r6,#0]
0005a8  eaffffc2          B        |L1.1208|
                          ENDP

                  OSMboxPost PROC
;;;452    INT8U  OSMboxPost (OS_EVENT *pevent, void *msg)
;;;453    {
0005ac  e92d4070          PUSH     {r4-r6,lr}
0005b0  e1a04000          MOV      r4,r0
0005b4  e1a05001          MOV      r5,r1
;;;454    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;455        OS_CPU_SR  cpu_sr = 0;
0005b8  e3a06000          MOV      r6,#0
;;;456    #endif
;;;457    
;;;458    
;;;459    
;;;460    #if OS_ARG_CHK_EN > 0
;;;461        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
0005bc  e3540000          CMP      r4,#0
0005c0  1a000002          BNE      |L1.1488|
;;;462            return (OS_ERR_PEVENT_NULL);
0005c4  e3a00004          MOV      r0,#4
                  |L1.1480|
0005c8  e8bd4070          POP      {r4-r6,lr}
;;;463        }
;;;464        if (msg == (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, msg, 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 = msg;                         /* Place message in mailbox                      */
;;;484        OS_EXIT_CRITICAL();
;;;485        return (OS_ERR_NONE);
;;;486    }
0005cc  e12fff1e          BX       lr
                  |L1.1488|
0005d0  e3550000          CMP      r5,#0
0005d4  1a000001          BNE      |L1.1504|
0005d8  e3a00003          MOV      r0,#3
0005dc  eafffff9          B        |L1.1480|
                  |L1.1504|
0005e0  e5d40000          LDRB     r0,[r4,#0]
0005e4  e3500001          CMP      r0,#1
0005e8  0a000001          BEQ      |L1.1524|
0005ec  e3a00001          MOV      r0,#1

⌨️ 快捷键说明

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