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

📄 os_mbox.txt

📁 在KEIL下成功使用UCOS-II嵌入式操作系统
💻 TXT
📖 第 1 页 / 共 3 页
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 947] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\os_mbox.o --device=DARMP -O0 -IC:\Keil\ARM\INC\Philips ..\Source\OS_MBOX.C]

                          ARM

                          AREA ||.text.7||, CODE, READONLY, ALIGN=2

                  OSMboxAccept PROC
;;;38     void  *OSMboxAccept (OS_EVENT *pevent)
;;;39     {
000000  e92d4070          PUSH     {r4-r6,lr}
000004  e1a04000          MOV      r4,r0
;;;40     #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;41         OS_CPU_SR  cpu_sr;
;;;42     #endif    
;;;43         void      *msg;
;;;44     
;;;45     
;;;46     #if OS_ARG_CHK_EN > 0
;;;47         if (pevent == (OS_EVENT *)0) {                        /* Validate 'pevent'                         */
000008  e3540000          CMP      r4,#0
00000c  1a000001          BNE      |L1.24|
;;;48             return ((void *)0);
000010  e3a00000          MOV      r0,#0
;;;49         }
;;;50         if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {      /* Validate event block type                 */
;;;51             return ((void *)0);
;;;52         }
;;;53     #endif
;;;54         OS_ENTER_CRITICAL();
;;;55         msg                = pevent->OSEventPtr;
;;;56         pevent->OSEventPtr = (void *)0;                       /* Clear the mailbox                         */
;;;57         OS_EXIT_CRITICAL();
;;;58         return (msg);                                         /* Return the message received (or NULL)     */
;;;59     }
                  |L1.20|
000014  e8bd8070          POP      {r4-r6,pc}
                  |L1.24|
000018  e5d40000          LDRB     r0,[r4,#0]            ;50
00001c  e3500001          CMP      r0,#1                 ;50
000020  0a000001          BEQ      |L1.44|               ;50
000024  e3a00000          MOV      r0,#0                 ;51
000028  eafffff9          B        |L1.20|               ;51
                  |L1.44|
00002c  ef000002          SVC      0x2  ; formerly SWI   ;54
000030  e5945004          LDR      r5,[r4,#4]            ;55
000034  e3a00000          MOV      r0,#0                 ;56
000038  e5840004          STR      r0,[r4,#4]            ;56
00003c  ef000003          SVC      0x3  ; formerly SWI   ;57
000040  e1a00005          MOV      r0,r5                 ;58
000044  eafffff2          B        |L1.20|               ;58
                          ENDP

                  OSMboxCreate PROC
;;;78     OS_EVENT  *OSMboxCreate (void *msg)
;;;79     {
000048  e92d4070          PUSH     {r4-r6,lr}
00004c  e1a04000          MOV      r4,r0
;;;80     #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;81         OS_CPU_SR  cpu_sr;
;;;82     #endif    
;;;83         OS_EVENT  *pevent;
;;;84     
;;;85     
;;;86         if (OSIntNesting > 0) {                      /* See if called from ISR ...                         */
000050  e59f04b8          LDR      r0,|L1.1296|
000054  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000058  e3500000          CMP      r0,#0
00005c  da000001          BLE      |L1.104|
;;;87             return ((OS_EVENT *)0);                  /* ... can't CREATE from an ISR                       */
000060  e3a00000          MOV      r0,#0
;;;88         }
;;;89         OS_ENTER_CRITICAL();
;;;90         pevent = OSEventFreeList;                    /* Get next free event control block                  */
;;;91         if (OSEventFreeList != (OS_EVENT *)0) {      /* See if pool of free ECB pool was empty             */
;;;92             OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
;;;93         }
;;;94         OS_EXIT_CRITICAL();
;;;95         if (pevent != (OS_EVENT *)0) {
;;;96             pevent->OSEventType = OS_EVENT_TYPE_MBOX;
;;;97             pevent->OSEventPtr  = msg;               /* Deposit message in event control block             */
;;;98             OS_EventWaitListInit(pevent);
;;;99         }
;;;100        return (pevent);                             /* Return pointer to event control block              */
;;;101    }
                  |L1.100|
000064  e8bd8070          POP      {r4-r6,pc}
                  |L1.104|
000068  ef000002          SVC      0x2  ; formerly SWI   ;89
00006c  e59f04a0          LDR      r0,|L1.1300|          ;90
000070  e5905000          LDR      r5,[r0,#0]            ;90  ; OSEventFreeList
000074  e5900000          LDR      r0,[r0,#0]            ;91  ; OSEventFreeList
000078  e3500000          CMP      r0,#0                 ;91
00007c  0a000004          BEQ      |L1.148|              ;91
000080  e59f048c          LDR      r0,|L1.1300|          ;92
000084  e5900000          LDR      r0,[r0,#0]            ;92  ; OSEventFreeList
000088  e5900004          LDR      r0,[r0,#4]            ;92
00008c  e59f1480          LDR      r1,|L1.1300|          ;92
000090  e5810000          STR      r0,[r1,#0]            ;92  ; OSEventFreeList
                  |L1.148|
000094  ef000003          SVC      0x3  ; formerly SWI   ;94
000098  e3550000          CMP      r5,#0                 ;95
00009c  0a000004          BEQ      |L1.180|              ;95
0000a0  e3a00001          MOV      r0,#1                 ;96
0000a4  e5c50000          STRB     r0,[r5,#0]            ;96
0000a8  e5854004          STR      r4,[r5,#4]            ;97
0000ac  e1a00005          MOV      r0,r5                 ;98
0000b0  ebfffffe          BL       OS_EventWaitListInit  ;98
                  |L1.180|
0000b4  e1a00005          MOV      r0,r5                 ;100
0000b8  eaffffe9          B        |L1.100|              ;100
                          ENDP

                  OSMboxDel PROC
;;;141    OS_EVENT  *OSMboxDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;142    {
0000bc  e92d41f0          PUSH     {r4-r8,lr}
0000c0  e1a04000          MOV      r4,r0
0000c4  e1a05001          MOV      r5,r1
0000c8  e1a06002          MOV      r6,r2
;;;143    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;144        OS_CPU_SR  cpu_sr;
;;;145    #endif    
;;;146        BOOLEAN    tasks_waiting;
;;;147    
;;;148    
;;;149        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
0000cc  e59f043c          LDR      r0,|L1.1296|
0000d0  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0000d4  e3500000          CMP      r0,#0
0000d8  da000003          BLE      |L1.236|
;;;150            *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
0000dc  e3a0008c          MOV      r0,#0x8c
0000e0  e5c60000          STRB     r0,[r6,#0]
;;;151            return (pevent);
0000e4  e1a00004          MOV      r0,r4
;;;152        }
;;;153    #if OS_ARG_CHK_EN > 0
;;;154        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;155            *err = OS_ERR_PEVENT_NULL;
;;;156            return (pevent);
;;;157        }
;;;158        if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {       /* Validate event block type                */
;;;159            *err = OS_ERR_EVENT_TYPE;
;;;160            return (pevent);
;;;161        }
;;;162    #endif
;;;163        OS_ENTER_CRITICAL();
;;;164        if (pevent->OSEventGrp != 0x00) {                      /* See if any tasks waiting on mailbox      */
;;;165            tasks_waiting = TRUE;                              /* Yes                                      */
;;;166        } else {
;;;167            tasks_waiting = FALSE;                             /* No                                       */
;;;168        }
;;;169        switch (opt) {
;;;170            case OS_DEL_NO_PEND:                               /* Delete mailbox only if no task waiting   */
;;;171                 if (tasks_waiting == FALSE) {
;;;172                     pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;173                     pevent->OSEventPtr  = OSEventFreeList;    /* Return Event Control Block to free list  */
;;;174                     OSEventFreeList     = pevent;             /* Get next free event control block        */
;;;175                     OS_EXIT_CRITICAL();
;;;176                     *err = OS_NO_ERR;
;;;177                     return ((OS_EVENT *)0);                   /* Mailbox has been deleted                 */
;;;178                 } else {
;;;179                     OS_EXIT_CRITICAL();
;;;180                     *err = OS_ERR_TASK_WAITING;
;;;181                     return (pevent);
;;;182                 }
;;;183    
;;;184            case OS_DEL_ALWAYS:                                /* Always delete the mailbox                */
;;;185                 while (pevent->OSEventGrp != 0x00) {          /* Ready ALL tasks waiting for mailbox      */
;;;186                     OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MBOX);
;;;187                 }
;;;188                 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;189                 pevent->OSEventPtr  = OSEventFreeList;        /* Return Event Control Block to free list  */
;;;190                 OSEventFreeList     = pevent;                 /* Get next free event control block        */
;;;191                 OS_EXIT_CRITICAL();
;;;192                 if (tasks_waiting == TRUE) {                  /* Reschedule only if task(s) were waiting  */
;;;193                     OS_Sched();                               /* Find highest priority task ready to run  */
;;;194                 }
;;;195                 *err = OS_NO_ERR;
;;;196                 return ((OS_EVENT *)0);                       /* Mailbox has been deleted                 */
;;;197    
;;;198            default:
;;;199                 OS_EXIT_CRITICAL();
;;;200                 *err = OS_ERR_INVALID_OPT;
;;;201                 return (pevent);
;;;202        }
;;;203    }
                  |L1.232|
0000e8  e8bd81f0          POP      {r4-r8,pc}
                  |L1.236|
0000ec  e3540000          CMP      r4,#0                 ;154
0000f0  1a000003          BNE      |L1.260|              ;154
0000f4  e3a00004          MOV      r0,#4                 ;155
0000f8  e5c60000          STRB     r0,[r6,#0]            ;155
0000fc  e1a00004          MOV      r0,r4                 ;156
000100  eafffff8          B        |L1.232|              ;156
                  |L1.260|
000104  e5d40000          LDRB     r0,[r4,#0]            ;158
000108  e3500001          CMP      r0,#1                 ;158
00010c  0a000003          BEQ      |L1.288|              ;158
000110  e3a00001          MOV      r0,#1                 ;159
000114  e5c60000          STRB     r0,[r6,#0]            ;159
000118  e1a00004          MOV      r0,r4                 ;160
00011c  eafffff1          B        |L1.232|              ;160
                  |L1.288|
000120  ef000002          SVC      0x2  ; formerly SWI   ;163
000124  e5d40001          LDRB     r0,[r4,#1]            ;164
000128  e3500000          CMP      r0,#0                 ;164
00012c  0a000001          BEQ      |L1.312|              ;164
000130  e3a07001          MOV      r7,#1                 ;165
000134  ea000000          B        |L1.316|              ;165
                  |L1.312|
000138  e3a07000          MOV      r7,#0                 ;167
                  |L1.316|
00013c  e3550000          CMP      r5,#0                 ;169
000140  0a000002          BEQ      |L1.336|              ;169
000144  e3550001          CMP      r5,#1                 ;169
000148  1a00002a          BNE      |L1.504|              ;169
00014c  ea000012          B        |L1.412|              ;169
                  |L1.336|
000150  e1a00000          MOV      r0,r0                 ;170
000154  e3570000          CMP      r7,#0                 ;171
000158  1a00000a          BNE      |L1.392|              ;171
00015c  e3a00000          MOV      r0,#0                 ;172
000160  e5c40000          STRB     r0,[r4,#0]            ;172
000164  e59f03a8          LDR      r0,|L1.1300|          ;173
000168  e5900000          LDR      r0,[r0,#0]            ;173  ; OSEventFreeList
00016c  e5840004          STR      r0,[r4,#4]            ;173
000170  e59f039c          LDR      r0,|L1.1300|          ;174
000174  e5804000          STR      r4,[r0,#0]            ;174  ; OSEventFreeList

⌨️ 快捷键说明

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