📄 os_sem.txt
字号:
000330 1afffff5 BNE |L1.780|
000334 ea000005 B |L1.848|
|L1.824|
000338 e3a03002 MOV r3,#2 ;417
00033c e3a02001 MOV r2,#1 ;417
000340 e3a01000 MOV r1,#0 ;417
000344 e1a00005 MOV r0,r5 ;417
000348 ebfffffe BL OS_EventTaskRdy
00034c e3a04001 MOV r4,#1 ;418
|L1.848|
000350 e1a00007 MOV r0,r7 ;421
000354 ebfffffe BL OS_CPU_SR_Restore
000358 ebfffffe BL OS_Sched
00035c e3a0000e MOV r0,#0xe ;423
000360 e5c60000 STRB r0,[r6,#0] ;423
000364 e1a00004 MOV r0,r4 ;424
000368 eaffffdd B |L1.740|
|L1.876|
00036c e1a00007 MOV r0,r7 ;426
000370 ebfffffe BL OS_CPU_SR_Restore
000374 e3a00000 MOV r0,#0 ;427
000378 eaffffd7 B |L1.732|
;;;430 #endif
ENDP
OSSemPost PROC
;;;451 INT8U OSSemPost (OS_EVENT *pevent)
;;;452 {
00037c e92d4070 PUSH {r4-r6,lr}
000380 e1a04000 MOV r4,r0
;;;453 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;454 OS_CPU_SR cpu_sr = 0;
;;;455 #endif
;;;456
;;;457
;;;458
;;;459 #if OS_ARG_CHK_EN > 0
;;;460 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;461 return (OS_ERR_PEVENT_NULL);
;;;462 }
;;;463 #endif
;;;464 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
000384 e5d00000 LDRB r0,[r0,#0]
000388 e3500003 CMP r0,#3
;;;465 return (OS_ERR_EVENT_TYPE);
00038c 13a00001 MOVNE r0,#1
000390 1a000016 BNE |L1.1008|
;;;466 }
;;;467 OS_ENTER_CRITICAL();
000394 ebfffffe BL OS_CPU_SR_Save
000398 e1a05000 MOV r5,r0
;;;468 if (pevent->OSEventGrp != 0) { /* See if any task waiting for semaphore */
00039c e5d4000a LDRB r0,[r4,#0xa]
0003a0 e3500000 CMP r0,#0
0003a4 0a000008 BEQ |L1.972|
;;;469 /* Ready HPT waiting on event */
;;;470 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_OK);
0003a8 e3a03000 MOV r3,#0
0003ac e3a02001 MOV r2,#1
0003b0 e1a01003 MOV r1,r3
0003b4 e1a00004 MOV r0,r4
0003b8 ebfffffe BL OS_EventTaskRdy
;;;471 OS_EXIT_CRITICAL();
0003bc e1a00005 MOV r0,r5
0003c0 ebfffffe BL OS_CPU_SR_Restore
;;;472 OS_Sched(); /* Find HPT ready to run */
0003c4 ebfffffe BL OS_Sched
;;;473 return (OS_ERR_NONE);
0003c8 ea000007 B |L1.1004|
|L1.972|
;;;474 }
;;;475 if (pevent->OSEventCnt < 65535u) { /* Make sure semaphore will not overflow */
0003cc e1d410b8 LDRH r1,[r4,#8]
0003d0 e59f0108 LDR r0,|L1.1248|
0003d4 e1510000 CMP r1,r0
0003d8 2a000006 BCS |L1.1016|
;;;476 pevent->OSEventCnt++; /* Increment semaphore count to register event */
0003dc e2810001 ADD r0,r1,#1
0003e0 e1c400b8 STRH r0,[r4,#8]
;;;477 OS_EXIT_CRITICAL();
0003e4 e1a00005 MOV r0,r5
0003e8 ebfffffe BL OS_CPU_SR_Restore
|L1.1004|
;;;478 return (OS_ERR_NONE);
0003ec e3a00000 MOV r0,#0
|L1.1008|
0003f0 e8bd4070 POP {r4-r6,lr}
;;;479 }
;;;480 OS_EXIT_CRITICAL(); /* Semaphore value has reached its maximum */
;;;481 return (OS_ERR_SEM_OVF);
;;;482 }
0003f4 e12fff1e BX lr
|L1.1016|
0003f8 e1a00005 MOV r0,r5 ;480
0003fc ebfffffe BL OS_CPU_SR_Restore
000400 e3a00032 MOV r0,#0x32 ;481
000404 eafffff9 B |L1.1008|
;;;483
ENDP
OSSemQuery PROC
;;;505 INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *p_sem_data)
;;;506 {
000408 e92d4070 PUSH {r4-r6,lr}
00040c e1a04000 MOV r4,r0
;;;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;
;;;517 #endif
;;;518
;;;519
;;;520
;;;521 #if OS_ARG_CHK_EN > 0
;;;522 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;523 return (OS_ERR_PEVENT_NULL);
;;;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 */
000410 e5d00000 LDRB r0,[r0,#0]
000414 e1a05001 MOV r5,r1 ;506
000418 e3500003 CMP r0,#3
;;;530 return (OS_ERR_EVENT_TYPE);
00041c 13a00001 MOVNE r0,#1
000420 1a00000f BNE |L1.1124|
;;;531 }
;;;532 OS_ENTER_CRITICAL();
000424 ebfffffe BL OS_CPU_SR_Save
;;;533 p_sem_data->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */
000428 e5d4100a LDRB r1,[r4,#0xa]
;;;534 psrc = &pevent->OSEventTbl[0];
;;;535 pdest = &p_sem_data->OSEventTbl[0];
00042c e2852002 ADD r2,r5,#2
;;;536 for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
000430 e3a03000 MOV r3,#0
000434 e5c51006 STRB r1,[r5,#6] ;533
000438 e284100b ADD r1,r4,#0xb ;534
|L1.1084|
;;;537 *pdest++ = *psrc++;
00043c e4d1c001 LDRB r12,[r1],#1
000440 e2833001 ADD r3,r3,#1 ;536
000444 e20330ff AND r3,r3,#0xff ;536
000448 e3530004 CMP r3,#4 ;536
00044c e4c2c001 STRB r12,[r2],#1
000450 3afffff9 BCC |L1.1084|
;;;538 }
;;;539 p_sem_data->OSCnt = pevent->OSEventCnt; /* Get semaphore count */
000454 e1d410b8 LDRH r1,[r4,#8]
000458 e1c510b0 STRH r1,[r5,#0]
;;;540 OS_EXIT_CRITICAL();
00045c ebfffffe BL OS_CPU_SR_Restore
;;;541 return (OS_ERR_NONE);
000460 e3a00000 MOV r0,#0
|L1.1124|
000464 e8bd4070 POP {r4-r6,lr}
;;;542 }
000468 e12fff1e BX lr
;;;543 #endif /* OS_SEM_QUERY_EN */
ENDP
OSSemSet PROC
;;;571 void OSSemSet (OS_EVENT *pevent, INT16U cnt, INT8U *perr)
;;;572 {
00046c e92d4070 PUSH {r4-r6,lr}
000470 e1a04000 MOV r4,r0
;;;573 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;574 OS_CPU_SR cpu_sr = 0;
;;;575 #endif
;;;576
;;;577
;;;578
;;;579 #if OS_ARG_CHK_EN > 0
;;;580 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;581 return;
;;;582 }
;;;583 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;584 *perr = OS_ERR_PEVENT_NULL;
;;;585 return;
;;;586 }
;;;587 #endif
;;;588 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
000474 e5d00000 LDRB r0,[r0,#0]
000478 e1a05002 MOV r5,r2 ;572
00047c e1a06001 MOV r6,r1 ;572
000480 e3500003 CMP r0,#3
;;;589 *perr = OS_ERR_EVENT_TYPE;
000484 13a00001 MOVNE r0,#1
000488 15c50000 STRBNE r0,[r5,#0]
;;;590 return;
00048c 1a00000d BNE |L1.1224|
;;;591 }
;;;592 OS_ENTER_CRITICAL();
000490 ebfffffe BL OS_CPU_SR_Save
;;;593 *perr = OS_ERR_NONE;
000494 e3a01000 MOV r1,#0
000498 e5c51000 STRB r1,[r5,#0]
;;;594 if (pevent->OSEventCnt > 0) { /* See if semaphore already has a count */
00049c e1d410b8 LDRH r1,[r4,#8]
0004a0 e3510000 CMP r1,#0
0004a4 1a000004 BNE |L1.1212|
;;;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? */
0004a8 e5d4100a LDRB r1,[r4,#0xa]
0004ac e3510000 CMP r1,#0
;;;598 pevent->OSEventCnt = cnt; /* No, OK to set the value */
;;;599 } else {
;;;600 *perr = OS_ERR_TASK_WAITING;
0004b0 13a01049 MOVNE r1,#0x49
0004b4 15c51000 STRBNE r1,[r5,#0]
0004b8 1a000000 BNE |L1.1216|
|L1.1212|
0004bc e1c460b8 STRH r6,[r4,#8] ;598
|L1.1216|
;;;601 }
;;;602 }
;;;603 OS_EXIT_CRITICAL();
0004c0 e8bd4070 POP {r4-r6,lr}
0004c4 eafffffe B OS_CPU_SR_Restore
|L1.1224|
;;;604 }
0004c8 e8bd4070 POP {r4-r6,lr}
0004cc e12fff1e BX lr
;;;605 #endif
ENDP
|L1.1232|
0004d0 00000000 DCD OSIntNesting
|L1.1236|
0004d4 00000000 DCD OSEventFreeList
|L1.1240|
0004d8 00000000 DCD OSLockNesting
|L1.1244|
0004dc 00000000 DCD OSTCBCur
|L1.1248|
0004e0 0000ffff DCD 0x0000ffff
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -