📄 os_mbox.txt
字号:
00038c e1a00007 MOV r0,r7 ;422
000390 ebfffffe BL OS_CPU_SR_Restore
000394 e3a00000 MOV r0,#0 ;423
000398 eaffffd7 B |L1.764|
;;;426 #endif
ENDP
OSMboxPost PROC
;;;452 INT8U OSMboxPost (OS_EVENT *pevent, void *pmsg)
;;;453 {
00039c e92d4070 PUSH {r4-r6,lr}
0003a0 e1a04000 MOV r4,r0
;;;454 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;455 OS_CPU_SR cpu_sr = 0;
;;;456 #endif
;;;457
;;;458
;;;459
;;;460 #if OS_ARG_CHK_EN > 0
;;;461 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;462 return (OS_ERR_PEVENT_NULL);
;;;463 }
;;;464 if (pmsg == (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 */
0003a4 e5d00000 LDRB r0,[r0,#0]
0003a8 e1a06001 MOV r6,r1 ;453
0003ac e3500001 CMP r0,#1
;;;469 return (OS_ERR_EVENT_TYPE);
0003b0 13a00001 MOVNE r0,#1
0003b4 1a000013 BNE |L1.1032|
;;;470 }
;;;471 OS_ENTER_CRITICAL();
0003b8 ebfffffe BL OS_CPU_SR_Save
0003bc e1a05000 MOV r5,r0
;;;472 if (pevent->OSEventGrp != 0) { /* See if any task pending on mailbox */
0003c0 e5d4000a LDRB r0,[r4,#0xa]
0003c4 e3500000 CMP r0,#0
0003c8 0a000008 BEQ |L1.1008|
;;;473 /* Ready HPT waiting on event */
;;;474 (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
0003cc e3a03000 MOV r3,#0
0003d0 e3a02002 MOV r2,#2
0003d4 e1a01006 MOV r1,r6
0003d8 e1a00004 MOV r0,r4
0003dc ebfffffe BL OS_EventTaskRdy
;;;475 OS_EXIT_CRITICAL();
0003e0 e1a00005 MOV r0,r5
0003e4 ebfffffe BL OS_CPU_SR_Restore
;;;476 OS_Sched(); /* Find highest priority task ready to run */
0003e8 ebfffffe BL OS_Sched
;;;477 return (OS_ERR_NONE);
0003ec ea00000a B |L1.1052|
|L1.1008|
;;;478 }
;;;479 if (pevent->OSEventPtr != (void *)0) { /* Make sure mailbox doesn't already have a msg */
0003f0 e5940004 LDR r0,[r4,#4]
0003f4 e3500000 CMP r0,#0
0003f8 0a000004 BEQ |L1.1040|
;;;480 OS_EXIT_CRITICAL();
0003fc e1a00005 MOV r0,r5
000400 ebfffffe BL OS_CPU_SR_Restore
;;;481 return (OS_ERR_MBOX_FULL);
000404 e3a00014 MOV r0,#0x14
|L1.1032|
000408 e8bd4070 POP {r4-r6,lr}
;;;482 }
;;;483 pevent->OSEventPtr = pmsg; /* Place message in mailbox */
;;;484 OS_EXIT_CRITICAL();
;;;485 return (OS_ERR_NONE);
;;;486 }
00040c e12fff1e BX lr
|L1.1040|
000410 e1a00005 MOV r0,r5 ;484
000414 e5846004 STR r6,[r4,#4] ;484
000418 ebfffffe BL OS_CPU_SR_Restore
|L1.1052|
00041c e3a00000 MOV r0,#0 ;485
000420 eafffff8 B |L1.1032|
;;;487 #endif
ENDP
OSMboxPostOpt PROC
;;;523 INT8U OSMboxPostOpt (OS_EVENT *pevent, void *pmsg, INT8U opt)
;;;524 {
000424 e92d41f0 PUSH {r4-r8,lr}
000428 e1a04000 MOV r4,r0
;;;525 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;526 OS_CPU_SR cpu_sr = 0;
;;;527 #endif
;;;528
;;;529
;;;530
;;;531 #if OS_ARG_CHK_EN > 0
;;;532 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;533 return (OS_ERR_PEVENT_NULL);
;;;534 }
;;;535 if (pmsg == (void *)0) { /* Make sure we are not posting a NULL pointer */
;;;536 return (OS_ERR_POST_NULL_PTR);
;;;537 }
;;;538 #endif
;;;539 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
00042c e5d00000 LDRB r0,[r0,#0]
000430 e1a06001 MOV r6,r1 ;524
000434 e1a05002 MOV r5,r2 ;524
000438 e3500001 CMP r0,#1
;;;540 return (OS_ERR_EVENT_TYPE);
00043c 13a00001 MOVNE r0,#1
000440 1a000019 BNE |L1.1196|
;;;541 }
;;;542 OS_ENTER_CRITICAL();
000444 ebfffffe BL OS_CPU_SR_Save
000448 e1a07000 MOV r7,r0
;;;543 if (pevent->OSEventGrp != 0) { /* See if any task pending on mailbox */
00044c e5d4000a LDRB r0,[r4,#0xa]
000450 e3500000 CMP r0,#0
000454 0a000016 BEQ |L1.1204|
;;;544 if ((opt & OS_POST_OPT_BROADCAST) != 0x00) { /* Do we need to post msg to ALL waiting tasks ? */
000458 e3150001 TST r5,#1
00045c 0a000008 BEQ |L1.1156|
|L1.1120|
;;;545 while (pevent->OSEventGrp != 0) { /* Yes, Post to ALL tasks waiting on mailbox */
;;;546 (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
000460 e3a03000 MOV r3,#0
000464 e3a02002 MOV r2,#2
000468 e1a01006 MOV r1,r6
00046c e1a00004 MOV r0,r4
000470 ebfffffe BL OS_EventTaskRdy
000474 e5d4000a LDRB r0,[r4,#0xa] ;545
000478 e3500000 CMP r0,#0 ;545
00047c 1afffff7 BNE |L1.1120|
000480 ea000004 B |L1.1176|
|L1.1156|
;;;547 }
;;;548 } else { /* No, Post to HPT waiting on mbox */
;;;549 (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
000484 e3a03000 MOV r3,#0
000488 e3a02002 MOV r2,#2
00048c e1a01006 MOV r1,r6
000490 e1a00004 MOV r0,r4
000494 ebfffffe BL OS_EventTaskRdy
|L1.1176|
;;;550 }
;;;551 OS_EXIT_CRITICAL();
000498 e1a00007 MOV r0,r7
00049c ebfffffe BL OS_CPU_SR_Restore
;;;552 if ((opt & OS_POST_OPT_NO_SCHED) == 0) { /* See if scheduler needs to be invoked */
0004a0 e3150004 TST r5,#4
;;;553 OS_Sched(); /* Find HPT ready to run */
0004a4 0bfffffe BLEQ OS_Sched
|L1.1192|
;;;554 }
;;;555 return (OS_ERR_NONE);
0004a8 e3a00000 MOV r0,#0
|L1.1196|
0004ac e8bd41f0 POP {r4-r8,lr}
;;;556 }
;;;557 if (pevent->OSEventPtr != (void *)0) { /* Make sure mailbox doesn't already have a msg */
;;;558 OS_EXIT_CRITICAL();
;;;559 return (OS_ERR_MBOX_FULL);
;;;560 }
;;;561 pevent->OSEventPtr = pmsg; /* Place message in mailbox */
;;;562 OS_EXIT_CRITICAL();
;;;563 return (OS_ERR_NONE);
;;;564 }
0004b0 e12fff1e BX lr
|L1.1204|
0004b4 e5940004 LDR r0,[r4,#4] ;557
0004b8 e3500000 CMP r0,#0 ;557
0004bc 0a000003 BEQ |L1.1232|
0004c0 e1a00007 MOV r0,r7 ;558
0004c4 ebfffffe BL OS_CPU_SR_Restore
0004c8 e3a00014 MOV r0,#0x14 ;559
0004cc eafffff6 B |L1.1196|
|L1.1232|
0004d0 e1a00007 MOV r0,r7 ;562
0004d4 e5846004 STR r6,[r4,#4] ;562
0004d8 ebfffffe BL OS_CPU_SR_Restore
0004dc eafffff1 B |L1.1192|
;;;565 #endif
ENDP
OSMboxQuery PROC
;;;587 INT8U OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *p_mbox_data)
;;;588 {
0004e0 e92d4070 PUSH {r4-r6,lr}
0004e4 e1a04000 MOV r4,r0
;;;589 INT8U i;
;;;590 #if OS_LOWEST_PRIO <= 63
;;;591 INT8U *psrc;
;;;592 INT8U *pdest;
;;;593 #else
;;;594 INT16U *psrc;
;;;595 INT16U *pdest;
;;;596 #endif
;;;597 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;598 OS_CPU_SR cpu_sr = 0;
;;;599 #endif
;;;600
;;;601
;;;602
;;;603 #if OS_ARG_CHK_EN > 0
;;;604 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;605 return (OS_ERR_PEVENT_NULL);
;;;606 }
;;;607 if (p_mbox_data == (OS_MBOX_DATA *)0) { /* Validate 'p_mbox_data' */
;;;608 return (OS_ERR_PDATA_NULL);
;;;609 }
;;;610 #endif
;;;611 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
0004e8 e5d00000 LDRB r0,[r0,#0]
0004ec e1a05001 MOV r5,r1 ;588
0004f0 e3500001 CMP r0,#1
;;;612 return (OS_ERR_EVENT_TYPE);
0004f4 13a00001 MOVNE r0,#1
0004f8 1a00000f BNE |L1.1340|
;;;613 }
;;;614 OS_ENTER_CRITICAL();
0004fc ebfffffe BL OS_CPU_SR_Save
;;;615 p_mbox_data->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */
000500 e5d4100a LDRB r1,[r4,#0xa]
;;;616 psrc = &pevent->OSEventTbl[0];
000504 e284200b ADD r2,r4,#0xb
;;;617 pdest = &p_mbox_data->OSEventTbl[0];
000508 e2853004 ADD r3,r5,#4
00050c e5c51008 STRB r1,[r5,#8] ;615
;;;618 for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
000510 e3a01000 MOV r1,#0
|L1.1300|
;;;619 *pdest++ = *psrc++;
000514 e4d2c001 LDRB r12,[r2],#1
000518 e2811001 ADD r1,r1,#1 ;618
00051c e20110ff AND r1,r1,#0xff ;618
000520 e3510004 CMP r1,#4 ;618
000524 e4c3c001 STRB r12,[r3],#1
000528 3afffff9 BCC |L1.1300|
;;;620 }
;;;621 p_mbox_data->OSMsg = pevent->OSEventPtr; /* Get message from mailbox */
00052c e5941004 LDR r1,[r4,#4]
000530 e5851000 STR r1,[r5,#0]
;;;622 OS_EXIT_CRITICAL();
000534 ebfffffe BL OS_CPU_SR_Restore
;;;623 return (OS_ERR_NONE);
000538 e3a00000 MOV r0,#0
|L1.1340|
00053c e8bd4070 POP {r4-r6,lr}
;;;624 }
000540 e12fff1e BX lr
;;;625 #endif /* OS_MBOX_QUERY_EN */
ENDP
|L1.1348|
000544 00000000 DCD OSIntNesting
|L1.1352|
000548 00000000 DCD OSEventFreeList
|L1.1356|
00054c 00000000 DCD OSLockNesting
|L1.1360|
000550 00000000 DCD OSTCBCur
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -