📄 os_mbox.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 947] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\os_mbox.o --device=DARMP -O0 -IC:\Keil\ARM\INC\Philips ..\Source\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 1a000001 BNE |L1.24|
;;;48 return ((void *)0);
000010 e3a00000 MOV r0,#0
;;;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 }
|L1.20|
000014 e8bd8070 POP {r4-r6,pc}
|L1.24|
000018 e5d40000 LDRB r0,[r4,#0] ;50
00001c e3500001 CMP r0,#1 ;50
000020 0a000001 BEQ |L1.44| ;50
000024 e3a00000 MOV r0,#0 ;51
000028 eafffff9 B |L1.20| ;51
|L1.44|
00002c ef000002 SVC 0x2 ; formerly SWI ;54
000030 e5945004 LDR r5,[r4,#4] ;55
000034 e3a00000 MOV r0,#0 ;56
000038 e5840004 STR r0,[r4,#4] ;56
00003c ef000003 SVC 0x3 ; formerly SWI ;57
000040 e1a00005 MOV r0,r5 ;58
000044 eafffff2 B |L1.20| ;58
ENDP
OSMboxCreate PROC
;;;78 OS_EVENT *OSMboxCreate (void *msg)
;;;79 {
000048 e92d4070 PUSH {r4-r6,lr}
00004c 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 ... */
000050 e59f04b8 LDR r0,|L1.1296|
000054 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000058 e3500000 CMP r0,#0
00005c da000001 BLE |L1.104|
;;;87 return ((OS_EVENT *)0); /* ... can't CREATE from an ISR */
000060 e3a00000 MOV r0,#0
;;;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->OSEventPtr = msg; /* Deposit message in event control block */
;;;98 OS_EventWaitListInit(pevent);
;;;99 }
;;;100 return (pevent); /* Return pointer to event control block */
;;;101 }
|L1.100|
000064 e8bd8070 POP {r4-r6,pc}
|L1.104|
000068 ef000002 SVC 0x2 ; formerly SWI ;89
00006c e59f04a0 LDR r0,|L1.1300| ;90
000070 e5905000 LDR r5,[r0,#0] ;90 ; OSEventFreeList
000074 e5900000 LDR r0,[r0,#0] ;91 ; OSEventFreeList
000078 e3500000 CMP r0,#0 ;91
00007c 0a000004 BEQ |L1.148| ;91
000080 e59f048c LDR r0,|L1.1300| ;92
000084 e5900000 LDR r0,[r0,#0] ;92 ; OSEventFreeList
000088 e5900004 LDR r0,[r0,#4] ;92
00008c e59f1480 LDR r1,|L1.1300| ;92
000090 e5810000 STR r0,[r1,#0] ;92 ; OSEventFreeList
|L1.148|
000094 ef000003 SVC 0x3 ; formerly SWI ;94
000098 e3550000 CMP r5,#0 ;95
00009c 0a000004 BEQ |L1.180| ;95
0000a0 e3a00001 MOV r0,#1 ;96
0000a4 e5c50000 STRB r0,[r5,#0] ;96
0000a8 e5854004 STR r4,[r5,#4] ;97
0000ac e1a00005 MOV r0,r5 ;98
0000b0 ebfffffe BL OS_EventWaitListInit ;98
|L1.180|
0000b4 e1a00005 MOV r0,r5 ;100
0000b8 eaffffe9 B |L1.100| ;100
ENDP
OSMboxDel PROC
;;;141 OS_EVENT *OSMboxDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;142 {
0000bc e92d41f0 PUSH {r4-r8,lr}
0000c0 e1a04000 MOV r4,r0
0000c4 e1a05001 MOV r5,r1
0000c8 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 ... */
0000cc e59f043c LDR r0,|L1.1296|
0000d0 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0000d4 e3500000 CMP r0,#0
0000d8 da000003 BLE |L1.236|
;;;150 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
0000dc e3a0008c MOV r0,#0x8c
0000e0 e5c60000 STRB r0,[r6,#0]
;;;151 return (pevent);
0000e4 e1a00004 MOV r0,r4
;;;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 }
|L1.232|
0000e8 e8bd81f0 POP {r4-r8,pc}
|L1.236|
0000ec e3540000 CMP r4,#0 ;154
0000f0 1a000003 BNE |L1.260| ;154
0000f4 e3a00004 MOV r0,#4 ;155
0000f8 e5c60000 STRB r0,[r6,#0] ;155
0000fc e1a00004 MOV r0,r4 ;156
000100 eafffff8 B |L1.232| ;156
|L1.260|
000104 e5d40000 LDRB r0,[r4,#0] ;158
000108 e3500001 CMP r0,#1 ;158
00010c 0a000003 BEQ |L1.288| ;158
000110 e3a00001 MOV r0,#1 ;159
000114 e5c60000 STRB r0,[r6,#0] ;159
000118 e1a00004 MOV r0,r4 ;160
00011c eafffff1 B |L1.232| ;160
|L1.288|
000120 ef000002 SVC 0x2 ; formerly SWI ;163
000124 e5d40001 LDRB r0,[r4,#1] ;164
000128 e3500000 CMP r0,#0 ;164
00012c 0a000001 BEQ |L1.312| ;164
000130 e3a07001 MOV r7,#1 ;165
000134 ea000000 B |L1.316| ;165
|L1.312|
000138 e3a07000 MOV r7,#0 ;167
|L1.316|
00013c e3550000 CMP r5,#0 ;169
000140 0a000002 BEQ |L1.336| ;169
000144 e3550001 CMP r5,#1 ;169
000148 1a00002a BNE |L1.504| ;169
00014c ea000012 B |L1.412| ;169
|L1.336|
000150 e1a00000 MOV r0,r0 ;170
000154 e3570000 CMP r7,#0 ;171
000158 1a00000a BNE |L1.392| ;171
00015c e3a00000 MOV r0,#0 ;172
000160 e5c40000 STRB r0,[r4,#0] ;172
000164 e59f03a8 LDR r0,|L1.1300| ;173
000168 e5900000 LDR r0,[r0,#0] ;173 ; OSEventFreeList
00016c e5840004 STR r0,[r4,#4] ;173
000170 e59f039c LDR r0,|L1.1300| ;174
000174 e5804000 STR r4,[r0,#0] ;174 ; OSEventFreeList
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -