?? os_mbox.txt
字號:
0002ae 2000 MOVS r0,#0
0002b0 7030 STRB r0,[r6,#0]
;;;424 return (0); /* No tasks waiting on mailbox */
;;;425 }
0002b2 e8bde8bd POP {r4-r8,pc}
;;;426 #endif
ENDP
OSMboxPost PROC
;;;452 INT8U OSMboxPost (OS_EVENT *pevent, void *pmsg)
;;;453 {
0002b6 b570 PUSH {r4-r6,lr}
0002b8 4604 MOV r4,r0
0002ba 460d MOV r5,r1
;;;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' */
0002bc b90c CBNZ r4,|L1.706|
;;;462 return (OS_ERR_PEVENT_NULL);
0002be 2004 MOVS r0,#4
;;;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 */
;;;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, pmsg, 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 = pmsg; /* Place message in mailbox */
;;;484 OS_EXIT_CRITICAL();
;;;485 return (OS_ERR_NONE);
;;;486 }
0002c0 bd70 POP {r4-r6,pc}
|L1.706|
0002c2 b90d CBNZ r5,|L1.712|
0002c4 2003 MOVS r0,#3
0002c6 bd70 POP {r4-r6,pc}
|L1.712|
0002c8 7820 LDRB r0,[r4,#0]
0002ca 2801 CMP r0,#1
0002cc d001 BEQ |L1.722|
0002ce 2001 MOVS r0,#1
0002d0 bd70 POP {r4-r6,pc}
|L1.722|
0002d2 f7fff7ff BL OS_CPU_SR_Save
0002d6 4606 MOV r6,r0
0002d8 7aa0 LDRB r0,[r4,#0xa]
0002da b160 CBZ r0,|L1.758|
0002dc 2300 MOVS r3,#0
0002de 2202 MOVS r2,#2
0002e0 4629 MOV r1,r5
0002e2 4620 MOV r0,r4
0002e4 f7fff7ff BL OS_EventTaskRdy
0002e8 4630 MOV r0,r6
0002ea f7fff7ff BL OS_CPU_SR_Restore
0002ee f7fff7ff BL OS_Sched
0002f2 2000 MOVS r0,#0
0002f4 bd70 POP {r4-r6,pc}
|L1.758|
0002f6 6860 LDR r0,[r4,#4]
0002f8 b120 CBZ r0,|L1.772|
0002fa 4630 MOV r0,r6
0002fc f7fff7ff BL OS_CPU_SR_Restore
000300 2014 MOVS r0,#0x14
000302 bd70 POP {r4-r6,pc}
|L1.772|
000304 6065 STR r5,[r4,#4]
000306 4630 MOV r0,r6
000308 f7fff7ff BL OS_CPU_SR_Restore
00030c 2000 MOVS r0,#0
00030e bd70 POP {r4-r6,pc}
;;;487 #endif
ENDP
OSMboxPostOpt PROC
;;;523 INT8U OSMboxPostOpt (OS_EVENT *pevent, void *pmsg, INT8U opt)
;;;524 {
000310 e92de92d PUSH {r4-r8,lr}
000314 4604 MOV r4,r0
000316 460d MOV r5,r1
000318 4616 MOV r6,r2
;;;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' */
00031a b914 CBNZ r4,|L1.802|
;;;533 return (OS_ERR_PEVENT_NULL);
00031c 2004 MOVS r0,#4
00031e e8bde8bd POP {r4-r8,pc}
|L1.802|
;;;534 }
;;;535 if (pmsg == (void *)0) { /* Make sure we are not posting a NULL pointer */
000322 b915 CBNZ r5,|L1.810|
;;;536 return (OS_ERR_POST_NULL_PTR);
000324 2003 MOVS r0,#3
000326 e8bde8bd POP {r4-r8,pc}
|L1.810|
;;;537 }
;;;538 #endif
;;;539 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
00032a 7820 LDRB r0,[r4,#0]
00032c 2801 CMP r0,#1
00032e d002 BEQ |L1.822|
;;;540 return (OS_ERR_EVENT_TYPE);
000330 2001 MOVS r0,#1
000332 e8bde8bd POP {r4-r8,pc}
|L1.822|
;;;541 }
;;;542 OS_ENTER_CRITICAL();
000336 f7fff7ff BL OS_CPU_SR_Save
00033a 4607 MOV r7,r0
;;;543 if (pevent->OSEventGrp != 0) { /* See if any task pending on mailbox */
00033c 7aa0 LDRB r0,[r4,#0xa]
00033e b1e8 CBZ r0,|L1.892|
;;;544 if ((opt & OS_POST_OPT_BROADCAST) != 0x00) { /* Do we need to post msg to ALL waiting tasks ? */
000340 f016f016 TST r6,#1
000344 d009 BEQ |L1.858|
|L1.838|
000346 2300 MOVS r3,#0
000348 2202 MOVS r2,#2
00034a 4629 MOV r1,r5
00034c 4620 MOV r0,r4
00034e f7fff7ff BL OS_EventTaskRdy
;;;545 while (pevent->OSEventGrp != 0) { /* Yes, Post to ALL tasks waiting on mailbox */
000352 7aa0 LDRB r0,[r4,#0xa]
000354 2800 CMP r0,#0
000356 d1f6 BNE |L1.838|
000358 e005 B |L1.870|
|L1.858|
;;;546 (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
;;;547 }
;;;548 } else { /* No, Post to HPT waiting on mbox */
;;;549 (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
00035a 2300 MOVS r3,#0
00035c 2202 MOVS r2,#2
00035e 4629 MOV r1,r5
000360 4620 MOV r0,r4
000362 f7fff7ff BL OS_EventTaskRdy
|L1.870|
;;;550 }
;;;551 OS_EXIT_CRITICAL();
000366 4638 MOV r0,r7
000368 f7fff7ff BL OS_CPU_SR_Restore
;;;552 if ((opt & OS_POST_OPT_NO_SCHED) == 0) { /* See if scheduler needs to be invoked */
00036c f016f016 TST r6,#4
000370 d101 BNE |L1.886|
;;;553 OS_Sched(); /* Find HPT ready to run */
000372 f7fff7ff BL OS_Sched
|L1.886|
;;;554 }
;;;555 return (OS_ERR_NONE);
000376 2000 MOVS r0,#0
000378 e8bde8bd POP {r4-r8,pc}
|L1.892|
;;;556 }
;;;557 if (pevent->OSEventPtr != (void *)0) { /* Make sure mailbox doesn't already have a msg */
00037c 6860 LDR r0,[r4,#4]
00037e b128 CBZ r0,|L1.908|
;;;558 OS_EXIT_CRITICAL();
000380 4638 MOV r0,r7
000382 f7fff7ff BL OS_CPU_SR_Restore
;;;559 return (OS_ERR_MBOX_FULL);
000386 2014 MOVS r0,#0x14
000388 e8bde8bd POP {r4-r8,pc}
|L1.908|
;;;560 }
;;;561 pevent->OSEventPtr = pmsg; /* Place message in mailbox */
00038c 6065 STR r5,[r4,#4]
;;;562 OS_EXIT_CRITICAL();
00038e 4638 MOV r0,r7
000390 f7fff7ff BL OS_CPU_SR_Restore
;;;563 return (OS_ERR_NONE);
000394 2000 MOVS r0,#0
;;;564 }
000396 e8bde8bd POP {r4-r8,pc}
;;;565 #endif
ENDP
OSMboxQuery PROC
;;;587 INT8U OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *p_mbox_data)
;;;588 {
00039a b570 PUSH {r4-r6,lr}
00039c 4604 MOV r4,r0
00039e 460d MOV r5,r1
;;;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' */
0003a0 b90c CBNZ r4,|L1.934|
;;;605 return (OS_ERR_PEVENT_NULL);
0003a2 2004 MOVS r0,#4
;;;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 */
;;;612 return (OS_ERR_EVENT_TYPE);
;;;613 }
;;;614 OS_ENTER_CRITICAL();
;;;615 p_mbox_data->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */
;;;616 psrc = &pevent->OSEventTbl[0];
;;;617 pdest = &p_mbox_data->OSEventTbl[0];
;;;618 for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
;;;619 *pdest++ = *psrc++;
;;;620 }
;;;621 p_mbox_data->OSMsg = pevent->OSEventPtr; /* Get message from mailbox */
;;;622 OS_EXIT_CRITICAL();
;;;623 return (OS_ERR_NONE);
;;;624 }
0003a4 bd70 POP {r4-r6,pc}
|L1.934|
0003a6 b90d CBNZ r5,|L1.940|
0003a8 2009 MOVS r0,#9
0003aa bd70 POP {r4-r6,pc}
|L1.940|
0003ac 7820 LDRB r0,[r4,#0]
0003ae 2801 CMP r0,#1
0003b0 d001 BEQ |L1.950|
0003b2 2001 MOVS r0,#1
0003b4 bd70 POP {r4-r6,pc}
|L1.950|
0003b6 f7fff7ff BL OS_CPU_SR_Save
0003ba 7aa1 LDRB r1,[r4,#0xa]
0003bc 7229 STRB r1,[r5,#8]
0003be f104f104 ADD r2,r4,#0xb
0003c2 1d2b ADDS r3,r5,#4
0003c4 2100 MOVS r1,#0
|L1.966|
0003c6 f812f812 LDRB r12,[r2],#1
0003ca f803f803 STRB r12,[r3],#1
0003ce 1c49 ADDS r1,r1,#1
0003d0 b2c9 UXTB r1,r1
0003d2 2904 CMP r1,#4
0003d4 d3f7 BCC |L1.966|
0003d6 6861 LDR r1,[r4,#4]
0003d8 6029 STR r1,[r5,#0]
0003da f7fff7ff BL OS_CPU_SR_Restore
0003de 2000 MOVS r0,#0
0003e0 bd70 POP {r4-r6,pc}
;;;625 #endif /* OS_MBOX_QUERY_EN */
ENDP
0003e2 0000 DCW 0x0000
|L1.996|
0003e4 00000000 DCD OSIntNesting
|L1.1000|
0003e8 00000000 DCD OSEventFreeList
|L1.1004|
0003ec 00000000 DCD OSLockNesting
|L1.1008|
0003f0 00000000 DCD OSTCBCur
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -