📄 os_mbox.txt
字号:
; 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 + -