📄 os_sem.lst
字号:
422 OS_Sched(); /* Find HPT ready to run */
\ 000000CC ........ _BLF OS_Sched,??OS_Sched??rA
423 *err = OS_ERR_PEND_ABORT;
\ 000000D0 0E00A0E3 MOV R0,#+14
\ 000000D4 0000C6E5 STRB R0,[R6, #+0]
424 return (nbr_tasks);
\ 000000D8 0700B0E1 MOVS R0,R7
\ 000000DC FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 000000E0 040000EA B ??OSSemPendAbort_1
425 }
426 OS_EXIT_CRITICAL();
\ ??OSSemPendAbort_4:
\ 000000E4 0800B0E1 MOVS R0,R8
\ 000000E8 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
427 *err = OS_ERR_NONE;
\ 000000EC 0000A0E3 MOV R0,#+0
\ 000000F0 0000C6E5 STRB R0,[R6, #+0]
428 return (0); /* No tasks waiting on semaphore */
\ 000000F4 0000A0E3 MOV R0,#+0
\ ??OSSemPendAbort_1:
\ 000000F8 F081BDE8 POP {R4-R8,PC} ;; return
429 }
430 #endif
431
432 /*$PAGE*/
433 /*
434 *********************************************************************************************************
435 * POST TO A SEMAPHORE
436 *
437 * Description: This function signals a semaphore
438 *
439 * Arguments : pevent is a pointer to the event control block associated with the desired
440 * semaphore.
441 *
442 * Returns : OS_ERR_NONE The call was successful and the semaphore was signaled.
443 * OS_ERR_SEM_OVF If the semaphore count exceeded its limit. In other words, you have
444 * signalled the semaphore more often than you waited on it with either
445 * OSSemAccept() or OSSemPend().
446 * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a semaphore
447 * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer.
448 *********************************************************************************************************
449 */
450
\ In segment CODE, align 4, keep-with-next
451 INT8U OSSemPost (OS_EVENT *pevent)
452 {
\ OSSemPost:
\ 00000000 30402DE9 PUSH {R4,R5,LR}
\ 00000004 0040B0E1 MOVS R4,R0
453 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
454 OS_CPU_SR cpu_sr = 0;
\ 00000008 0000A0E3 MOV R0,#+0
\ 0000000C 0050B0E1 MOVS R5,R0
455 #endif
456
457
458
459 #if OS_ARG_CHK_EN > 0
460 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
\ 00000010 000054E3 CMP R4,#+0
\ 00000014 0100001A BNE ??OSSemPost_0
461 return (OS_ERR_PEVENT_NULL);
\ 00000018 0400A0E3 MOV R0,#+4
\ 0000001C 220000EA B ??OSSemPost_1
462 }
463 #endif
464 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
\ ??OSSemPost_0:
\ 00000020 0000D4E5 LDRB R0,[R4, #+0]
\ 00000024 030050E3 CMP R0,#+3
\ 00000028 0100000A BEQ ??OSSemPost_2
465 return (OS_ERR_EVENT_TYPE);
\ 0000002C 0100A0E3 MOV R0,#+1
\ 00000030 1D0000EA B ??OSSemPost_1
466 }
467 OS_ENTER_CRITICAL();
\ ??OSSemPost_2:
\ 00000034 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rA
\ 00000038 0050B0E1 MOVS R5,R0
468 if (pevent->OSEventGrp != 0) { /* See if any task waiting for semaphore */
\ 0000003C 0A00D4E5 LDRB R0,[R4, #+10]
\ 00000040 000050E3 CMP R0,#+0
\ 00000044 0900000A BEQ ??OSSemPost_3
469 /* Ready HPT waiting on event */
470 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_OK);
\ 00000048 0030A0E3 MOV R3,#+0
\ 0000004C 0120A0E3 MOV R2,#+1
\ 00000050 0010A0E3 MOV R1,#+0
\ 00000054 0400B0E1 MOVS R0,R4
\ 00000058 ........ _BLF OS_EventTaskRdy,??OS_EventTaskRdy??rA
471 OS_EXIT_CRITICAL();
\ 0000005C 0500B0E1 MOVS R0,R5
\ 00000060 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
472 OS_Sched(); /* Find HPT ready to run */
\ 00000064 ........ _BLF OS_Sched,??OS_Sched??rA
473 return (OS_ERR_NONE);
\ 00000068 0000A0E3 MOV R0,#+0
\ 0000006C 0E0000EA B ??OSSemPost_1
474 }
475 if (pevent->OSEventCnt < 65535u) { /* Make sure semaphore will not overflow */
\ ??OSSemPost_3:
\ 00000070 B800D4E1 LDRH R0,[R4, #+8]
\ 00000074 FF10A0E3 MOV R1,#+255
\ 00000078 FF1C81E3 ORR R1,R1,#0xFF00
\ 0000007C 010050E1 CMP R0,R1
\ 00000080 0600000A BEQ ??OSSemPost_4
476 pevent->OSEventCnt++; /* Increment semaphore count to register event */
\ 00000084 B800D4E1 LDRH R0,[R4, #+8]
\ 00000088 010090E2 ADDS R0,R0,#+1
\ 0000008C B800C4E1 STRH R0,[R4, #+8]
477 OS_EXIT_CRITICAL();
\ 00000090 0500B0E1 MOVS R0,R5
\ 00000094 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
478 return (OS_ERR_NONE);
\ 00000098 0000A0E3 MOV R0,#+0
\ 0000009C 020000EA B ??OSSemPost_1
479 }
480 OS_EXIT_CRITICAL(); /* Semaphore value has reached its maximum */
\ ??OSSemPost_4:
\ 000000A0 0500B0E1 MOVS R0,R5
\ 000000A4 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
481 return (OS_ERR_SEM_OVF);
\ 000000A8 3200A0E3 MOV R0,#+50
\ ??OSSemPost_1:
\ 000000AC 3080BDE8 POP {R4,R5,PC} ;; return
482 }
483
484 /*$PAGE*/
485 /*
486 *********************************************************************************************************
487 * QUERY A SEMAPHORE
488 *
489 * Description: This function obtains information about a semaphore
490 *
491 * Arguments : pevent is a pointer to the event control block associated with the desired
492 * semaphore
493 *
494 * p_sem_data is a pointer to a structure that will contain information about the
495 * semaphore.
496 *
497 * Returns : OS_ERR_NONE The call was successful and the message was sent
498 * OS_ERR_EVENT_TYPE If you are attempting to obtain data from a non semaphore.
499 * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer.
500 * OS_ERR_PDATA_NULL If 'p_sem_data' is a NULL pointer
501 *********************************************************************************************************
502 */
503
504 #if OS_SEM_QUERY_EN > 0
\ In segment CODE, align 4, keep-with-next
505 INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *p_sem_data)
506 {
\ OSSemQuery:
\ 00000000 F0432DE9 PUSH {R4-R9,LR}
\ 00000004 0040B0E1 MOVS R4,R0
\ 00000008 0150B0E1 MOVS 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;
\ 0000000C 0000A0E3 MOV R0,#+0
\ 00000010 0090B0E1 MOVS R9,R0
517 #endif
518
519
520
521 #if OS_ARG_CHK_EN > 0
522 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
\ 00000014 000054E3 CMP R4,#+0
\ 00000018 0100001A BNE ??OSSemQuery_0
523 return (OS_ERR_PEVENT_NULL);
\ 0000001C 0400A0E3 MOV R0,#+4
\ 00000020 200000EA B ??OSSemQuery_1
524 }
525 if (p_sem_data == (OS_SEM_DATA *)0) { /* Validate 'p_sem_data' */
\ ??OSSemQuery_0:
\ 00000024 000055E3 CMP R5,#+0
\ 00000028 0100001A BNE ??OSSemQuery_2
526 return (OS_ERR_PDATA_NULL);
\ 0000002C 0900A0E3 MOV R0,#+9
\ 00000030 1C0000EA B ??OSSemQuery_1
527 }
528 #endif
529 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
\ ??OSSemQuery_2:
\ 00000034 0000D4E5 LDRB R0,[R4, #+0]
\ 00000038 030050E3 CMP R0,#+3
\ 0000003C 0100000A BEQ ??OSSemQuery_3
530 return (OS_ERR_EVENT_TYPE);
\ 00000040 0100A0E3 MOV R0,#+1
\ 00000044 170000EA B ??OSSemQuery_1
531 }
532 OS_ENTER_CRITICAL();
\ ??OSSemQuery_3:
\ 00000048 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rA
\ 0000004C 0090B0E1 MOVS R9,R0
533 p_sem_data->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */
\ 00000050 0A00D4E5 LDRB R0,[R4, #+10]
\ 00000054 0600C5E5 STRB R0,[R5, #+6]
534
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -