📄 os_mbox.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 903] for uVision
; commandline ArmCC [--debug -c --asm --interleave -oos_mbox.o --depend=os_mbox.d --device=DARMP --apcs=interwork -I. -I..\BSP -I..\..\..\..\..\uCOS-II\Ports\ARM\Generic\RVMDK -I..\..\..\..\..\uCOS-II\Source -I..\..\..\..\..\uC-CPU -I..\..\..\..\..\uC-CPU\ARM\RVMDK -I..\..\..\..\..\uC-LIB -I..\..\..\..\..\uCOSView\Source -I..\..\..\..\..\uCOSView\Ports\ARM7\LPC2468\IAR -Id:\Keil\ARM\INC\Philips ..\..\..\..\..\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 *msg;
;;;50 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;51 OS_CPU_SR cpu_sr = 0;
000008 e3a06000 MOV r6,#0
;;;52 #endif
;;;53
;;;54
;;;55
;;;56 #if OS_ARG_CHK_EN > 0
;;;57 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
00000c e3540000 CMP r4,#0
000010 1a000002 BNE |L1.32|
;;;58 return ((void *)0);
000014 e3a00000 MOV r0,#0
|L1.24|
000018 e8bd4070 POP {r4-r6,lr}
;;;59 }
;;;60 #endif
;;;61 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
;;;62 return ((void *)0);
;;;63 }
;;;64 OS_ENTER_CRITICAL();
;;;65 msg = pevent->OSEventPtr;
;;;66 pevent->OSEventPtr = (void *)0; /* Clear the mailbox */
;;;67 OS_EXIT_CRITICAL();
;;;68 return (msg); /* Return the message received (or NULL) */
;;;69 }
00001c e12fff1e BX lr
|L1.32|
000020 e5d40000 LDRB r0,[r4,#0]
000024 e3500001 CMP r0,#1
000028 0a000001 BEQ |L1.52|
00002c e3a00000 MOV r0,#0
000030 eafffff8 B |L1.24|
|L1.52|
000034 ebfffffe BL OS_CPU_SR_Save
000038 e1a06000 MOV r6,r0
00003c e5945004 LDR r5,[r4,#4]
000040 e3a00000 MOV r0,#0
000044 e5840004 STR r0,[r4,#4]
000048 e1a00006 MOV r0,r6
00004c ebfffffe BL OS_CPU_SR_Restore
000050 e1a00005 MOV r0,r5
000054 eaffffef B |L1.24|
ENDP
OSMboxCreate PROC
;;;88 OS_EVENT *OSMboxCreate (void *msg)
;;;89 {
000058 e92d4070 PUSH {r4-r6,lr}
00005c e1a04000 MOV r4,r0
;;;90 OS_EVENT *pevent;
;;;91 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;92 OS_CPU_SR cpu_sr = 0;
000060 e3a06000 MOV r6,#0
;;;93 #endif
;;;94
;;;95
;;;96
;;;97 if (OSIntNesting > 0) { /* See if called from ISR ... */
000064 e59f077c LDR r0,|L1.2024|
000068 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
00006c e3500000 CMP r0,#0
000070 da000002 BLE |L1.128|
;;;98 return ((OS_EVENT *)0); /* ... can't CREATE from an ISR */
000074 e3a00000 MOV r0,#0
|L1.120|
000078 e8bd4070 POP {r4-r6,lr}
;;;99 }
;;;100 OS_ENTER_CRITICAL();
;;;101 pevent = OSEventFreeList; /* Get next free event control block */
;;;102 if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empty */
;;;103 OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
;;;104 }
;;;105 OS_EXIT_CRITICAL();
;;;106 if (pevent != (OS_EVENT *)0) {
;;;107 pevent->OSEventType = OS_EVENT_TYPE_MBOX;
;;;108 pevent->OSEventCnt = 0;
;;;109 pevent->OSEventPtr = msg; /* Deposit message in event control block */
;;;110 #if OS_EVENT_NAME_SIZE > 1
;;;111 pevent->OSEventName[0] = '?';
;;;112 pevent->OSEventName[1] = OS_ASCII_NUL;
;;;113 #endif
;;;114 OS_EventWaitListInit(pevent);
;;;115 }
;;;116 return (pevent); /* Return pointer to event control block */
;;;117 }
00007c e12fff1e BX lr
|L1.128|
000080 ebfffffe BL OS_CPU_SR_Save
000084 e1a06000 MOV r6,r0
000088 e59f075c LDR r0,|L1.2028|
00008c e5905000 LDR r5,[r0,#0] ; OSEventFreeList
000090 e5900000 LDR r0,[r0,#0] ; OSEventFreeList
000094 e3500000 CMP r0,#0
000098 0a000004 BEQ |L1.176|
00009c e59f0748 LDR r0,|L1.2028|
0000a0 e5900000 LDR r0,[r0,#0] ; OSEventFreeList
0000a4 e5900004 LDR r0,[r0,#4]
0000a8 e59f173c LDR r1,|L1.2028|
0000ac e5810000 STR r0,[r1,#0] ; OSEventFreeList
|L1.176|
0000b0 e1a00006 MOV r0,r6
0000b4 ebfffffe BL OS_CPU_SR_Restore
0000b8 e3550000 CMP r5,#0
0000bc 0a00000a BEQ |L1.236|
0000c0 e3a00001 MOV r0,#1
0000c4 e5c50000 STRB r0,[r5,#0]
0000c8 e3a00000 MOV r0,#0
0000cc e1c500b8 STRH r0,[r5,#8]
0000d0 e5854004 STR r4,[r5,#4]
0000d4 e3a0003f MOV r0,#0x3f
0000d8 e5c5000f STRB r0,[r5,#0xf]
0000dc e3a00000 MOV r0,#0
0000e0 e5c50010 STRB r0,[r5,#0x10]
0000e4 e1a00005 MOV r0,r5
0000e8 ebfffffe BL OS_EventWaitListInit
|L1.236|
0000ec e1a00005 MOV r0,r5
0000f0 eaffffe0 B |L1.120|
ENDP
OSMboxDel PROC
;;;156 OS_EVENT *OSMboxDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;157 {
0000f4 e92d47f0 PUSH {r4-r10,lr}
0000f8 e1a04000 MOV r4,r0
0000fc e1a05001 MOV r5,r1
000100 e1a06002 MOV r6,r2
;;;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;
000104 e3a09000 MOV r9,#0
;;;162 #endif
;;;163
;;;164
;;;165
;;;166 #if OS_ARG_CHK_EN > 0
;;;167 if (err == (INT8U *)0) { /* Validate 'err' */
000108 e3560000 CMP r6,#0
00010c 1a000002 BNE |L1.284|
;;;168 return (pevent);
000110 e1a00004 MOV r0,r4
|L1.276|
000114 e8bd47f0 POP {r4-r10,lr}
;;;169 }
;;;170 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;171 *err = OS_ERR_PEVENT_NULL;
;;;172 return (pevent);
;;;173 }
;;;174 #endif
;;;175 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
;;;176 *err = OS_ERR_EVENT_TYPE;
;;;177 return (pevent);
;;;178 }
;;;179 if (OSIntNesting > 0) { /* See if called from ISR ... */
;;;180 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
;;;181 return (pevent);
;;;182 }
;;;183 OS_ENTER_CRITICAL();
;;;184 if (pevent->OSEventGrp != 0) { /* See if any tasks waiting on mailbox */
;;;185 tasks_waiting = OS_TRUE; /* Yes */
;;;186 } else {
;;;187 tasks_waiting = OS_FALSE; /* No */
;;;188 }
;;;189 switch (opt) {
;;;190 case OS_DEL_NO_PEND: /* Delete mailbox only if no task waiting */
;;;191 if (tasks_waiting == OS_FALSE) {
;;;192 #if OS_EVENT_NAME_SIZE > 1
;;;193 pevent->OSEventName[0] = '?'; /* Unknown name */
;;;194 pevent->OSEventName[1] = OS_ASCII_NUL;
;;;195 #endif
;;;196 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;197 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
;;;198 pevent->OSEventCnt = 0;
;;;199 OSEventFreeList = pevent; /* Get next free event control block */
;;;200 OS_EXIT_CRITICAL();
;;;201 *err = OS_ERR_NONE;
;;;202 pevent_return = (OS_EVENT *)0; /* Mailbox has been deleted */
;;;203 } else {
;;;204 OS_EXIT_CRITICAL();
;;;205 *err = OS_ERR_TASK_WAITING;
;;;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 *err = OS_ERR_NONE;
;;;227 pevent_return = (OS_EVENT *)0; /* Mailbox has been deleted */
;;;228 break;
;;;229
;;;230 default:
;;;231 OS_EXIT_CRITICAL();
;;;232 *err = OS_ERR_INVALID_OPT;
;;;233 pevent_return = pevent;
;;;234 break;
;;;235 }
;;;236 return (pevent_return);
;;;237 }
000118 e12fff1e BX lr
|L1.284|
00011c e3540000 CMP r4,#0
000120 1a000003 BNE |L1.308|
000124 e3a00004 MOV r0,#4
000128 e5c60000 STRB r0,[r6,#0]
00012c e1a00004 MOV r0,r4
000130 eafffff7 B |L1.276|
|L1.308|
000134 e5d40000 LDRB r0,[r4,#0]
000138 e3500001 CMP r0,#1
00013c 0a000003 BEQ |L1.336|
000140 e3a00001 MOV r0,#1
000144 e5c60000 STRB r0,[r6,#0]
000148 e1a00004 MOV r0,r4
00014c eafffff0 B |L1.276|
|L1.336|
000150 e59f0690 LDR r0,|L1.2024|
000154 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000158 e3500000 CMP r0,#0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -