?? os_sem.txt
字號:
;;;418 nbr_tasks++;
00027e 2401 MOVS r4,#1
|L1.640|
;;;419 break;
;;;420 }
;;;421 OS_EXIT_CRITICAL();
000280 4638 MOV r0,r7
000282 f7fff7ff BL OS_CPU_SR_Restore
;;;422 OS_Sched(); /* Find HPT ready to run */
000286 f7fff7ff BL OS_Sched
;;;423 *perr = OS_ERR_PEND_ABORT;
00028a 200e MOVS r0,#0xe
00028c 7030 STRB r0,[r6,#0]
;;;424 return (nbr_tasks);
00028e 4620 MOV r0,r4
000290 e8bde8bd POP {r4-r8,pc}
|L1.660|
;;;425 }
;;;426 OS_EXIT_CRITICAL();
000294 4638 MOV r0,r7
000296 f7fff7ff BL OS_CPU_SR_Restore
;;;427 *perr = OS_ERR_NONE;
00029a 2000 MOVS r0,#0
00029c 7030 STRB r0,[r6,#0]
;;;428 return (0); /* No tasks waiting on semaphore */
;;;429 }
00029e e8bde8bd POP {r4-r8,pc}
;;;430 #endif
ENDP
OSSemPost PROC
;;;451 INT8U OSSemPost (OS_EVENT *pevent)
;;;452 {
0002a2 b570 PUSH {r4-r6,lr}
0002a4 4604 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' */
0002a6 b90c CBNZ r4,|L1.684|
;;;461 return (OS_ERR_PEVENT_NULL);
0002a8 2004 MOVS r0,#4
;;;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 }
0002aa bd70 POP {r4-r6,pc}
|L1.684|
0002ac 7820 LDRB r0,[r4,#0]
0002ae 2803 CMP r0,#3
0002b0 d001 BEQ |L1.694|
0002b2 2001 MOVS r0,#1
0002b4 bd70 POP {r4-r6,pc}
|L1.694|
0002b6 f7fff7ff BL OS_CPU_SR_Save
0002ba 4605 MOV r5,r0
0002bc 7aa0 LDRB r0,[r4,#0xa]
0002be b160 CBZ r0,|L1.730|
0002c0 2300 MOVS r3,#0
0002c2 2201 MOVS r2,#1
0002c4 4619 MOV r1,r3
0002c6 4620 MOV r0,r4
0002c8 f7fff7ff BL OS_EventTaskRdy
0002cc 4628 MOV r0,r5
0002ce f7fff7ff BL OS_CPU_SR_Restore
0002d2 f7fff7ff BL OS_Sched
0002d6 2000 MOVS r0,#0
0002d8 bd70 POP {r4-r6,pc}
|L1.730|
0002da 8920 LDRH r0,[r4,#8]
0002dc f64ff64f MOV r1,#0xffff
0002e0 4288 CMP r0,r1
0002e2 d206 BCS |L1.754|
0002e4 1c40 ADDS r0,r0,#1
0002e6 8120 STRH r0,[r4,#8]
0002e8 4628 MOV r0,r5
0002ea f7fff7ff BL OS_CPU_SR_Restore
0002ee 2000 MOVS r0,#0
0002f0 bd70 POP {r4-r6,pc}
|L1.754|
0002f2 4628 MOV r0,r5
0002f4 f7fff7ff BL OS_CPU_SR_Restore
0002f8 2032 MOVS r0,#0x32
0002fa bd70 POP {r4-r6,pc}
;;;483
ENDP
OSSemQuery PROC
;;;505 INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *p_sem_data)
;;;506 {
0002fc b570 PUSH {r4-r6,lr}
0002fe 4604 MOV r4,r0
000300 460d 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;
;;;517 #endif
;;;518
;;;519
;;;520
;;;521 #if OS_ARG_CHK_EN > 0
;;;522 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
000302 b90c CBNZ r4,|L1.776|
;;;523 return (OS_ERR_PEVENT_NULL);
000304 2004 MOVS r0,#4
;;;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 }
000306 bd70 POP {r4-r6,pc}
|L1.776|
000308 b90d CBNZ r5,|L1.782|
00030a 2009 MOVS r0,#9
00030c bd70 POP {r4-r6,pc}
|L1.782|
00030e 7820 LDRB r0,[r4,#0]
000310 2803 CMP r0,#3
000312 d001 BEQ |L1.792|
000314 2001 MOVS r0,#1
000316 bd70 POP {r4-r6,pc}
|L1.792|
000318 f7fff7ff BL OS_CPU_SR_Save
00031c 7aa1 LDRB r1,[r4,#0xa]
00031e 71a9 STRB r1,[r5,#6]
000320 f104f104 ADD r1,r4,#0xb
000324 1caa ADDS r2,r5,#2
000326 2300 MOVS r3,#0
|L1.808|
000328 f811f811 LDRB r12,[r1],#1
00032c f802f802 STRB r12,[r2],#1
000330 1c5b ADDS r3,r3,#1
000332 b2db UXTB r3,r3
000334 2b04 CMP r3,#4
000336 d3f7 BCC |L1.808|
000338 8921 LDRH r1,[r4,#8]
00033a 8029 STRH r1,[r5,#0]
00033c f7fff7ff BL OS_CPU_SR_Restore
000340 2000 MOVS r0,#0
000342 bd70 POP {r4-r6,pc}
;;;543 #endif /* OS_SEM_QUERY_EN */
ENDP
OSSemSet PROC
;;;571 void OSSemSet (OS_EVENT *pevent, INT16U cnt, INT8U *perr)
;;;572 {
000344 b570 PUSH {r4-r6,lr}
000346 4604 MOV r4,r0
000348 460e MOV r6,r1
00034a 4615 MOV r5,r2
;;;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' */
00034c 2d00 CMP r5,#0
00034e d002 BEQ |L1.854|
;;;581 return;
;;;582 }
;;;583 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
000350 b914 CBNZ r4,|L1.856|
;;;584 *perr = OS_ERR_PEVENT_NULL;
000352 2004 MOVS r0,#4
000354 7028 STRB r0,[r5,#0]
|L1.854|
;;;585 return;
;;;586 }
;;;587 #endif
;;;588 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
;;;589 *perr = OS_ERR_EVENT_TYPE;
;;;590 return;
;;;591 }
;;;592 OS_ENTER_CRITICAL();
;;;593 *perr = 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 *perr = OS_ERR_TASK_WAITING;
;;;601 }
;;;602 }
;;;603 OS_EXIT_CRITICAL();
;;;604 }
000356 bd70 POP {r4-r6,pc}
|L1.856|
000358 7820 LDRB r0,[r4,#0]
00035a 2803 CMP r0,#3
00035c d002 BEQ |L1.868|
00035e 2001 MOVS r0,#1
000360 7028 STRB r0,[r5,#0]
000362 bd70 POP {r4-r6,pc}
|L1.868|
000364 f7fff7ff BL OS_CPU_SR_Save
000368 2100 MOVS r1,#0
00036a 7029 STRB r1,[r5,#0]
00036c 8921 LDRH r1,[r4,#8]
00036e b109 CBZ r1,|L1.884|
000370 8126 STRH r6,[r4,#8]
000372 e005 B |L1.896|
|L1.884|
000374 7aa1 LDRB r1,[r4,#0xa]
000376 b909 CBNZ r1,|L1.892|
000378 8126 STRH r6,[r4,#8]
00037a e001 B |L1.896|
|L1.892|
00037c 2149 MOVS r1,#0x49
00037e 7029 STRB r1,[r5,#0]
|L1.896|
000380 e8bde8bd POP {r4-r6,lr}
000384 f7fff7ff B.W OS_CPU_SR_Restore
;;;605 #endif
ENDP
|L1.904|
000388 00000000 DCD OSIntNesting
|L1.908|
00038c 00000000 DCD OSEventFreeList
|L1.912|
000390 00000000 DCD OSLockNesting
|L1.916|
000394 00000000 DCD OSTCBCur
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -