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 + -
显示快捷键?