📄 os_sem.txt
字号:
000218 2302 MOVS r3,#2 ;412
00021a 2201 MOVS r2,#1 ;412
00021c 2100 MOVS r1,#0 ;412
00021e 4628 MOV r0,r5 ;412
000220 f7fff7ff BL OS_EventTaskRdy
000224 1c64 ADDS r4,r4,#1 ;413
000226 b2e4 UXTB r4,r4 ;413
|L1.552|
000228 7aa8 LDRB r0,[r5,#0xa] ;411
00022a 2800 CMP r0,#0 ;411
00022c d1f4 BNE |L1.536|
00022e e006 B |L1.574|
|L1.560|
000230 2302 MOVS r3,#2 ;419
000232 2201 MOVS r2,#1 ;419
000234 2100 MOVS r1,#0 ;419
000236 4628 MOV r0,r5 ;419
000238 f7fff7ff BL OS_EventTaskRdy
00023c 2401 MOVS r4,#1 ;420
|L1.574|
00023e 4638 MOV r0,r7 ;423
000240 f7fff7ff BL OS_CPU_SR_Restore
000244 f7fff7ff BL OS_Sched
000248 200e MOVS r0,#0xe ;425
00024a 7030 STRB r0,[r6,#0] ;425
00024c 4620 MOV r0,r4 ;426
00024e e7d7 B |L1.512|
|L1.592|
000250 4638 MOV r0,r7 ;428
000252 f7fff7ff BL OS_CPU_SR_Restore
000256 2000 MOVS r0,#0 ;429
000258 7030 STRB r0,[r6,#0] ;429
00025a e7d1 B |L1.512|
;;;432 #endif
ENDP
OSSemPost PROC
;;;453 INT8U OSSemPost (OS_EVENT *pevent)
;;;454 {
00025c b570 PUSH {r4-r6,lr}
00025e 4604 MOV r4,r0
;;;455 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;456 OS_CPU_SR cpu_sr = 0;
;;;457 #endif
;;;458
;;;459
;;;460
;;;461 #if OS_ARG_CHK_EN > 0
;;;462 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;463 return (OS_ERR_PEVENT_NULL);
;;;464 }
;;;465 #endif
;;;466 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
000260 7820 LDRB r0,[r4,#0]
000262 2803 CMP r0,#3
000264 d001 BEQ |L1.618|
;;;467 return (OS_ERR_EVENT_TYPE);
000266 2001 MOVS r0,#1
;;;468 }
;;;469 OS_ENTER_CRITICAL();
;;;470 if (pevent->OSEventGrp != 0) { /* See if any task waiting for semaphore */
;;;471 /* Ready HPT waiting on event */
;;;472 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_OK);
;;;473 OS_EXIT_CRITICAL();
;;;474 OS_Sched(); /* Find HPT ready to run */
;;;475 return (OS_ERR_NONE);
;;;476 }
;;;477 if (pevent->OSEventCnt < 65535u) { /* Make sure semaphore will not overflow */
;;;478 pevent->OSEventCnt++; /* Increment semaphore count to register event */
;;;479 OS_EXIT_CRITICAL();
;;;480 return (OS_ERR_NONE);
;;;481 }
;;;482 OS_EXIT_CRITICAL(); /* Semaphore value has reached its maximum */
;;;483 return (OS_ERR_SEM_OVF);
;;;484 }
000268 bd70 POP {r4-r6,pc}
|L1.618|
00026a f7fff7ff BL OS_CPU_SR_Save
00026e 4605 MOV r5,r0 ;469
000270 7aa0 LDRB r0,[r4,#0xa] ;470
000272 b160 CBZ r0,|L1.654|
000274 2300 MOVS r3,#0 ;472
000276 2201 MOVS r2,#1 ;472
000278 4619 MOV r1,r3 ;472
00027a 4620 MOV r0,r4 ;472
00027c f7fff7ff BL OS_EventTaskRdy
000280 4628 MOV r0,r5 ;473
000282 f7fff7ff BL OS_CPU_SR_Restore
000286 f7fff7ff BL OS_Sched
00028a 2000 MOVS r0,#0 ;475
00028c bd70 POP {r4-r6,pc}
|L1.654|
00028e 8921 LDRH r1,[r4,#8] ;477
000290 f64ff64f MOV r0,#0xffff ;477
000294 4281 CMP r1,r0 ;477
000296 d206 BCS |L1.678|
000298 1c49 ADDS r1,r1,#1 ;478
00029a 8121 STRH r1,[r4,#8] ;478
00029c 4628 MOV r0,r5 ;479
00029e f7fff7ff BL OS_CPU_SR_Restore
0002a2 2000 MOVS r0,#0 ;480
0002a4 bd70 POP {r4-r6,pc}
|L1.678|
0002a6 4628 MOV r0,r5 ;482
0002a8 f7fff7ff BL OS_CPU_SR_Restore
0002ac 2032 MOVS r0,#0x32 ;483
0002ae bd70 POP {r4-r6,pc}
;;;485
ENDP
OSSemQuery PROC
;;;507 INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *p_sem_data)
;;;508 {
0002b0 b570 PUSH {r4-r6,lr}
0002b2 4605 MOV r5,r0
0002b4 460e MOV r6,r1
;;;509 #if OS_LOWEST_PRIO <= 63
;;;510 INT8U *psrc;
;;;511 INT8U *pdest;
;;;512 #else
;;;513 INT16U *psrc;
;;;514 INT16U *pdest;
;;;515 #endif
;;;516 INT8U i;
;;;517 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;518 OS_CPU_SR cpu_sr = 0;
;;;519 #endif
;;;520
;;;521
;;;522
;;;523 #if OS_ARG_CHK_EN > 0
;;;524 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;525 return (OS_ERR_PEVENT_NULL);
;;;526 }
;;;527 if (p_sem_data == (OS_SEM_DATA *)0) { /* Validate 'p_sem_data' */
;;;528 return (OS_ERR_PDATA_NULL);
;;;529 }
;;;530 #endif
;;;531 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
0002b6 7828 LDRB r0,[r5,#0]
0002b8 2803 CMP r0,#3
0002ba d001 BEQ |L1.704|
;;;532 return (OS_ERR_EVENT_TYPE);
0002bc 2001 MOVS r0,#1
;;;533 }
;;;534 OS_ENTER_CRITICAL();
;;;535 p_sem_data->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */
;;;536 psrc = &pevent->OSEventTbl[0];
;;;537 pdest = &p_sem_data->OSEventTbl[0];
;;;538 for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
;;;539 *pdest++ = *psrc++;
;;;540 }
;;;541 p_sem_data->OSCnt = pevent->OSEventCnt; /* Get semaphore count */
;;;542 OS_EXIT_CRITICAL();
;;;543 return (OS_ERR_NONE);
;;;544 }
0002be bd70 POP {r4-r6,pc}
|L1.704|
0002c0 f7fff7ff BL OS_CPU_SR_Save
0002c4 7aa9 LDRB r1,[r5,#0xa] ;535
0002c6 71b1 STRB r1,[r6,#6] ;535
0002c8 f105f105 ADD r4,r5,#0xb ;536
0002cc 1cb1 ADDS r1,r6,#2 ;537
0002ce 2200 MOVS r2,#0 ;538
|L1.720|
0002d0 f814f814 LDRB r3,[r4],#1 ;539
0002d4 f801f801 STRB r3,[r1],#1 ;539
0002d8 1c52 ADDS r2,r2,#1 ;538
0002da b2d2 UXTB r2,r2 ;538
0002dc 2a04 CMP r2,#4 ;538
0002de d3f7 BCC |L1.720|
0002e0 8929 LDRH r1,[r5,#8] ;541
0002e2 8031 STRH r1,[r6,#0] ;541
0002e4 f7fff7ff BL OS_CPU_SR_Restore
0002e8 2000 MOVS r0,#0 ;543
0002ea bd70 POP {r4-r6,pc}
;;;545 #endif /* OS_SEM_QUERY_EN */
ENDP
OSSemSet PROC
;;;573 void OSSemSet (OS_EVENT *pevent, INT16U cnt, INT8U *perr)
;;;574 {
0002ec b570 PUSH {r4-r6,lr}
0002ee 4604 MOV r4,r0
0002f0 460e MOV r6,r1
0002f2 4615 MOV r5,r2
;;;575 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;576 OS_CPU_SR cpu_sr = 0;
;;;577 #endif
;;;578
;;;579
;;;580
;;;581 #if OS_ARG_CHK_EN > 0
;;;582 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;583 return;
;;;584 }
;;;585 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;586 *perr = OS_ERR_PEVENT_NULL;
;;;587 return;
;;;588 }
;;;589 #endif
;;;590 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
0002f4 7820 LDRB r0,[r4,#0]
0002f6 2803 CMP r0,#3
0002f8 d002 BEQ |L1.768|
;;;591 *perr = OS_ERR_EVENT_TYPE;
0002fa 2001 MOVS r0,#1
0002fc 7028 STRB r0,[r5,#0]
;;;592 return;
;;;593 }
;;;594 OS_ENTER_CRITICAL();
;;;595 *perr = OS_ERR_NONE;
;;;596 if (pevent->OSEventCnt > 0) { /* See if semaphore already has a count */
;;;597 pevent->OSEventCnt = cnt; /* Yes, set it to the new value specified. */
;;;598 } else { /* No */
;;;599 if (pevent->OSEventGrp == 0) { /* See if task(s) waiting? */
;;;600 pevent->OSEventCnt = cnt; /* No, OK to set the value */
;;;601 } else {
;;;602 *perr = OS_ERR_TASK_WAITING;
;;;603 }
;;;604 }
;;;605 OS_EXIT_CRITICAL();
;;;606 }
0002fe bd70 POP {r4-r6,pc}
|L1.768|
000300 f7fff7ff BL OS_CPU_SR_Save
000304 2100 MOVS r1,#0 ;595
000306 7029 STRB r1,[r5,#0] ;595
000308 8921 LDRH r1,[r4,#8] ;596
00030a b109 CBZ r1,|L1.784|
00030c 8126 STRH r6,[r4,#8] ;597
00030e e005 B |L1.796|
|L1.784|
000310 7aa1 LDRB r1,[r4,#0xa] ;599
000312 b909 CBNZ r1,|L1.792|
000314 8126 STRH r6,[r4,#8] ;600
000316 e001 B |L1.796|
|L1.792|
000318 2149 MOVS r1,#0x49 ;602
00031a 7029 STRB r1,[r5,#0] ;602
|L1.796|
00031c e8bde8bd POP {r4-r6,lr} ;605
000320 f7fff7ff B.W OS_CPU_SR_Restore
;;;607 #endif
ENDP
|L1.804|
000324 00000000 DCD OSIntNesting
|L1.808|
000328 00000000 DCD OSEventFreeList
|L1.812|
00032c 00000000 DCD OSLockNesting
|L1.816|
000330 00000000 DCD OSTCBCur
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -