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

📄 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 页
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 919] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_mbox.o --depend=.\rvmdk\os_mbox.d --device=DARMP --apcs=interwork -I. -I..\BSP -I..\..\..\..\..\uCOS-II\Ports\ARM\Generic\RealView -I..\..\..\..\..\uCOS-II\Source -I..\..\..\..\..\uCOSView\Source -I..\..\..\..\..\uCOSView\Ports\ARM7\LPC2000\IAR -I..\..\..\..\..\uC-CPU -I..\..\..\..\..\uC-CPU\ARM\RealView -I..\..\..\..\..\uC-LIB -I..\..\..\..\..\uC-Probe\Target\Plugins\uCOS-II -IC:\Keil\ARM\INC\Philips --omf_browse=.\rvmdk\os_mbox.crf ..\..\..\..\..\uCOS-II\Source\os_mbox.c]
                          ARM

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

                  OSMboxAccept PROC
;;;47     void  *OSMboxAccept (OS_EVENT *pevent)
;;;48     {
000000  e92d4070          PUSH     {r4-r6,lr}
000004  e1a04000          MOV      r4,r0
;;;49         void      *pmsg;
;;;50     #if OS_CRITICAL_METHOD == 3                               /* Allocate storage for CPU status register  */
;;;51         OS_CPU_SR  cpu_sr = 0;
;;;52     #endif
;;;53     
;;;54     
;;;55     
;;;56     #if OS_ARG_CHK_EN > 0
;;;57         if (pevent == (OS_EVENT *)0) {                        /* Validate 'pevent'                         */
;;;58             return ((void *)0);
;;;59         }
;;;60     #endif
;;;61         if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {      /* Validate event block type                 */
000008  e5d00000          LDRB     r0,[r0,#0]
00000c  e3500001          CMP      r0,#1
;;;62             return ((void *)0);
000010  13a00000          MOVNE    r0,#0
000014  1a000005          BNE      |L1.48|
;;;63         }
;;;64         OS_ENTER_CRITICAL();
000018  ebfffffe          BL       OS_CPU_SR_Save
;;;65         pmsg               = pevent->OSEventPtr;
;;;66         pevent->OSEventPtr = (void *)0;                       /* Clear the mailbox                         */
00001c  e5945004          LDR      r5,[r4,#4]
000020  e3a01000          MOV      r1,#0
000024  e5841004          STR      r1,[r4,#4]
;;;67         OS_EXIT_CRITICAL();
000028  ebfffffe          BL       OS_CPU_SR_Restore
;;;68         return (pmsg);                                        /* Return the message received (or NULL)     */
00002c  e1a00005          MOV      r0,r5
                  |L1.48|
000030  e8bd4070          POP      {r4-r6,lr}
;;;69     }
000034  e12fff1e          BX       lr
;;;70     #endif
                          ENDP

                  OSMboxCreate PROC
;;;88     OS_EVENT  *OSMboxCreate (void *pmsg)
;;;89     {
000038  e92d4070          PUSH     {r4-r6,lr}
00003c  e1a05000          MOV      r5,r0
;;;90         OS_EVENT  *pevent;
;;;91     #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;92         OS_CPU_SR  cpu_sr = 0;
;;;93     #endif
;;;94     
;;;95     
;;;96     
;;;97         if (OSIntNesting > 0) {                      /* See if called from ISR ...                         */
000040  e59f04fc          LDR      r0,|L1.1348|
000044  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000048  e3500000          CMP      r0,#0
;;;98             return ((OS_EVENT *)0);                  /* ... can't CREATE from an ISR                       */
00004c  13a00000          MOVNE    r0,#0
000050  1a000013          BNE      |L1.164|
;;;99         }
;;;100        OS_ENTER_CRITICAL();
000054  ebfffffe          BL       OS_CPU_SR_Save
;;;101        pevent = OSEventFreeList;                    /* Get next free event control block                  */
000058  e59f14e8          LDR      r1,|L1.1352|
00005c  e5914000          LDR      r4,[r1,#0]  ; OSEventFreeList
;;;102        if (OSEventFreeList != (OS_EVENT *)0) {      /* See if pool of free ECB pool was empty             */
000060  e3540000          CMP      r4,#0
;;;103            OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
000064  15942004          LDRNE    r2,[r4,#4]
000068  15812000          STRNE    r2,[r1,#0]  ; OSEventFreeList
;;;104        }
;;;105        OS_EXIT_CRITICAL();
00006c  ebfffffe          BL       OS_CPU_SR_Restore
;;;106        if (pevent != (OS_EVENT *)0) {
000070  e3540000          CMP      r4,#0
000074  0a000009          BEQ      |L1.160|
;;;107            pevent->OSEventType    = OS_EVENT_TYPE_MBOX;
000078  e3a00001          MOV      r0,#1
00007c  e5c40000          STRB     r0,[r4,#0]
;;;108            pevent->OSEventCnt     = 0;
000080  e3a00000          MOV      r0,#0
000084  e1c400b8          STRH     r0,[r4,#8]
;;;109            pevent->OSEventPtr     = pmsg;           /* Deposit message in event control block             */
;;;110    #if OS_EVENT_NAME_SIZE > 1
;;;111            pevent->OSEventName[0] = '?';
000088  e3a0103f          MOV      r1,#0x3f
00008c  e5845004          STR      r5,[r4,#4]
000090  e5c4100f          STRB     r1,[r4,#0xf]
;;;112            pevent->OSEventName[1] = OS_ASCII_NUL;
000094  e5c40010          STRB     r0,[r4,#0x10]
;;;113    #endif
;;;114            OS_EventWaitListInit(pevent);
000098  e1a00004          MOV      r0,r4
00009c  ebfffffe          BL       OS_EventWaitListInit
                  |L1.160|
;;;115        }
;;;116        return (pevent);                             /* Return pointer to event control block              */
0000a0  e1a00004          MOV      r0,r4
                  |L1.164|
0000a4  e8bd4070          POP      {r4-r6,lr}
;;;117    }
0000a8  e12fff1e          BX       lr
;;;118    /*$PAGE*/
                          ENDP

                  OSMboxDel PROC
;;;156    OS_EVENT  *OSMboxDel (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;157    {
0000ac  e92d5ff0          PUSH     {r4-r12,lr}
0000b0  e1a04000          MOV      r4,r0
;;;158        BOOLEAN    tasks_waiting;
;;;159        OS_EVENT  *pevent_return;
;;;160    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;161        OS_CPU_SR  cpu_sr = 0;
;;;162    #endif
;;;163    
;;;164    
;;;165    
;;;166    #if OS_ARG_CHK_EN > 0
;;;167        if (perr == (INT8U *)0) {                              /* Validate 'perr'                          */
;;;168            return (pevent);
;;;169        }
;;;170        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;171            *perr = OS_ERR_PEVENT_NULL;
;;;172            return (pevent);
;;;173        }
;;;174    #endif
;;;175        if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {       /* Validate event block type                */
0000b4  e5d00000          LDRB     r0,[r0,#0]
0000b8  e1a0b001          MOV      r11,r1                ;157
0000bc  e1a05002          MOV      r5,r2                 ;157
0000c0  e3500001          CMP      r0,#1
;;;176            *perr = OS_ERR_EVENT_TYPE;
0000c4  13a00001          MOVNE    r0,#1
;;;177            return (pevent);
0000c8  1a000020          BNE      |L1.336|
;;;178        }
;;;179        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
0000cc  e59f0470          LDR      r0,|L1.1348|
0000d0  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0000d4  e3500000          CMP      r0,#0
;;;180            *perr = OS_ERR_DEL_ISR;                            /* ... can't DELETE from an ISR             */
0000d8  13a0000f          MOVNE    r0,#0xf
;;;181            return (pevent);
0000dc  1a00001b          BNE      |L1.336|
;;;182        }
;;;183        OS_ENTER_CRITICAL();
0000e0  ebfffffe          BL       OS_CPU_SR_Save
0000e4  e1a07000          MOV      r7,r0
;;;184        if (pevent->OSEventGrp != 0) {                         /* See if any tasks waiting on mailbox      */
0000e8  e5d4000a          LDRB     r0,[r4,#0xa]
;;;185            tasks_waiting = OS_TRUE;                           /* Yes                                      */
;;;186        } else {
;;;187            tasks_waiting = OS_FALSE;                          /* No                                       */
0000ec  e59f9454          LDR      r9,|L1.1352|
0000f0  e3a0803f          MOV      r8,#0x3f
0000f4  e2906000          ADDS     r6,r0,#0              ;184
0000f8  13a06001          MOVNE    r6,#1                 ;185
;;;188        }
;;;189        switch (opt) {
0000fc  e35b0000          CMP      r11,#0
000100  e3a0a000          MOV      r10,#0                ;187
000104  0a000002          BEQ      |L1.276|
000108  e35b0001          CMP      r11,#1
00010c  1a000029          BNE      |L1.440|
000110  ea000017          B        |L1.372|
                  |L1.276|
;;;190            case OS_DEL_NO_PEND:                               /* Delete mailbox only if no task waiting   */
;;;191                 if (tasks_waiting == OS_FALSE) {
000114  e3560000          CMP      r6,#0
000118  1a000009          BNE      |L1.324|
;;;192    #if OS_EVENT_NAME_SIZE > 1
;;;193                     pevent->OSEventName[0] = '?';             /* Unknown name                             */
00011c  e5c4800f          STRB     r8,[r4,#0xf]
;;;194                     pevent->OSEventName[1] = OS_ASCII_NUL;
000120  e5c4a010          STRB     r10,[r4,#0x10]
;;;195    #endif
;;;196                     pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
000124  e5c4a000          STRB     r10,[r4,#0]
;;;197                     pevent->OSEventPtr  = OSEventFreeList;    /* Return Event Control Block to free list  */
000128  e5990000          LDR      r0,[r9,#0]  ; OSEventFreeList
00012c  e5840004          STR      r0,[r4,#4]
;;;198                     pevent->OSEventCnt  = 0;
000130  e1c4a0b8          STRH     r10,[r4,#8]
;;;199                     OSEventFreeList     = pevent;             /* Get next free event control block        */
;;;200                     OS_EXIT_CRITICAL();
000134  e1a00007          MOV      r0,r7
000138  e5894000          STR      r4,[r9,#0]  ; OSEventFreeList
00013c  ebfffffe          BL       OS_CPU_SR_Restore
;;;201                     *perr               = OS_ERR_NONE;
;;;202                     pevent_return       = (OS_EVENT *)0;      /* Mailbox has been deleted                 */
000140  ea000019          B        |L1.428|
                  |L1.324|
;;;203                 } else {
;;;204                     OS_EXIT_CRITICAL();
000144  e1a00007          MOV      r0,r7
000148  ebfffffe          BL       OS_CPU_SR_Restore
;;;205                     *perr               = OS_ERR_TASK_WAITING;
00014c  e3a00049          MOV      r0,#0x49
                  |L1.336|
;;;206                     pevent_return       = pevent;
;;;207                 }
;;;208                 break;
;;;209    
;;;210            case OS_DEL_ALWAYS:                                /* Always delete the mailbox                */
;;;211                 while (pevent->OSEventGrp != 0) {             /* Ready ALL tasks waiting for mailbox      */
;;;212                     (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MBOX, OS_STAT_PEND_OK);
;;;213                 }
;;;214    #if OS_EVENT_NAME_SIZE > 1
;;;215                 pevent->OSEventName[0] = '?';                 /* Unknown name                             */
;;;216                 pevent->OSEventName[1] = OS_ASCII_NUL;
;;;217    #endif
;;;218                 pevent->OSEventType    = OS_EVENT_TYPE_UNUSED;
;;;219                 pevent->OSEventPtr     = OSEventFreeList;     /* Return Event Control Block to free list  */
;;;220                 pevent->OSEventCnt     = 0;
;;;221                 OSEventFreeList        = pevent;              /* Get next free event control block        */
;;;222                 OS_EXIT_CRITICAL();
;;;223                 if (tasks_waiting == OS_TRUE) {               /* Reschedule only if task(s) were waiting  */
;;;224                     OS_Sched();                               /* Find highest priority task ready to run  */
;;;225                 }
;;;226                 *perr         = OS_ERR_NONE;
;;;227                 pevent_return = (OS_EVENT *)0;                /* Mailbox has been deleted                 */
;;;228                 break;
;;;229    
;;;230            default:
;;;231                 OS_EXIT_CRITICAL();
;;;232                 *perr         = OS_ERR_INVALID_OPT;
000150  e5c50000          STRB     r0,[r5,#0]
;;;233                 pevent_return = pevent;
000154  e1a00004          MOV      r0,r4
                  |L1.344|
000158  e8bd5ff0          POP      {r4-r12,lr}
;;;234                 break;
;;;235        }
;;;236        return (pevent_return);
;;;237    }
00015c  e12fff1e          BX       lr
                  |L1.352|
000160  e3a03000          MOV      r3,#0                 ;212
000164  e3a02002          MOV      r2,#2                 ;212
000168  e1a01003          MOV      r1,r3                 ;212
00016c  e1a00004          MOV      r0,r4                 ;212
000170  ebfffffe          BL       OS_EventTaskRdy
                  |L1.372|
000174  e5d4000a          LDRB     r0,[r4,#0xa]          ;211
000178  e3500000          CMP      r0,#0                 ;211
00017c  1afffff7          BNE      |L1.352|
000180  e5c4800f          STRB     r8,[r4,#0xf]          ;215
000184  e5c4a010          STRB     r10,[r4,#0x10]        ;216
000188  e5c4a000          STRB     r10,[r4,#0]           ;218
00018c  e5990000          LDR      r0,[r9,#0]            ;219  ; OSEventFreeList
000190  e5840004          STR      r0,[r4,#4]            ;219
000194  e1c4a0b8          STRH     r10,[r4,#8]           ;220
000198  e1a00007          MOV      r0,r7                 ;222
00019c  e5894000          STR      r4,[r9,#0]            ;222  ; OSEventFreeList

⌨️ 快捷键说明

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