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

📄 os_mbox.txt

📁 在KEIL下成功使用UCOS-II嵌入式操作系统
💻 TXT
📖 第 1 页 / 共 3 页
字号:
000178  ef000003          SVC      0x3  ; formerly SWI   ;175
00017c  e3a00000          MOV      r0,#0                 ;176
000180  e5c60000          STRB     r0,[r6,#0]            ;176
000184  eaffffd7          B        |L1.232|              ;177
                  |L1.392|
000188  ef000003          SVC      0x3  ; formerly SWI   ;179
00018c  e3a00008          MOV      r0,#8                 ;180
000190  e5c60000          STRB     r0,[r6,#0]            ;180
000194  e1a00004          MOV      r0,r4                 ;181
000198  eaffffd2          B        |L1.232|              ;181
                  |L1.412|
00019c  e1a00000          MOV      r0,r0                 ;184
0001a0  ea000003          B        |L1.436|              ;185
                  |L1.420|
0001a4  e3a02002          MOV      r2,#2                 ;186
0001a8  e3a01000          MOV      r1,#0                 ;186
0001ac  e1a00004          MOV      r0,r4                 ;186
0001b0  ebfffffe          BL       OS_EventTaskRdy       ;186
                  |L1.436|
0001b4  e5d40001          LDRB     r0,[r4,#1]            ;185
0001b8  e3500000          CMP      r0,#0                 ;185
0001bc  1afffff8          BNE      |L1.420|              ;185
0001c0  e3a00000          MOV      r0,#0                 ;188
0001c4  e5c40000          STRB     r0,[r4,#0]            ;188
0001c8  e59f0344          LDR      r0,|L1.1300|          ;189
0001cc  e5900000          LDR      r0,[r0,#0]            ;189  ; OSEventFreeList
0001d0  e5840004          STR      r0,[r4,#4]            ;189
0001d4  e59f0338          LDR      r0,|L1.1300|          ;190
0001d8  e5804000          STR      r4,[r0,#0]            ;190  ; OSEventFreeList
0001dc  ef000003          SVC      0x3  ; formerly SWI   ;191
0001e0  e3570001          CMP      r7,#1                 ;192
0001e4  1a000000          BNE      |L1.492|              ;192
0001e8  ebfffffe          BL       OS_Sched              ;193
                  |L1.492|
0001ec  e3a00000          MOV      r0,#0                 ;195
0001f0  e5c60000          STRB     r0,[r6,#0]            ;195
0001f4  eaffffbb          B        |L1.232|              ;196
                  |L1.504|
0001f8  e1a00000          MOV      r0,r0                 ;198
0001fc  ef000003          SVC      0x3  ; formerly SWI   ;199
000200  e3a00007          MOV      r0,#7                 ;200
000204  e5c60000          STRB     r0,[r6,#0]            ;200
000208  e1a00004          MOV      r0,r4                 ;201
00020c  eaffffb5          B        |L1.232|              ;201
                          ENDP

                  OSMboxPend PROC
;;;238    void  *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
;;;239    {
000210  e92d41f0          PUSH     {r4-r8,lr}
000214  e1a04000          MOV      r4,r0
000218  e1a05001          MOV      r5,r1
00021c  e1a07002          MOV      r7,r2
;;;240    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;241        OS_CPU_SR  cpu_sr;
;;;242    #endif    
;;;243        void      *msg;
;;;244    
;;;245    
;;;246        if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */
000220  e59f02e8          LDR      r0,|L1.1296|
000224  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000228  e3500000          CMP      r0,#0
00022c  da000003          BLE      |L1.576|
;;;247            *err = OS_ERR_PEND_ISR;                       /* ... can't PEND from an ISR                    */
000230  e3a00002          MOV      r0,#2
000234  e5c70000          STRB     r0,[r7,#0]
;;;248            return ((void *)0);
000238  e3a00000          MOV      r0,#0
;;;249        }
;;;250    #if OS_ARG_CHK_EN > 0
;;;251        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
;;;252            *err = OS_ERR_PEVENT_NULL;
;;;253            return ((void *)0);
;;;254        }
;;;255        if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {  /* Validate event block type                     */
;;;256            *err = OS_ERR_EVENT_TYPE;
;;;257            return ((void *)0);
;;;258        }
;;;259    #endif
;;;260        OS_ENTER_CRITICAL();
;;;261        msg = pevent->OSEventPtr;
;;;262        if (msg != (void *)0) {                           /* See if there is already a message             */
;;;263            pevent->OSEventPtr = (void *)0;               /* Clear the mailbox                             */
;;;264            OS_EXIT_CRITICAL();
;;;265            *err = OS_NO_ERR;
;;;266            return (msg);                                 /* Return the message received (or NULL)         */
;;;267        }
;;;268        OSTCBCur->OSTCBStat |= OS_STAT_MBOX;              /* Message not available, task will pend         */
;;;269        OSTCBCur->OSTCBDly   = timeout;                   /* Load timeout in TCB                           */
;;;270        OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
;;;271        OS_EXIT_CRITICAL();
;;;272        OS_Sched();                                       /* Find next highest priority task ready to run  */
;;;273        OS_ENTER_CRITICAL();
;;;274        msg = OSTCBCur->OSTCBMsg;
;;;275        if (msg != (void *)0) {                           /* See if we were given the message              */
;;;276            OSTCBCur->OSTCBMsg      = (void *)0;          /* Yes, clear message received                   */
;;;277            OSTCBCur->OSTCBStat     = OS_STAT_RDY;
;;;278            OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;      /* No longer waiting for event                   */
;;;279            OS_EXIT_CRITICAL();
;;;280            *err                    = OS_NO_ERR;
;;;281            return (msg);                                 /* Return the message received                   */
;;;282        }
;;;283        OS_EventTO(pevent);                               /* Timed out, Make task ready                    */
;;;284        OS_EXIT_CRITICAL();
;;;285        *err = OS_TIMEOUT;                                /* Indicate that a timeout occured               */
;;;286        return ((void *)0);                               /* Return a NULL message                         */
;;;287    }
                  |L1.572|
00023c  e8bd81f0          POP      {r4-r8,pc}
                  |L1.576|
000240  e3540000          CMP      r4,#0                 ;251
000244  1a000003          BNE      |L1.600|              ;251
000248  e3a00004          MOV      r0,#4                 ;252
00024c  e5c70000          STRB     r0,[r7,#0]            ;252
000250  e3a00000          MOV      r0,#0                 ;253
000254  eafffff8          B        |L1.572|              ;253
                  |L1.600|
000258  e5d40000          LDRB     r0,[r4,#0]            ;255
00025c  e3500001          CMP      r0,#1                 ;255
000260  0a000003          BEQ      |L1.628|              ;255
000264  e3a00001          MOV      r0,#1                 ;256
000268  e5c70000          STRB     r0,[r7,#0]            ;256
00026c  e3a00000          MOV      r0,#0                 ;257
000270  eafffff1          B        |L1.572|              ;257
                  |L1.628|
000274  ef000002          SVC      0x2  ; formerly SWI   ;260
000278  e5946004          LDR      r6,[r4,#4]            ;261
00027c  e3560000          CMP      r6,#0                 ;262
000280  0a000006          BEQ      |L1.672|              ;262
000284  e3a00000          MOV      r0,#0                 ;263
000288  e5840004          STR      r0,[r4,#4]            ;263
00028c  ef000003          SVC      0x3  ; formerly SWI   ;264
000290  e3a00000          MOV      r0,#0                 ;265
000294  e5c70000          STRB     r0,[r7,#0]            ;265
000298  e1a00006          MOV      r0,r6                 ;266
00029c  eaffffe6          B        |L1.572|              ;266
                  |L1.672|
0002a0  e59f0270          LDR      r0,|L1.1304|          ;268
0002a4  e5900000          LDR      r0,[r0,#0]            ;268  ; OSTCBCur
0002a8  e5d0001c          LDRB     r0,[r0,#0x1c]         ;268
0002ac  e3800002          ORR      r0,r0,#2              ;268
0002b0  e59f1260          LDR      r1,|L1.1304|          ;268
0002b4  e5911000          LDR      r1,[r1,#0]            ;268  ; OSTCBCur
0002b8  e5c1001c          STRB     r0,[r1,#0x1c]         ;268
0002bc  e59f0254          LDR      r0,|L1.1304|          ;269
0002c0  e5900000          LDR      r0,[r0,#0]            ;269  ; OSTCBCur
0002c4  e1c051ba          STRH     r5,[r0,#0x1a]         ;269
0002c8  e1a00004          MOV      r0,r4                 ;270
0002cc  ebfffffe          BL       OS_EventTaskWait      ;270
0002d0  ef000003          SVC      0x3  ; formerly SWI   ;271
0002d4  ebfffffe          BL       OS_Sched              ;272
0002d8  ef000002          SVC      0x2  ; formerly SWI   ;273
0002dc  e59f0234          LDR      r0,|L1.1304|          ;274
0002e0  e5900000          LDR      r0,[r0,#0]            ;274  ; OSTCBCur
0002e4  e5906010          LDR      r6,[r0,#0x10]         ;274
0002e8  e3560000          CMP      r6,#0                 ;275
0002ec  0a00000e          BEQ      |L1.812|              ;275
0002f0  e3a00000          MOV      r0,#0                 ;276
0002f4  e59f121c          LDR      r1,|L1.1304|          ;276
0002f8  e5911000          LDR      r1,[r1,#0]            ;276  ; OSTCBCur
0002fc  e5810010          STR      r0,[r1,#0x10]         ;276
000300  e59f1210          LDR      r1,|L1.1304|          ;277
000304  e5911000          LDR      r1,[r1,#0]            ;277  ; OSTCBCur
000308  e5c1001c          STRB     r0,[r1,#0x1c]         ;277
00030c  e59f1204          LDR      r1,|L1.1304|          ;278
000310  e5911000          LDR      r1,[r1,#0]            ;278  ; OSTCBCur
000314  e581000c          STR      r0,[r1,#0xc]          ;278
000318  ef000003          SVC      0x3  ; formerly SWI   ;279
00031c  e3a00000          MOV      r0,#0                 ;280
000320  e5c70000          STRB     r0,[r7,#0]            ;280
000324  e1a00006          MOV      r0,r6                 ;281
000328  eaffffc3          B        |L1.572|              ;281
                  |L1.812|
00032c  e1a00004          MOV      r0,r4                 ;283
000330  ebfffffe          BL       OS_EventTO            ;283
000334  ef000003          SVC      0x3  ; formerly SWI   ;284
000338  e3a0000a          MOV      r0,#0xa               ;285
00033c  e5c70000          STRB     r0,[r7,#0]            ;285
000340  e3a00000          MOV      r0,#0                 ;286
000344  eaffffbc          B        |L1.572|              ;286
                          ENDP

                  OSMboxPost PROC
;;;310    INT8U  OSMboxPost (OS_EVENT *pevent, void *msg)
;;;311    {
000348  e92d4070          PUSH     {r4-r6,lr}
00034c  e1a05000          MOV      r5,r0
000350  e1a04001          MOV      r4,r1
;;;312    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;313        OS_CPU_SR  cpu_sr;
;;;314    #endif    
;;;315        
;;;316        
;;;317    #if OS_ARG_CHK_EN > 0
;;;318        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
000354  e3550000          CMP      r5,#0
000358  1a000001          BNE      |L1.868|
;;;319            return (OS_ERR_PEVENT_NULL);
00035c  e3a00004          MOV      r0,#4
;;;320        }
;;;321        if (msg == (void *)0) {                           /* Make sure we are not posting a NULL pointer   */
;;;322            return (OS_ERR_POST_NULL_PTR);
;;;323        }
;;;324        if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {  /* Validate event block type                     */
;;;325            return (OS_ERR_EVENT_TYPE);
;;;326        }
;;;327    #endif
;;;328        OS_ENTER_CRITICAL();
;;;329        if (pevent->OSEventGrp != 0x00) {                 /* See if any task pending on mailbox            */
;;;330            OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX);   /* Ready highest priority task waiting on event  */
;;;331            OS_EXIT_CRITICAL();
;;;332            OS_Sched();                                   /* Find highest priority task ready to run       */
;;;333            return (OS_NO_ERR);
;;;334        }
;;;335        if (pevent->OSEventPtr != (void *)0) {            /* Make sure mailbox doesn't already have a msg  */
;;;336            OS_EXIT_CRITICAL();
;;;337            return (OS_MBOX_FULL);
;;;338        }
;;;339        pevent->OSEventPtr = msg;                         /* Place message in mailbox                      */
;;;340        OS_EXIT_CRITICAL();
;;;341        return (OS_NO_ERR);
;;;342    }
                  |L1.864|
000360  e8bd8070          POP      {r4-r6,pc}
                  |L1.868|
000364  e3540000          CMP      r4,#0                 ;321
000368  1a000001          BNE      |L1.884|              ;321
00036c  e3a00003          MOV      r0,#3                 ;322
000370  eafffffa          B        |L1.864|              ;322
                  |L1.884|

⌨️ 快捷键说明

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