📄 os_mbox.txt
字号:
0001a0 ebfffffe BL OS_CPU_SR_Restore
0001a4 e3560001 CMP r6,#1 ;223
0001a8 0bfffffe BLEQ OS_Sched
|L1.428|
0001ac e3a00000 MOV r0,#0 ;227
0001b0 e5c5a000 STRB r10,[r5,#0] ;226
0001b4 eaffffe7 B |L1.344|
|L1.440|
0001b8 e1a00007 MOV r0,r7 ;231
0001bc ebfffffe BL OS_CPU_SR_Restore
0001c0 e3a00007 MOV r0,#7 ;232
0001c4 eaffffe1 B |L1.336|
;;;238 #endif
ENDP
OSMboxPend PROC
;;;274 void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;275 {
0001c8 e92d47f0 PUSH {r4-r10,lr}
0001cc e1a06000 MOV r6,r0
;;;276 void *pmsg;
;;;277 INT8U pend_stat;
;;;278 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;279 OS_CPU_SR cpu_sr = 0;
;;;280 #endif
;;;281
;;;282
;;;283
;;;284 #if OS_ARG_CHK_EN > 0
;;;285 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;286 return ((void *)0);
;;;287 }
;;;288 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;289 *perr = OS_ERR_PEVENT_NULL;
;;;290 return ((void *)0);
;;;291 }
;;;292 #endif
;;;293 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
0001d0 e5d00000 LDRB r0,[r0,#0]
0001d4 e1a09001 MOV r9,r1 ;275
0001d8 e1a04002 MOV r4,r2 ;275
0001dc e3500001 CMP r0,#1
;;;294 *perr = OS_ERR_EVENT_TYPE;
0001e0 13a00001 MOVNE r0,#1
;;;295 return ((void *)0);
0001e4 1a000004 BNE |L1.508|
;;;296 }
;;;297 if (OSIntNesting > 0) { /* See if called from ISR ... */
0001e8 e59f0354 LDR r0,|L1.1348|
0001ec e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0001f0 e3500000 CMP r0,#0
0001f4 0a000004 BEQ |L1.524|
;;;298 *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
0001f8 e3a00002 MOV r0,#2
|L1.508|
0001fc e5c40000 STRB r0,[r4,#0] ;294
;;;299 return ((void *)0);
;;;300 }
;;;301 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
;;;302 *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
;;;303 return ((void *)0);
;;;304 }
;;;305 OS_ENTER_CRITICAL();
;;;306 pmsg = pevent->OSEventPtr;
;;;307 if (pmsg != (void *)0) { /* See if there is already a message */
;;;308 pevent->OSEventPtr = (void *)0; /* Clear the mailbox */
;;;309 OS_EXIT_CRITICAL();
;;;310 *perr = OS_ERR_NONE;
;;;311 return (pmsg); /* Return the message received (or NULL) */
;;;312 }
;;;313 OSTCBCur->OSTCBStat |= OS_STAT_MBOX; /* Message not available, task will pend */
;;;314 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
;;;315 OSTCBCur->OSTCBDly = timeout; /* Load timeout in TCB */
;;;316 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
;;;317 OS_EXIT_CRITICAL();
;;;318 OS_Sched(); /* Find next highest priority task ready to run */
;;;319 OS_ENTER_CRITICAL();
;;;320 if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* See if we weren't given the message */
;;;321 pend_stat = OSTCBCur->OSTCBStatPend;
;;;322 OS_EventTOAbort(pevent); /* Timed out, Make task ready */
;;;323 OS_EXIT_CRITICAL();
;;;324 switch (pend_stat) {
;;;325 case OS_STAT_PEND_TO:
;;;326 default:
;;;327 *perr = OS_ERR_TIMEOUT; /* Indicate that a timeout occured */
;;;328 break;
;;;329
;;;330 case OS_STAT_PEND_ABORT:
;;;331 *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted */
;;;332 break;
;;;333 }
;;;334 return ((void *)0); /* Return a NULL message */
000200 e3a00000 MOV r0,#0
|L1.516|
000204 e8bd47f0 POP {r4-r10,lr}
;;;335 }
;;;336 pmsg = OSTCBCur->OSTCBMsg;
;;;337 OSTCBCur->OSTCBMsg = (void *)0; /* Yes, clear message received */
;;;338 OSTCBCur->OSTCBStat = OS_STAT_RDY;
;;;339 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event */
;;;340 OS_EXIT_CRITICAL();
;;;341 *perr = OS_ERR_NONE;
;;;342 return (pmsg); /* Return the message received */
;;;343 }
000208 e12fff1e BX lr
|L1.524|
00020c e59f0338 LDR r0,|L1.1356|
000210 e5d00000 LDRB r0,[r0,#0] ;301 ; OSLockNesting
000214 e3500000 CMP r0,#0 ;301
000218 13a0000d MOVNE r0,#0xd ;302
00021c 1afffff6 BNE |L1.508|
000220 ebfffffe BL OS_CPU_SR_Save
000224 e5967004 LDR r7,[r6,#4] ;306
000228 e1a05000 MOV r5,r0 ;305
00022c e3570000 CMP r7,#0 ;307
000230 e3a08000 MOV r8,#0 ;306
000234 0a000005 BEQ |L1.592|
000238 e1a00005 MOV r0,r5 ;309
00023c e5868004 STR r8,[r6,#4] ;309
000240 ebfffffe BL OS_CPU_SR_Restore
000244 e1a00007 MOV r0,r7 ;311
000248 e5c48000 STRB r8,[r4,#0] ;310
00024c eaffffec B |L1.516|
|L1.592|
000250 e59f72f8 LDR r7,|L1.1360|
000254 e5971000 LDR r1,[r7,#0] ;313 ; OSTCBCur
000258 e5d1002c LDRB r0,[r1,#0x2c] ;313
00025c e3800002 ORR r0,r0,#2 ;313
000260 e5c1002c STRB r0,[r1,#0x2c] ;313
000264 e5c1802d STRB r8,[r1,#0x2d] ;314
000268 e1a00006 MOV r0,r6 ;316
00026c e1c192ba STRH r9,[r1,#0x2a] ;315
000270 ebfffffe BL OS_EventTaskWait
000274 e1a00005 MOV r0,r5 ;317
000278 ebfffffe BL OS_CPU_SR_Restore
00027c ebfffffe BL OS_Sched
000280 ebfffffe BL OS_CPU_SR_Save
000284 e5971000 LDR r1,[r7,#0] ;320 ; OSTCBCur
000288 e1a09000 MOV r9,r0 ;319
00028c e5d1502d LDRB r5,[r1,#0x2d] ;320
000290 e3550000 CMP r5,#0 ;320
000294 0a000007 BEQ |L1.696|
000298 e1a00006 MOV r0,r6 ;322
00029c ebfffffe BL OS_EventTOAbort
0002a0 e1a00009 MOV r0,r9 ;323
0002a4 ebfffffe BL OS_CPU_SR_Restore
0002a8 e3550002 CMP r5,#2 ;324
0002ac 03a0000e MOVEQ r0,#0xe ;331
0002b0 13a0000a MOVNE r0,#0xa ;327
0002b4 eaffffd0 B |L1.508|
|L1.696|
0002b8 e5915020 LDR r5,[r1,#0x20] ;337
0002bc e5818020 STR r8,[r1,#0x20] ;337
0002c0 e5c1802c STRB r8,[r1,#0x2c] ;338
0002c4 e1a00009 MOV r0,r9 ;340
0002c8 e581801c STR r8,[r1,#0x1c] ;340
0002cc ebfffffe BL OS_CPU_SR_Restore
0002d0 e1a00005 MOV r0,r5 ;342
0002d4 e5c48000 STRB r8,[r4,#0] ;341
0002d8 eaffffc9 B |L1.516|
;;;344 /*$PAGE*/
ENDP
OSMboxPendAbort PROC
;;;378 INT8U OSMboxPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;379 {
0002dc e92d41f0 PUSH {r4-r8,lr}
0002e0 e1a08001 MOV r8,r1
;;;380 INT8U nbr_tasks;
;;;381 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;382 OS_CPU_SR cpu_sr = 0;
;;;383 #endif
;;;384
;;;385
;;;386
;;;387 #if OS_ARG_CHK_EN > 0
;;;388 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;389 return (0);
;;;390 }
;;;391 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;392 *perr = OS_ERR_PEVENT_NULL;
;;;393 return (0);
;;;394 }
;;;395 #endif
;;;396 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
0002e4 e5d01000 LDRB r1,[r0,#0]
0002e8 e1a05000 MOV r5,r0 ;379
0002ec e1a06002 MOV r6,r2 ;379
0002f0 e3510001 CMP r1,#1
0002f4 e3a00001 MOV r0,#1
0002f8 0a000003 BEQ |L1.780|
|L1.764|
;;;397 *perr = OS_ERR_EVENT_TYPE;
0002fc e5c60000 STRB r0,[r6,#0]
;;;398 return (0);
000300 e3a00000 MOV r0,#0
|L1.772|
000304 e8bd41f0 POP {r4-r8,lr}
;;;399 }
;;;400 OS_ENTER_CRITICAL();
;;;401 if (pevent->OSEventGrp != 0) { /* See if any task waiting on mailbox? */
;;;402 nbr_tasks = 0;
;;;403 switch (opt) {
;;;404 case OS_PEND_OPT_BROADCAST: /* Do we need to abort ALL waiting tasks? */
;;;405 while (pevent->OSEventGrp != 0) { /* Yes, ready ALL tasks waiting on mailbox */
;;;406 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MBOX, OS_STAT_PEND_ABORT);
;;;407 nbr_tasks++;
;;;408 }
;;;409 break;
;;;410
;;;411 case OS_PEND_OPT_NONE: /* No, ready HPT waiting on mailbox */
;;;412 default:
;;;413 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MBOX, OS_STAT_PEND_ABORT);
;;;414 nbr_tasks++;
;;;415 break;
;;;416 }
;;;417 OS_EXIT_CRITICAL();
;;;418 OS_Sched(); /* Find HPT ready to run */
;;;419 *perr = OS_ERR_PEND_ABORT;
;;;420 return (nbr_tasks);
;;;421 }
;;;422 OS_EXIT_CRITICAL();
;;;423 *perr = OS_ERR_NONE;
;;;424 return (0); /* No tasks waiting on mailbox */
;;;425 }
000308 e12fff1e BX lr
|L1.780|
00030c ebfffffe BL OS_CPU_SR_Save
000310 e1a07000 MOV r7,r0 ;400
000314 e5d5000a LDRB r0,[r5,#0xa] ;401
000318 e3500000 CMP r0,#0 ;401
00031c 0a00001a BEQ |L1.908|
000320 e3580001 CMP r8,#1 ;403
000324 e3a04000 MOV r4,#0 ;402
000328 1a00000a BNE |L1.856|
|L1.812|
00032c e3a03002 MOV r3,#2 ;406
000330 e1a02003 MOV r2,r3 ;406
000334 e3a01000 MOV r1,#0 ;406
000338 e1a00005 MOV r0,r5 ;406
00033c ebfffffe BL OS_EventTaskRdy
000340 e5d5100a LDRB r1,[r5,#0xa] ;405
000344 e2840001 ADD r0,r4,#1 ;407
000348 e20040ff AND r4,r0,#0xff ;407
00034c e3510000 CMP r1,#0 ;405
000350 1afffff5 BNE |L1.812|
000354 ea000005 B |L1.880|
|L1.856|
000358 e3a03002 MOV r3,#2 ;413
00035c e1a02003 MOV r2,r3 ;413
000360 e3a01000 MOV r1,#0 ;413
000364 e1a00005 MOV r0,r5 ;413
000368 ebfffffe BL OS_EventTaskRdy
00036c e3a04001 MOV r4,#1 ;414
|L1.880|
000370 e1a00007 MOV r0,r7 ;417
000374 ebfffffe BL OS_CPU_SR_Restore
000378 ebfffffe BL OS_Sched
00037c e3a0000e MOV r0,#0xe ;419
000380 e5c60000 STRB r0,[r6,#0] ;419
000384 e1a00004 MOV r0,r4 ;420
000388 eaffffdd B |L1.772|
|L1.908|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -