📄 os_sem.txt
字号:
0004dc 0a00000e BEQ |L1.1308|
0004e0 e3550001 CMP r5,#1
0004e4 1a00000e BNE |L1.1316|
0004e8 e1a00000 MOV r0,r0
0004ec ea000006 B |L1.1292|
|L1.1264|
0004f0 e3a03002 MOV r3,#2
0004f4 e3a02001 MOV r2,#1
0004f8 e3a01000 MOV r1,#0
0004fc e1a00004 MOV r0,r4
000500 ebfffffe BL OS_EventTaskRdy
000504 e2870001 ADD r0,r7,#1
000508 e20070ff AND r7,r0,#0xff
|L1.1292|
00050c e5d4000a LDRB r0,[r4,#0xa]
000510 e3500000 CMP r0,#0
000514 1afffff5 BNE |L1.1264|
000518 ea000009 B |L1.1348|
|L1.1308|
00051c e1a00000 MOV r0,r0
000520 e1a00000 MOV r0,r0
|L1.1316|
000524 e3a03002 MOV r3,#2
000528 e3a02001 MOV r2,#1
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
000540 e1a00000 MOV r0,r0
|L1.1348|
000544 e1a00000 MOV r0,r0
000548 e1a00008 MOV r0,r8
00054c ebfffffe BL OS_CPU_SR_Restore
000550 ebfffffe BL OS_Sched
000554 e3a0000e MOV r0,#0xe
000558 e5c60000 STRB r0,[r6,#0]
00055c e1a00007 MOV r0,r7
000560 eaffffc7 B |L1.1156|
|L1.1380|
000564 e1a00008 MOV r0,r8
000568 ebfffffe BL OS_CPU_SR_Restore
00056c e3a00000 MOV r0,#0
000570 e5c60000 STRB r0,[r6,#0]
000574 eaffffc2 B |L1.1156|
ENDP
OSSemPost PROC
;;;451 INT8U OSSemPost (OS_EVENT *pevent)
;;;452 {
000578 e92d4070 PUSH {r4-r6,lr}
00057c e1a04000 MOV r4,r0
;;;453 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;454 OS_CPU_SR cpu_sr = 0;
000580 e3a05000 MOV r5,#0
;;;455 #endif
;;;456
;;;457
;;;458
;;;459 #if OS_ARG_CHK_EN > 0
;;;460 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
000584 e3540000 CMP r4,#0
000588 1a000002 BNE |L1.1432|
;;;461 return (OS_ERR_PEVENT_NULL);
00058c e3a00004 MOV r0,#4
|L1.1424|
000590 e8bd4070 POP {r4-r6,lr}
;;;462 }
;;;463 #endif
;;;464 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
;;;465 return (OS_ERR_EVENT_TYPE);
;;;466 }
;;;467 OS_ENTER_CRITICAL();
;;;468 if (pevent->OSEventGrp != 0) { /* See if any task waiting for semaphore */
;;;469 /* Ready HPT waiting on event */
;;;470 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_OK);
;;;471 OS_EXIT_CRITICAL();
;;;472 OS_Sched(); /* Find HPT ready to run */
;;;473 return (OS_ERR_NONE);
;;;474 }
;;;475 if (pevent->OSEventCnt < 65535u) { /* Make sure semaphore will not overflow */
;;;476 pevent->OSEventCnt++; /* Increment semaphore count to register event */
;;;477 OS_EXIT_CRITICAL();
;;;478 return (OS_ERR_NONE);
;;;479 }
;;;480 OS_EXIT_CRITICAL(); /* Semaphore value has reached its maximum */
;;;481 return (OS_ERR_SEM_OVF);
;;;482 }
000594 e12fff1e BX lr
|L1.1432|
000598 e5d40000 LDRB r0,[r4,#0]
00059c e3500003 CMP r0,#3
0005a0 0a000001 BEQ |L1.1452|
0005a4 e3a00001 MOV r0,#1
0005a8 eafffff8 B |L1.1424|
|L1.1452|
0005ac ebfffffe BL OS_CPU_SR_Save
0005b0 e1a05000 MOV r5,r0
0005b4 e5d4000a LDRB r0,[r4,#0xa]
0005b8 e3500000 CMP r0,#0
0005bc 0a000009 BEQ |L1.1512|
0005c0 e3a03000 MOV r3,#0
0005c4 e3a02001 MOV r2,#1
0005c8 e1a01003 MOV r1,r3
0005cc e1a00004 MOV r0,r4
0005d0 ebfffffe BL OS_EventTaskRdy
0005d4 e1a00005 MOV r0,r5
0005d8 ebfffffe BL OS_CPU_SR_Restore
0005dc ebfffffe BL OS_Sched
0005e0 e3a00000 MOV r0,#0
0005e4 eaffffe9 B |L1.1424|
|L1.1512|
0005e8 e1d400b8 LDRH r0,[r4,#8]
0005ec e59f1178 LDR r1,|L1.1900|
0005f0 e1500001 CMP r0,r1
0005f4 2a000007 BCS |L1.1560|
0005f8 e1d400b8 LDRH r0,[r4,#8]
0005fc e2800001 ADD r0,r0,#1
000600 e3c00801 BIC r0,r0,#0x10000
000604 e1c400b8 STRH r0,[r4,#8]
000608 e1a00005 MOV r0,r5
00060c ebfffffe BL OS_CPU_SR_Restore
000610 e3a00000 MOV r0,#0
000614 eaffffdd B |L1.1424|
|L1.1560|
000618 e1a00005 MOV r0,r5
00061c ebfffffe BL OS_CPU_SR_Restore
000620 e3a00032 MOV r0,#0x32
000624 eaffffd9 B |L1.1424|
ENDP
OSSemQuery PROC
;;;505 INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *p_sem_data)
;;;506 {
000628 e92d47f0 PUSH {r4-r10,lr}
00062c e1a04000 MOV r4,r0
000630 e1a05001 MOV r5,r1
;;;507 #if OS_LOWEST_PRIO <= 63
;;;508 INT8U *psrc;
;;;509 INT8U *pdest;
;;;510 #else
;;;511 INT16U *psrc;
;;;512 INT16U *pdest;
;;;513 #endif
;;;514 INT8U i;
;;;515 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;516 OS_CPU_SR cpu_sr = 0;
000634 e3a09000 MOV r9,#0
;;;517 #endif
;;;518
;;;519
;;;520
;;;521 #if OS_ARG_CHK_EN > 0
;;;522 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
000638 e3540000 CMP r4,#0
00063c 1a000002 BNE |L1.1612|
;;;523 return (OS_ERR_PEVENT_NULL);
000640 e3a00004 MOV r0,#4
|L1.1604|
000644 e8bd47f0 POP {r4-r10,lr}
;;;524 }
;;;525 if (p_sem_data == (OS_SEM_DATA *)0) { /* Validate 'p_sem_data' */
;;;526 return (OS_ERR_PDATA_NULL);
;;;527 }
;;;528 #endif
;;;529 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
;;;530 return (OS_ERR_EVENT_TYPE);
;;;531 }
;;;532 OS_ENTER_CRITICAL();
;;;533 p_sem_data->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */
;;;534 psrc = &pevent->OSEventTbl[0];
;;;535 pdest = &p_sem_data->OSEventTbl[0];
;;;536 for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
;;;537 *pdest++ = *psrc++;
;;;538 }
;;;539 p_sem_data->OSCnt = pevent->OSEventCnt; /* Get semaphore count */
;;;540 OS_EXIT_CRITICAL();
;;;541 return (OS_ERR_NONE);
;;;542 }
000648 e12fff1e BX lr
|L1.1612|
00064c e3550000 CMP r5,#0
000650 1a000001 BNE |L1.1628|
000654 e3a00009 MOV r0,#9
000658 eafffff9 B |L1.1604|
|L1.1628|
00065c e5d40000 LDRB r0,[r4,#0]
000660 e3500003 CMP r0,#3
000664 0a000001 BEQ |L1.1648|
000668 e3a00001 MOV r0,#1
00066c eafffff4 B |L1.1604|
|L1.1648|
000670 ebfffffe BL OS_CPU_SR_Save
000674 e1a09000 MOV r9,r0
000678 e5d4000a LDRB r0,[r4,#0xa]
00067c e5c50006 STRB r0,[r5,#6]
000680 e284600b ADD r6,r4,#0xb
000684 e2857002 ADD r7,r5,#2
000688 e3a08000 MOV r8,#0
00068c ea000003 B |L1.1696|
|L1.1680|
000690 e4d60001 LDRB r0,[r6],#1
000694 e4c70001 STRB r0,[r7],#1
000698 e2880001 ADD r0,r8,#1
00069c e20080ff AND r8,r0,#0xff
|L1.1696|
0006a0 e3580004 CMP r8,#4
0006a4 bafffff9 BLT |L1.1680|
0006a8 e1d400b8 LDRH r0,[r4,#8]
0006ac e1c500b0 STRH r0,[r5,#0]
0006b0 e1a00009 MOV r0,r9
0006b4 ebfffffe BL OS_CPU_SR_Restore
0006b8 e3a00000 MOV r0,#0
0006bc eaffffe0 B |L1.1604|
ENDP
OSSemSet PROC
;;;571 void OSSemSet (OS_EVENT *pevent, INT16U cnt, INT8U *err)
;;;572 {
0006c0 e92d41f0 PUSH {r4-r8,lr}
0006c4 e1a04000 MOV r4,r0
0006c8 e1a05001 MOV r5,r1
0006cc e1a06002 MOV r6,r2
;;;573 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;574 OS_CPU_SR cpu_sr = 0;
0006d0 e3a07000 MOV r7,#0
;;;575 #endif
;;;576
;;;577
;;;578
;;;579 #if OS_ARG_CHK_EN > 0
;;;580 if (err == (INT8U *)0) { /* Validate 'err' */
0006d4 e3560000 CMP r6,#0
0006d8 1a000001 BNE |L1.1764|
|L1.1756|
;;;581 return;
;;;582 }
;;;583 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;584 *err = OS_ERR_PEVENT_NULL;
;;;585 return;
;;;586 }
;;;587 #endif
;;;588 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
;;;589 *err = OS_ERR_EVENT_TYPE;
;;;590 return;
;;;591 }
;;;592 OS_ENTER_CRITICAL();
;;;593 *err = OS_ERR_NONE;
;;;594 if (pevent->OSEventCnt > 0) { /* See if semaphore already has a count */
;;;595 pevent->OSEventCnt = cnt; /* Yes, set it to the new value specified. */
;;;596 } else { /* No */
;;;597 if (pevent->OSEventGrp == 0) { /* See if task(s) waiting? */
;;;598 pevent->OSEventCnt = cnt; /* No, OK to set the value */
;;;599 } else {
;;;600 *err = OS_ERR_TASK_WAITING;
;;;601 }
;;;602 }
;;;603 OS_EXIT_CRITICAL();
;;;604 }
0006dc e8bd41f0 POP {r4-r8,lr}
0006e0 e12fff1e BX lr
|L1.1764|
0006e4 e3540000 CMP r4,#0
0006e8 1a000002 BNE |L1.1784|
0006ec e3a00004 MOV r0,#4
0006f0 e5c60000 STRB r0,[r6,#0]
0006f4 eafffff8 B |L1.1756|
|L1.1784|
0006f8 e5d40000 LDRB r0,[r4,#0]
0006fc e3500003 CMP r0,#3
000700 0a000002 BEQ |L1.1808|
000704 e3a00001 MOV r0,#1
000708 e5c60000 STRB r0,[r6,#0]
00070c eafffff2 B |L1.1756|
|L1.1808|
000710 ebfffffe BL OS_CPU_SR_Save
000714 e1a07000 MOV r7,r0
000718 e3a00000 MOV r0,#0
00071c e5c60000 STRB r0,[r6,#0]
000720 e1d400b8 LDRH r0,[r4,#8]
000724 e3500000 CMP r0,#0
000728 da000001 BLE |L1.1844|
00072c e1c450b8 STRH r5,[r4,#8]
000730 ea000006 B |L1.1872|
|L1.1844|
000734 e5d4000a LDRB r0,[r4,#0xa]
000738 e3500000 CMP r0,#0
00073c 1a000001 BNE |L1.1864|
000740 e1c450b8 STRH r5,[r4,#8]
000744 ea000001 B |L1.1872|
|L1.1864|
000748 e3a00049 MOV r0,#0x49
00074c e5c60000 STRB r0,[r6,#0]
|L1.1872|
000750 e1a00007 MOV r0,r7
000754 ebfffffe BL OS_CPU_SR_Restore
000758 eaffffdf B |L1.1756|
ENDP
|L1.1884|
00075c 00000000 DCD OSIntNesting
|L1.1888|
000760 00000000 DCD OSEventFreeList
|L1.1892|
000764 00000000 DCD OSLockNesting
|L1.1896|
000768 00000000 DCD OSTCBCur
|L1.1900|
00076c 0000ffff DCD 0x0000ffff
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -