os_mbox.txt

来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 681 行 · 第 1/3 页

TXT
681
字号
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 934] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_mbox.o --depend=.\rvmdk\os_mbox.d --device=DARMP --apcs=interwork -O1 -I. -I..\BSP -I..\..\..\..\uCOS-II\Ports\ARM\Generic\RealView -I..\..\..\..\uCOS-II\Source -I..\..\..\..\uC-CPU -I..\..\..\..\uC-CPU\ARM\RealView -I..\..\..\..\uC-LIB -I..\..\..\..\uC-TCPIP\IF -I..\..\..\..\uC-TCPIP\IF\Ether -I..\..\..\..\uC-TCPIP\NIC\ETHER\LPC2378 -I..\..\..\..\uC-TCPIP\NIC\ETHER\PHY -I..\..\..\..\uC-TCPIP\NIC\ETHER\PHY\DP83848 -I..\..\..\..\uC-TCPIP\OS\uCOS-II -I..\..\..\..\uC-TCPIP\Source -I..\..\..\..\uC-LCD\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\RS-232\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\TCPIP\Source -I..\..\..\..\uC-Probe\Target\Plugins\uCOS-II -Ie:\Keil_ARM\ARM\INC\Philips -D__IN_CHIP --omf_browse=.\rvmdk\os_mbox.crf ..\Source\OS_MBOX.C]
                          ARM

                          AREA ||.text||, 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  1a000002          BNE      |L1.28|
;;;48             return ((void *)0);
000010  e3a00000          MOV      r0,#0
                  |L1.20|
000014  e8bd4070          POP      {r4-r6,lr}
;;;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     }
000018  e12fff1e          BX       lr
                  |L1.28|
00001c  e5d40000          LDRB     r0,[r4,#0]            ;50
000020  e3500001          CMP      r0,#1                 ;50
000024  0a000001          BEQ      |L1.48|
000028  e3a00000          MOV      r0,#0                 ;51
00002c  eafffff8          B        |L1.20|
                  |L1.48|
000030  ef000002          SVC      #0x2                  ;54
000034  e5945004          LDR      r5,[r4,#4]            ;55
000038  e3a00000          MOV      r0,#0                 ;56
00003c  e5840004          STR      r0,[r4,#4]            ;56
000040  ef000003          SVC      #0x3                  ;57
000044  e1a00005          MOV      r0,r5                 ;58
000048  eafffff1          B        |L1.20|
;;;60     #endif
                          ENDP

                  OSMboxCreate PROC
;;;78     OS_EVENT  *OSMboxCreate (void *msg)
;;;79     {
00004c  e92d4070          PUSH     {r4-r6,lr}
000050  e1a05000          MOV      r5,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 ...                         */
000054  e59f0470          LDR      r0,|L1.1228|
000058  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
00005c  e3500000          CMP      r0,#0
000060  0a000002          BEQ      |L1.112|
;;;87             return ((OS_EVENT *)0);                  /* ... can't CREATE from an ISR                       */
000064  e3a00000          MOV      r0,#0
                  |L1.104|
000068  e8bd4070          POP      {r4-r6,lr}
;;;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->OSEventCnt  = 0;
;;;98             pevent->OSEventPtr  = msg;               /* Deposit message in event control block             */
;;;99             OS_EventWaitListInit(pevent);
;;;100        }
;;;101        return (pevent);                             /* Return pointer to event control block              */
;;;102    }
00006c  e12fff1e          BX       lr
                  |L1.112|
000070  ef000002          SVC      #0x2                  ;89
000074  e59f0454          LDR      r0,|L1.1232|
000078  e5904000          LDR      r4,[r0,#0]            ;90  ; OSEventFreeList
00007c  e3540000          CMP      r4,#0                 ;91
000080  0a000001          BEQ      |L1.140|
000084  e5941004          LDR      r1,[r4,#4]            ;92
000088  e5801000          STR      r1,[r0,#0]            ;92  ; OSEventFreeList
                  |L1.140|
00008c  ef000003          SVC      #0x3                  ;94
000090  e3540000          CMP      r4,#0                 ;95
000094  0a000006          BEQ      |L1.180|
000098  e3a00001          MOV      r0,#1                 ;96
00009c  e5c40000          STRB     r0,[r4,#0]            ;96
0000a0  e3a00000          MOV      r0,#0                 ;97
0000a4  e1c400b2          STRH     r0,[r4,#2]            ;97
0000a8  e5845004          STR      r5,[r4,#4]            ;98
0000ac  e1a00004          MOV      r0,r4                 ;99
0000b0  ebfffffe          BL       OS_EventWaitListInit
                  |L1.180|
0000b4  e1a00004          MOV      r0,r4                 ;101
0000b8  eaffffea          B        |L1.104|
;;;103    /*$PAGE*/
                          ENDP

                  OSMboxDel PROC
;;;141    OS_EVENT  *OSMboxDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;142    {
0000bc  e92d47f0          PUSH     {r4-r10,lr}
0000c0  e1a04000          MOV      r4,r0
0000c4  e1a07001          MOV      r7,r1
0000c8  e1a05002          MOV      r5,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  e59f03f8          LDR      r0,|L1.1228|
0000d0  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0000d4  e3500000          CMP      r0,#0
0000d8  0a000004          BEQ      |L1.240|
;;;150            *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
0000dc  e3a0008c          MOV      r0,#0x8c
0000e0  e5c50000          STRB     r0,[r5,#0]
;;;151            return (pevent);
0000e4  e1a00004          MOV      r0,r4
                  |L1.232|
0000e8  e8bd47f0          POP      {r4-r10,lr}
;;;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    }
0000ec  e12fff1e          BX       lr
                  |L1.240|
0000f0  e3540000          CMP      r4,#0                 ;154
0000f4  1a000003          BNE      |L1.264|
0000f8  e3a00004          MOV      r0,#4                 ;155
0000fc  e5c50000          STRB     r0,[r5,#0]            ;155
000100  e1a00004          MOV      r0,r4                 ;156
000104  eafffff7          B        |L1.232|
                  |L1.264|
000108  e5d40000          LDRB     r0,[r4,#0]            ;158
00010c  e3500001          CMP      r0,#1                 ;158
000110  0a000003          BEQ      |L1.292|
000114  e3a00001          MOV      r0,#1                 ;159
000118  e5c50000          STRB     r0,[r5,#0]            ;159
00011c  e1a00004          MOV      r0,r4                 ;160
000120  eafffff0          B        |L1.232|
                  |L1.292|
000124  ef000002          SVC      #0x2                  ;163
000128  e5d40001          LDRB     r0,[r4,#1]            ;164
00012c  e3500000          CMP      r0,#0                 ;164
000130  0a000001          BEQ      |L1.316|
000134  e3a06001          MOV      r6,#1                 ;165
000138  ea000000          B        |L1.320|
                  |L1.316|
00013c  e3a06000          MOV      r6,#0                 ;167
                  |L1.320|
000140  e59f8388          LDR      r8,|L1.1232|
000144  e3570000          CMP      r7,#0                 ;169
000148  e3a09000          MOV      r9,#0                 ;167
00014c  0a000002          BEQ      |L1.348|
000150  e3570001          CMP      r7,#1                 ;169
000154  1a000021          BNE      |L1.480|
000158  ea000012          B        |L1.424|
                  |L1.348|
00015c  e3560000          CMP      r6,#0                 ;171

⌨️ 快捷键说明

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