📄 os_mbox.txt
字号:
0003c4 e1a00009 MOV r0,r9
0003c8 ebfffffe BL OS_CPU_SR_Restore
0003cc ebfffffe BL OS_Sched
0003d0 ebfffffe BL OS_CPU_SR_Save
0003d4 e1a09000 MOV r9,r0
0003d8 e59f0414 LDR r0,|L1.2036|
0003dc e5900000 LDR r0,[r0,#0] ; OSTCBCur
0003e0 e5d0002d LDRB r0,[r0,#0x2d]
0003e4 e3500000 CMP r0,#0
0003e8 0a000017 BEQ |L1.1100|
0003ec e59f0400 LDR r0,|L1.2036|
0003f0 e5900000 LDR r0,[r0,#0] ; OSTCBCur
0003f4 e5d0802d LDRB r8,[r0,#0x2d]
0003f8 e1a00004 MOV r0,r4
0003fc ebfffffe BL OS_EventTOAbort
000400 e1a00009 MOV r0,r9
000404 ebfffffe BL OS_CPU_SR_Restore
000408 e3580001 CMP r8,#1
00040c 0a000002 BEQ |L1.1052|
000410 e3580002 CMP r8,#2
000414 0a000005 BEQ |L1.1072|
000418 ea000001 B |L1.1060|
|L1.1052|
00041c e1a00000 MOV r0,r0
000420 e1a00000 MOV r0,r0
|L1.1060|
000424 e3a0000a MOV r0,#0xa
000428 e5c60000 STRB r0,[r6,#0]
00042c ea000003 B |L1.1088|
|L1.1072|
000430 e1a00000 MOV r0,r0
000434 e3a0000e MOV r0,#0xe
000438 e5c60000 STRB r0,[r6,#0]
00043c e1a00000 MOV r0,r0
|L1.1088|
000440 e1a00000 MOV r0,r0
000444 e3a00000 MOV r0,#0
000448 eaffffa1 B |L1.724|
|L1.1100|
00044c e59f03a0 LDR r0,|L1.2036|
000450 e5900000 LDR r0,[r0,#0] ; OSTCBCur
000454 e5907020 LDR r7,[r0,#0x20]
000458 e3a00000 MOV r0,#0
00045c e59f1390 LDR r1,|L1.2036|
000460 e5911000 LDR r1,[r1,#0] ; OSTCBCur
000464 e5810020 STR r0,[r1,#0x20]
000468 e59f1384 LDR r1,|L1.2036|
00046c e5911000 LDR r1,[r1,#0] ; OSTCBCur
000470 e5c1002c STRB r0,[r1,#0x2c]
000474 e59f1378 LDR r1,|L1.2036|
000478 e5911000 LDR r1,[r1,#0] ; OSTCBCur
00047c e581001c STR r0,[r1,#0x1c]
000480 e1a00009 MOV r0,r9
000484 ebfffffe BL OS_CPU_SR_Restore
000488 e3a00000 MOV r0,#0
00048c e5c60000 STRB r0,[r6,#0]
000490 e1a00007 MOV r0,r7
000494 eaffff8e B |L1.724|
ENDP
OSMboxPendAbort PROC
;;;378 INT8U OSMboxPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;379 {
000498 e92d41f0 PUSH {r4-r8,lr}
00049c e1a04000 MOV r4,r0
0004a0 e1a05001 MOV r5,r1
0004a4 e1a06002 MOV r6,r2
;;;380 INT8U nbr_tasks;
;;;381 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;382 OS_CPU_SR cpu_sr = 0;
0004a8 e3a08000 MOV r8,#0
;;;383 #endif
;;;384
;;;385
;;;386
;;;387 #if OS_ARG_CHK_EN > 0
;;;388 if (err == (INT8U *)0) { /* Validate 'err' */
0004ac e3560000 CMP r6,#0
0004b0 1a000002 BNE |L1.1216|
;;;389 return (0);
0004b4 e3a00000 MOV r0,#0
|L1.1208|
0004b8 e8bd41f0 POP {r4-r8,lr}
;;;390 }
;;;391 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;392 *err = OS_ERR_PEVENT_NULL;
;;;393 return (0);
;;;394 }
;;;395 #endif
;;;396 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
;;;397 *err = OS_ERR_EVENT_TYPE;
;;;398 return (0);
;;;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 *err = OS_ERR_PEND_ABORT;
;;;420 return (nbr_tasks);
;;;421 }
;;;422 OS_EXIT_CRITICAL();
;;;423 *err = OS_ERR_NONE;
;;;424 return (0); /* No tasks waiting on mailbox */
;;;425 }
0004bc e12fff1e BX lr
|L1.1216|
0004c0 e3540000 CMP r4,#0
0004c4 1a000003 BNE |L1.1240|
0004c8 e3a00004 MOV r0,#4
0004cc e5c60000 STRB r0,[r6,#0]
0004d0 e3a00000 MOV r0,#0
0004d4 eafffff7 B |L1.1208|
|L1.1240|
0004d8 e5d40000 LDRB r0,[r4,#0]
0004dc e3500001 CMP r0,#1
0004e0 0a000003 BEQ |L1.1268|
0004e4 e3a00001 MOV r0,#1
0004e8 e5c60000 STRB r0,[r6,#0]
0004ec e3a00000 MOV r0,#0
0004f0 eafffff0 B |L1.1208|
|L1.1268|
0004f4 ebfffffe BL OS_CPU_SR_Save
0004f8 e1a08000 MOV r8,r0
0004fc e5d4000a LDRB r0,[r4,#0xa]
000500 e3500000 CMP r0,#0
000504 0a000023 BEQ |L1.1432|
000508 e3a07000 MOV r7,#0
00050c e3550000 CMP r5,#0
000510 0a00000e BEQ |L1.1360|
000514 e3550001 CMP r5,#1
000518 1a00000e BNE |L1.1368|
00051c e1a00000 MOV r0,r0
000520 ea000006 B |L1.1344|
|L1.1316|
000524 e3a03002 MOV r3,#2
000528 e1a02003 MOV r2,r3
00052c e3a01000 MOV r1,#0
000530 e1a00004 MOV r0,r4
000534 ebfffffe BL OS_EventTaskRdy
000538 e2870001 ADD r0,r7,#1
00053c e20070ff AND r7,r0,#0xff
|L1.1344|
000540 e5d4000a LDRB r0,[r4,#0xa]
000544 e3500000 CMP r0,#0
000548 1afffff5 BNE |L1.1316|
00054c ea000009 B |L1.1400|
|L1.1360|
000550 e1a00000 MOV r0,r0
000554 e1a00000 MOV r0,r0
|L1.1368|
000558 e3a03002 MOV r3,#2
00055c e1a02003 MOV r2,r3
000560 e3a01000 MOV r1,#0
000564 e1a00004 MOV r0,r4
000568 ebfffffe BL OS_EventTaskRdy
00056c e2870001 ADD r0,r7,#1
000570 e20070ff AND r7,r0,#0xff
000574 e1a00000 MOV r0,r0
|L1.1400|
000578 e1a00000 MOV r0,r0
00057c e1a00008 MOV r0,r8
000580 ebfffffe BL OS_CPU_SR_Restore
000584 ebfffffe BL OS_Sched
000588 e3a0000e MOV r0,#0xe
00058c e5c60000 STRB r0,[r6,#0]
000590 e1a00007 MOV r0,r7
000594 eaffffc7 B |L1.1208|
|L1.1432|
000598 e1a00008 MOV r0,r8
00059c ebfffffe BL OS_CPU_SR_Restore
0005a0 e3a00000 MOV r0,#0
0005a4 e5c60000 STRB r0,[r6,#0]
0005a8 eaffffc2 B |L1.1208|
ENDP
OSMboxPost PROC
;;;452 INT8U OSMboxPost (OS_EVENT *pevent, void *msg)
;;;453 {
0005ac e92d4070 PUSH {r4-r6,lr}
0005b0 e1a04000 MOV r4,r0
0005b4 e1a05001 MOV r5,r1
;;;454 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;455 OS_CPU_SR cpu_sr = 0;
0005b8 e3a06000 MOV r6,#0
;;;456 #endif
;;;457
;;;458
;;;459
;;;460 #if OS_ARG_CHK_EN > 0
;;;461 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
0005bc e3540000 CMP r4,#0
0005c0 1a000002 BNE |L1.1488|
;;;462 return (OS_ERR_PEVENT_NULL);
0005c4 e3a00004 MOV r0,#4
|L1.1480|
0005c8 e8bd4070 POP {r4-r6,lr}
;;;463 }
;;;464 if (msg == (void *)0) { /* Make sure we are not posting a NULL pointer */
;;;465 return (OS_ERR_POST_NULL_PTR);
;;;466 }
;;;467 #endif
;;;468 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
;;;469 return (OS_ERR_EVENT_TYPE);
;;;470 }
;;;471 OS_ENTER_CRITICAL();
;;;472 if (pevent->OSEventGrp != 0) { /* See if any task pending on mailbox */
;;;473 /* Ready HPT waiting on event */
;;;474 (void)OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX, OS_STAT_PEND_OK);
;;;475 OS_EXIT_CRITICAL();
;;;476 OS_Sched(); /* Find highest priority task ready to run */
;;;477 return (OS_ERR_NONE);
;;;478 }
;;;479 if (pevent->OSEventPtr != (void *)0) { /* Make sure mailbox doesn't already have a msg */
;;;480 OS_EXIT_CRITICAL();
;;;481 return (OS_ERR_MBOX_FULL);
;;;482 }
;;;483 pevent->OSEventPtr = msg; /* Place message in mailbox */
;;;484 OS_EXIT_CRITICAL();
;;;485 return (OS_ERR_NONE);
;;;486 }
0005cc e12fff1e BX lr
|L1.1488|
0005d0 e3550000 CMP r5,#0
0005d4 1a000001 BNE |L1.1504|
0005d8 e3a00003 MOV r0,#3
0005dc eafffff9 B |L1.1480|
|L1.1504|
0005e0 e5d40000 LDRB r0,[r4,#0]
0005e4 e3500001 CMP r0,#1
0005e8 0a000001 BEQ |L1.1524|
0005ec e3a00001 MOV r0,#1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -