os_mbox.txt
来自「针对STM32F103的UCOS移植」· 文本 代码 · 共 862 行 · 第 1/3 页
TXT
862 行
0002a8 4638 MOV r0,r7 ;422
0002aa f7fffffe BL OS_CPU_SR_Restore
0002ae 2000 MOVS r0,#0 ;423
0002b0 7030 STRB r0,[r6,#0] ;423
0002b2 e8bd81f0 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 ;465
0002c6 bd70 POP {r4-r6,pc}
|L1.712|
0002c8 7820 LDRB r0,[r4,#0] ;468
0002ca 2801 CMP r0,#1 ;468
0002cc d001 BEQ |L1.722|
0002ce 2001 MOVS r0,#1 ;469
0002d0 bd70 POP {r4-r6,pc}
|L1.722|
0002d2 f7fffffe BL OS_CPU_SR_Save
0002d6 4606 MOV r6,r0 ;471
0002d8 7aa0 LDRB r0,[r4,#0xa] ;472
0002da b160 CBZ r0,|L1.758|
0002dc 2300 MOVS r3,#0 ;474
0002de 2202 MOVS r2,#2 ;474
0002e0 4629 MOV r1,r5 ;474
0002e2 4620 MOV r0,r4 ;474
0002e4 f7fffffe BL OS_EventTaskRdy
0002e8 4630 MOV r0,r6 ;475
0002ea f7fffffe BL OS_CPU_SR_Restore
0002ee f7fffffe BL OS_Sched
0002f2 2000 MOVS r0,#0 ;477
0002f4 bd70 POP {r4-r6,pc}
|L1.758|
0002f6 6860 LDR r0,[r4,#4] ;479
0002f8 b120 CBZ r0,|L1.772|
0002fa 4630 MOV r0,r6 ;480
0002fc f7fffffe BL OS_CPU_SR_Restore
000300 2014 MOVS r0,#0x14 ;481
000302 bd70 POP {r4-r6,pc}
|L1.772|
000304 6065 STR r5,[r4,#4] ;483
000306 4630 MOV r0,r6 ;484
000308 f7fffffe BL OS_CPU_SR_Restore
00030c 2000 MOVS r0,#0 ;485
00030e bd70 POP {r4-r6,pc}
;;;487 #endif
ENDP
OSMboxPostOpt PROC
;;;523 INT8U OSMboxPostOpt (OS_EVENT *pevent, void *pmsg, INT8U opt)
;;;524 {
000310 e92d41f0 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
;;;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 */
;;;540 return (OS_ERR_EVENT_TYPE);
;;;541 }
;;;542 OS_ENTER_CRITICAL();
;;;543 if (pevent->OSEventGrp != 0) { /* See if any task pending on mailbox */
;;;544 if ((opt & OS_POST_OPT_BROADCAST) != 0x00) { /* Do we need to post msg to ALL waiting tasks ? */
;;;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);
;;;547 }
;;;548 } else { /* No, Post to HPT waiting on mbox */
;;;549 (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
;;;550 }
;;;551 OS_EXIT_CRITICAL();
;;;552 if ((opt & OS_POST_OPT_NO_SCHED) == 0) { /* See if scheduler needs to be invoked */
;;;553 OS_Sched(); /* Find HPT ready to run */
;;;554 }
;;;555 return (OS_ERR_NONE);
;;;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 }
00031e e8bd81f0 POP {r4-r8,pc}
|L1.802|
000322 b915 CBNZ r5,|L1.810|
000324 2003 MOVS r0,#3 ;536
000326 e8bd81f0 POP {r4-r8,pc}
|L1.810|
00032a 7820 LDRB r0,[r4,#0] ;539
00032c 2801 CMP r0,#1 ;539
00032e d002 BEQ |L1.822|
000330 2001 MOVS r0,#1 ;540
000332 e8bd81f0 POP {r4-r8,pc}
|L1.822|
000336 f7fffffe BL OS_CPU_SR_Save
00033a 4607 MOV r7,r0 ;542
00033c 7aa0 LDRB r0,[r4,#0xa] ;543
00033e b1e8 CBZ r0,|L1.892|
000340 f0160f01 TST r6,#1 ;544
000344 d009 BEQ |L1.858|
|L1.838|
000346 2300 MOVS r3,#0 ;546
000348 2202 MOVS r2,#2 ;546
00034a 4629 MOV r1,r5 ;546
00034c 4620 MOV r0,r4 ;546
00034e f7fffffe BL OS_EventTaskRdy
000352 7aa0 LDRB r0,[r4,#0xa] ;545
000354 2800 CMP r0,#0 ;545
000356 d1f6 BNE |L1.838|
000358 e005 B |L1.870|
|L1.858|
00035a 2300 MOVS r3,#0 ;549
00035c 2202 MOVS r2,#2 ;549
00035e 4629 MOV r1,r5 ;549
000360 4620 MOV r0,r4 ;549
000362 f7fffffe BL OS_EventTaskRdy
|L1.870|
000366 4638 MOV r0,r7 ;551
000368 f7fffffe BL OS_CPU_SR_Restore
00036c f0160f04 TST r6,#4 ;552
000370 d101 BNE |L1.886|
000372 f7fffffe BL OS_Sched
|L1.886|
000376 2000 MOVS r0,#0 ;555
000378 e8bd81f0 POP {r4-r8,pc}
|L1.892|
00037c 6860 LDR r0,[r4,#4] ;557
00037e b128 CBZ r0,|L1.908|
000380 4638 MOV r0,r7 ;558
000382 f7fffffe BL OS_CPU_SR_Restore
000386 2014 MOVS r0,#0x14 ;559
000388 e8bd81f0 POP {r4-r8,pc}
|L1.908|
00038c 6065 STR r5,[r4,#4] ;561
00038e 4638 MOV r0,r7 ;562
000390 f7fffffe BL OS_CPU_SR_Restore
000394 2000 MOVS r0,#0 ;563
000396 e8bd81f0 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 ;608
0003aa bd70 POP {r4-r6,pc}
|L1.940|
0003ac 7820 LDRB r0,[r4,#0] ;611
0003ae 2801 CMP r0,#1 ;611
0003b0 d001 BEQ |L1.950|
0003b2 2001 MOVS r0,#1 ;612
0003b4 bd70 POP {r4-r6,pc}
|L1.950|
0003b6 f7fffffe BL OS_CPU_SR_Save
0003ba 7aa1 LDRB r1,[r4,#0xa] ;615
0003bc 7229 STRB r1,[r5,#8] ;615
0003be f104020b ADD r2,r4,#0xb ;616
0003c2 1d2b ADDS r3,r5,#4 ;617
0003c4 2100 MOVS r1,#0 ;618
|L1.966|
0003c6 f812cb01 LDRB r12,[r2],#1 ;619
0003ca f803cb01 STRB r12,[r3],#1 ;619
0003ce 1c49 ADDS r1,r1,#1 ;618
0003d0 b2c9 UXTB r1,r1 ;618
0003d2 2904 CMP r1,#4 ;618
0003d4 d3f7 BCC |L1.966|
0003d6 6861 LDR r1,[r4,#4] ;621
0003d8 6029 STR r1,[r5,#0] ;621
0003da f7fffffe BL OS_CPU_SR_Restore
0003de 2000 MOVS r0,#0 ;623
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 + =
减小字号Ctrl + -
显示快捷键?