📄 os_mbox.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 951] for uVision
; commandline ArmCC [--debug -c --asm --interleave -oos_mbox.o --device=DARMP --apcs=interwork -O0 -IC:\Keil\ARM\INC\Philips uCosii\OS_MBOX.C]
ARM
AREA ||.text.7||, 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| ;50
000028 e3a00000 MOV r0,#0 ;51
00002c eafffff8 B |L1.20| ;51
|L1.48|
000030 ef000002 SVC 0x2 ; formerly SWI ;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 ; formerly SWI ;57
000044 e1a00005 MOV r0,r5 ;58
000048 eafffff1 B |L1.20| ;58
ENDP
OSMboxCreate PROC
;;;78 OS_EVENT *OSMboxCreate (void *msg)
;;;79 {
00004c e92d4070 PUSH {r4-r6,lr}
000050 e1a04000 MOV r4,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 e59f04d8 LDR r0,|L1.1332|
000058 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
00005c e3500000 CMP r0,#0
000060 da000002 BLE |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 ; formerly SWI ;89
000074 e59f04bc LDR r0,|L1.1336| ;90
000078 e5905000 LDR r5,[r0,#0] ;90 ; OSEventFreeList
00007c e5900000 LDR r0,[r0,#0] ;91 ; OSEventFreeList
000080 e3500000 CMP r0,#0 ;91
000084 0a000004 BEQ |L1.156| ;91
000088 e59f04a8 LDR r0,|L1.1336| ;92
00008c e5900000 LDR r0,[r0,#0] ;92 ; OSEventFreeList
000090 e5900004 LDR r0,[r0,#4] ;92
000094 e59f149c LDR r1,|L1.1336| ;92
000098 e5810000 STR r0,[r1,#0] ;92 ; OSEventFreeList
|L1.156|
00009c ef000003 SVC 0x3 ; formerly SWI ;94
0000a0 e3550000 CMP r5,#0 ;95
0000a4 0a000006 BEQ |L1.196| ;95
0000a8 e3a00001 MOV r0,#1 ;96
0000ac e5c50000 STRB r0,[r5,#0] ;96
0000b0 e3a00000 MOV r0,#0 ;97
0000b4 e1c500b2 STRH r0,[r5,#2] ;97
0000b8 e5854004 STR r4,[r5,#4] ;98
0000bc e1a00005 MOV r0,r5 ;99
0000c0 ebfffffe BL OS_EventWaitListInit ;99
|L1.196|
0000c4 e1a00005 MOV r0,r5 ;101
0000c8 eaffffe6 B |L1.104| ;101
ENDP
OSMboxDel PROC
;;;141 OS_EVENT *OSMboxDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;142 {
0000cc e92d41f0 PUSH {r4-r8,lr}
0000d0 e1a04000 MOV r4,r0
0000d4 e1a05001 MOV r5,r1
0000d8 e1a06002 MOV r6,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 ... */
0000dc e59f0450 LDR r0,|L1.1332|
0000e0 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0000e4 e3500000 CMP r0,#0
0000e8 da000004 BLE |L1.256|
;;;150 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
0000ec e3a0008c MOV r0,#0x8c
0000f0 e5c60000 STRB r0,[r6,#0]
;;;151 return (pevent);
0000f4 e1a00004 MOV r0,r4
|L1.248|
0000f8 e8bd41f0 POP {r4-r8,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 }
0000fc e12fff1e BX lr
|L1.256|
000100 e3540000 CMP r4,#0 ;154
000104 1a000003 BNE |L1.280| ;154
000108 e3a00004 MOV r0,#4 ;155
00010c e5c60000 STRB r0,[r6,#0] ;155
000110 e1a00004 MOV r0,r4 ;156
000114 eafffff7 B |L1.248| ;156
|L1.280|
000118 e5d40000 LDRB r0,[r4,#0] ;158
00011c e3500001 CMP r0,#1 ;158
000120 0a000003 BEQ |L1.308| ;158
000124 e3a00001 MOV r0,#1 ;159
000128 e5c60000 STRB r0,[r6,#0] ;159
00012c e1a00004 MOV r0,r4 ;160
000130 eafffff0 B |L1.248| ;160
|L1.308|
000134 ef000002 SVC 0x2 ; formerly SWI ;163
000138 e5d40001 LDRB r0,[r4,#1] ;164
00013c e3500000 CMP r0,#0 ;164
000140 0a000001 BEQ |L1.332| ;164
000144 e3a07001 MOV r7,#1 ;165
000148 ea000000 B |L1.336| ;165
|L1.332|
00014c e3a07000 MOV r7,#0 ;167
|L1.336|
000150 e3550000 CMP r5,#0 ;169
000154 0a000002 BEQ |L1.356| ;169
000158 e3550001 CMP r5,#1 ;169
00015c 1a00002a BNE |L1.524| ;169
000160 ea000012 B |L1.432| ;169
|L1.356|
000164 e1a00000 MOV r0,r0 ;170
000168 e3570000 CMP r7,#0 ;171
00016c 1a00000a BNE |L1.412| ;171
000170 e3a00000 MOV r0,#0 ;172
000174 e5c40000 STRB r0,[r4,#0] ;172
000178 e59f03b8 LDR r0,|L1.1336| ;173
00017c e5900000 LDR r0,[r0,#0] ;173 ; OSEventFreeList
000180 e5840004 STR r0,[r4,#4] ;173
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -