📄 os_mbox.txt
字号:
000178 ef000003 SVC 0x3 ; formerly SWI ;175
00017c e3a00000 MOV r0,#0 ;176
000180 e5c60000 STRB r0,[r6,#0] ;176
000184 eaffffd7 B |L1.232| ;177
|L1.392|
000188 ef000003 SVC 0x3 ; formerly SWI ;179
00018c e3a00008 MOV r0,#8 ;180
000190 e5c60000 STRB r0,[r6,#0] ;180
000194 e1a00004 MOV r0,r4 ;181
000198 eaffffd2 B |L1.232| ;181
|L1.412|
00019c e1a00000 MOV r0,r0 ;184
0001a0 ea000003 B |L1.436| ;185
|L1.420|
0001a4 e3a02002 MOV r2,#2 ;186
0001a8 e3a01000 MOV r1,#0 ;186
0001ac e1a00004 MOV r0,r4 ;186
0001b0 ebfffffe BL OS_EventTaskRdy ;186
|L1.436|
0001b4 e5d40001 LDRB r0,[r4,#1] ;185
0001b8 e3500000 CMP r0,#0 ;185
0001bc 1afffff8 BNE |L1.420| ;185
0001c0 e3a00000 MOV r0,#0 ;188
0001c4 e5c40000 STRB r0,[r4,#0] ;188
0001c8 e59f0344 LDR r0,|L1.1300| ;189
0001cc e5900000 LDR r0,[r0,#0] ;189 ; OSEventFreeList
0001d0 e5840004 STR r0,[r4,#4] ;189
0001d4 e59f0338 LDR r0,|L1.1300| ;190
0001d8 e5804000 STR r4,[r0,#0] ;190 ; OSEventFreeList
0001dc ef000003 SVC 0x3 ; formerly SWI ;191
0001e0 e3570001 CMP r7,#1 ;192
0001e4 1a000000 BNE |L1.492| ;192
0001e8 ebfffffe BL OS_Sched ;193
|L1.492|
0001ec e3a00000 MOV r0,#0 ;195
0001f0 e5c60000 STRB r0,[r6,#0] ;195
0001f4 eaffffbb B |L1.232| ;196
|L1.504|
0001f8 e1a00000 MOV r0,r0 ;198
0001fc ef000003 SVC 0x3 ; formerly SWI ;199
000200 e3a00007 MOV r0,#7 ;200
000204 e5c60000 STRB r0,[r6,#0] ;200
000208 e1a00004 MOV r0,r4 ;201
00020c eaffffb5 B |L1.232| ;201
ENDP
OSMboxPend PROC
;;;238 void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
;;;239 {
000210 e92d41f0 PUSH {r4-r8,lr}
000214 e1a04000 MOV r4,r0
000218 e1a05001 MOV r5,r1
00021c e1a07002 MOV r7,r2
;;;240 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;241 OS_CPU_SR cpu_sr;
;;;242 #endif
;;;243 void *msg;
;;;244
;;;245
;;;246 if (OSIntNesting > 0) { /* See if called from ISR ... */
000220 e59f02e8 LDR r0,|L1.1296|
000224 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000228 e3500000 CMP r0,#0
00022c da000003 BLE |L1.576|
;;;247 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
000230 e3a00002 MOV r0,#2
000234 e5c70000 STRB r0,[r7,#0]
;;;248 return ((void *)0);
000238 e3a00000 MOV r0,#0
;;;249 }
;;;250 #if OS_ARG_CHK_EN > 0
;;;251 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;252 *err = OS_ERR_PEVENT_NULL;
;;;253 return ((void *)0);
;;;254 }
;;;255 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
;;;256 *err = OS_ERR_EVENT_TYPE;
;;;257 return ((void *)0);
;;;258 }
;;;259 #endif
;;;260 OS_ENTER_CRITICAL();
;;;261 msg = pevent->OSEventPtr;
;;;262 if (msg != (void *)0) { /* See if there is already a message */
;;;263 pevent->OSEventPtr = (void *)0; /* Clear the mailbox */
;;;264 OS_EXIT_CRITICAL();
;;;265 *err = OS_NO_ERR;
;;;266 return (msg); /* Return the message received (or NULL) */
;;;267 }
;;;268 OSTCBCur->OSTCBStat |= OS_STAT_MBOX; /* Message not available, task will pend */
;;;269 OSTCBCur->OSTCBDly = timeout; /* Load timeout in TCB */
;;;270 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
;;;271 OS_EXIT_CRITICAL();
;;;272 OS_Sched(); /* Find next highest priority task ready to run */
;;;273 OS_ENTER_CRITICAL();
;;;274 msg = OSTCBCur->OSTCBMsg;
;;;275 if (msg != (void *)0) { /* See if we were given the message */
;;;276 OSTCBCur->OSTCBMsg = (void *)0; /* Yes, clear message received */
;;;277 OSTCBCur->OSTCBStat = OS_STAT_RDY;
;;;278 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event */
;;;279 OS_EXIT_CRITICAL();
;;;280 *err = OS_NO_ERR;
;;;281 return (msg); /* Return the message received */
;;;282 }
;;;283 OS_EventTO(pevent); /* Timed out, Make task ready */
;;;284 OS_EXIT_CRITICAL();
;;;285 *err = OS_TIMEOUT; /* Indicate that a timeout occured */
;;;286 return ((void *)0); /* Return a NULL message */
;;;287 }
|L1.572|
00023c e8bd81f0 POP {r4-r8,pc}
|L1.576|
000240 e3540000 CMP r4,#0 ;251
000244 1a000003 BNE |L1.600| ;251
000248 e3a00004 MOV r0,#4 ;252
00024c e5c70000 STRB r0,[r7,#0] ;252
000250 e3a00000 MOV r0,#0 ;253
000254 eafffff8 B |L1.572| ;253
|L1.600|
000258 e5d40000 LDRB r0,[r4,#0] ;255
00025c e3500001 CMP r0,#1 ;255
000260 0a000003 BEQ |L1.628| ;255
000264 e3a00001 MOV r0,#1 ;256
000268 e5c70000 STRB r0,[r7,#0] ;256
00026c e3a00000 MOV r0,#0 ;257
000270 eafffff1 B |L1.572| ;257
|L1.628|
000274 ef000002 SVC 0x2 ; formerly SWI ;260
000278 e5946004 LDR r6,[r4,#4] ;261
00027c e3560000 CMP r6,#0 ;262
000280 0a000006 BEQ |L1.672| ;262
000284 e3a00000 MOV r0,#0 ;263
000288 e5840004 STR r0,[r4,#4] ;263
00028c ef000003 SVC 0x3 ; formerly SWI ;264
000290 e3a00000 MOV r0,#0 ;265
000294 e5c70000 STRB r0,[r7,#0] ;265
000298 e1a00006 MOV r0,r6 ;266
00029c eaffffe6 B |L1.572| ;266
|L1.672|
0002a0 e59f0270 LDR r0,|L1.1304| ;268
0002a4 e5900000 LDR r0,[r0,#0] ;268 ; OSTCBCur
0002a8 e5d0001c LDRB r0,[r0,#0x1c] ;268
0002ac e3800002 ORR r0,r0,#2 ;268
0002b0 e59f1260 LDR r1,|L1.1304| ;268
0002b4 e5911000 LDR r1,[r1,#0] ;268 ; OSTCBCur
0002b8 e5c1001c STRB r0,[r1,#0x1c] ;268
0002bc e59f0254 LDR r0,|L1.1304| ;269
0002c0 e5900000 LDR r0,[r0,#0] ;269 ; OSTCBCur
0002c4 e1c051ba STRH r5,[r0,#0x1a] ;269
0002c8 e1a00004 MOV r0,r4 ;270
0002cc ebfffffe BL OS_EventTaskWait ;270
0002d0 ef000003 SVC 0x3 ; formerly SWI ;271
0002d4 ebfffffe BL OS_Sched ;272
0002d8 ef000002 SVC 0x2 ; formerly SWI ;273
0002dc e59f0234 LDR r0,|L1.1304| ;274
0002e0 e5900000 LDR r0,[r0,#0] ;274 ; OSTCBCur
0002e4 e5906010 LDR r6,[r0,#0x10] ;274
0002e8 e3560000 CMP r6,#0 ;275
0002ec 0a00000e BEQ |L1.812| ;275
0002f0 e3a00000 MOV r0,#0 ;276
0002f4 e59f121c LDR r1,|L1.1304| ;276
0002f8 e5911000 LDR r1,[r1,#0] ;276 ; OSTCBCur
0002fc e5810010 STR r0,[r1,#0x10] ;276
000300 e59f1210 LDR r1,|L1.1304| ;277
000304 e5911000 LDR r1,[r1,#0] ;277 ; OSTCBCur
000308 e5c1001c STRB r0,[r1,#0x1c] ;277
00030c e59f1204 LDR r1,|L1.1304| ;278
000310 e5911000 LDR r1,[r1,#0] ;278 ; OSTCBCur
000314 e581000c STR r0,[r1,#0xc] ;278
000318 ef000003 SVC 0x3 ; formerly SWI ;279
00031c e3a00000 MOV r0,#0 ;280
000320 e5c70000 STRB r0,[r7,#0] ;280
000324 e1a00006 MOV r0,r6 ;281
000328 eaffffc3 B |L1.572| ;281
|L1.812|
00032c e1a00004 MOV r0,r4 ;283
000330 ebfffffe BL OS_EventTO ;283
000334 ef000003 SVC 0x3 ; formerly SWI ;284
000338 e3a0000a MOV r0,#0xa ;285
00033c e5c70000 STRB r0,[r7,#0] ;285
000340 e3a00000 MOV r0,#0 ;286
000344 eaffffbc B |L1.572| ;286
ENDP
OSMboxPost PROC
;;;310 INT8U OSMboxPost (OS_EVENT *pevent, void *msg)
;;;311 {
000348 e92d4070 PUSH {r4-r6,lr}
00034c e1a05000 MOV r5,r0
000350 e1a04001 MOV r4,r1
;;;312 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;313 OS_CPU_SR cpu_sr;
;;;314 #endif
;;;315
;;;316
;;;317 #if OS_ARG_CHK_EN > 0
;;;318 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
000354 e3550000 CMP r5,#0
000358 1a000001 BNE |L1.868|
;;;319 return (OS_ERR_PEVENT_NULL);
00035c e3a00004 MOV r0,#4
;;;320 }
;;;321 if (msg == (void *)0) { /* Make sure we are not posting a NULL pointer */
;;;322 return (OS_ERR_POST_NULL_PTR);
;;;323 }
;;;324 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
;;;325 return (OS_ERR_EVENT_TYPE);
;;;326 }
;;;327 #endif
;;;328 OS_ENTER_CRITICAL();
;;;329 if (pevent->OSEventGrp != 0x00) { /* See if any task pending on mailbox */
;;;330 OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX); /* Ready highest priority task waiting on event */
;;;331 OS_EXIT_CRITICAL();
;;;332 OS_Sched(); /* Find highest priority task ready to run */
;;;333 return (OS_NO_ERR);
;;;334 }
;;;335 if (pevent->OSEventPtr != (void *)0) { /* Make sure mailbox doesn't already have a msg */
;;;336 OS_EXIT_CRITICAL();
;;;337 return (OS_MBOX_FULL);
;;;338 }
;;;339 pevent->OSEventPtr = msg; /* Place message in mailbox */
;;;340 OS_EXIT_CRITICAL();
;;;341 return (OS_NO_ERR);
;;;342 }
|L1.864|
000360 e8bd8070 POP {r4-r6,pc}
|L1.868|
000364 e3540000 CMP r4,#0 ;321
000368 1a000001 BNE |L1.884| ;321
00036c e3a00003 MOV r0,#3 ;322
000370 eafffffa B |L1.864| ;322
|L1.884|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -