📄 os_sem.ls1
字号:
718 ; /*$PAGE*/
719 ; /*
720 ; *****************************************************************************************
****************
721 ; * POST TO A SEMAPHORE
722 ; *
723 ; * Description: This function signals a semaphore
724 ; *
725 ; * Arguments : pevent is a pointer to the event control block associated with the
desired
726 ; * semaphore.
727 ; *
728 ; * Returns : OS_NO_ERR The call was successful and the semaphore was signaled
.
729 ; * OS_SEM_OVF If the semaphore count exceeded its limit. In other w
ords, you have
730 ; * signalled the semaphore more often than you waited on
it with either
731 ; * OSSemAccept() or OSSemPend().
732 ; * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a semaphore
733 ; * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer.
734 ; *****************************************************************************************
****************
735 ; */
736 ;
737 ; INT8U OSSemPost (OS_EVENT *pevent)LG_REENTRANT
738
---- 739 RSEG ?PR?_?OSSemPost?OS_SEM
0000 740 _?OSSemPost:
741 USING 0
742 ; SOURCE LINE # 308
0000 90FFFD 743 MOV DPTR,#0FFFDH
0003 120000 F 744 LCALL ?C?ADDXBP
0006 120000 F 745 LCALL ?C?PSTXDATA
746 ; {
747 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU st
atus register */
748 ; OS_CPU_SR cpu_sr;
749 ; #endif
A51 MACRO ASSEMBLER OS_SEM 05/17/2005 11:19:57 PAGE 14
750 ;
751 ;
752 ; #if OS_ARG_CHK_EN > 0
753 ; if (pevent == (OS_EVENT *)0) { /* Validate 'pevent'
*/
754 ; SOURCE LINE # 316
0009 850083 F 755 MOV DPH,?C_XBP
000C 850082 F 756 MOV DPL,?C_XBP+01H
000F 120000 F 757 LCALL ?C?PLDXDATA
0012 E9 758 MOV A,R1
0013 4A 759 ORL A,R2
0014 4B 760 ORL A,R3
0015 7004 761 JNZ ?C0011
762 ; return (OS_ERR_PEVENT_NULL);
763 ; SOURCE LINE # 317
0017 7F04 764 MOV R7,#04H
0019 8077 765 SJMP ?C0012
766 ; }
767 ; SOURCE LINE # 318
001B 768 ?C0011:
769 ; if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type
*/
770 ; SOURCE LINE # 319
001B 850083 F 771 MOV DPH,?C_XBP
001E 850082 F 772 MOV DPL,?C_XBP+01H
0021 120000 F 773 LCALL ?C?PLDXDATA
0024 120000 F 774 LCALL ?C?CLDPTR
0027 6403 775 XRL A,#03H
0029 6004 776 JZ ?C0013
777 ; return (OS_ERR_EVENT_TYPE);
778 ; SOURCE LINE # 320
002B 7F01 779 MOV R7,#01H
002D 8063 780 SJMP ?C0012
781 ; }
782 ; SOURCE LINE # 321
002F 783 ?C0013:
784 ; #endif
785 ; OS_ENTER_CRITICAL();
786 ; SOURCE LINE # 323
002F C2AF 787 CLR EA
788 ; if (pevent->OSEventGrp != 0x00) { /* See if any task waiting for
semaphore */
789 ; SOURCE LINE # 324
0031 900001 790 MOV DPTR,#01H
0034 120000 F 791 LCALL ?C?CLDOPTR
0037 602D 792 JZ ?C0014
793 ; OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM); /* Ready highest prio task wai
ting on event */
794 ; SOURCE LINE # 325
0039 90FFFF 795 MOV DPTR,#0FFFFH
003C 120000 F 796 LCALL ?C?ADDXBP
003F 7401 797 MOV A,#01H
0041 F0 798 MOVX @DPTR,A
0042 7B00 799 MOV R3,#00H
0044 7A00 800 MOV R2,#00H
0046 7900 801 MOV R1,#00H
0048 90FFFD 802 MOV DPTR,#0FFFDH
004B 120000 F 803 LCALL ?C?ADDXBP
004E 120000 F 804 LCALL ?C?PSTXDATA
0051 900004 805 MOV DPTR,#04H
0054 120000 F 806 LCALL ?C?XBPOFF
0057 120000 F 807 LCALL ?C?PLDXDATA
005A 120000 F 808 LCALL _?OS_EventTaskRdy
809 ; OS_EXIT_CRITICAL();
810 ; SOURCE LINE # 326
005D D2AF 811 SETB EA
A51 MACRO ASSEMBLER OS_SEM 05/17/2005 11:19:57 PAGE 15
812 ; OS_Sched(); /* Find highest priority task
ready to run */
813 ; SOURCE LINE # 327
005F 120000 F 814 LCALL _?OS_Sched
815 ; return (OS_NO_ERR);
816 ; SOURCE LINE # 328
0062 7F00 817 MOV R7,#00H
0064 802C 818 SJMP ?C0012
819 ; }
820 ; SOURCE LINE # 329
0066 821 ?C0014:
822 ; if (pevent->OSEventCnt < 65535) { /* Make sure semaphore will not ove
rflow */
823 ; SOURCE LINE # 330
0066 850083 F 824 MOV DPH,?C_XBP
0069 850082 F 825 MOV DPL,?C_XBP+01H
006C 120000 F 826 LCALL ?C?PLDXDATA
006F 900002 827 MOV DPTR,#02H
0072 120000 F 828 LCALL ?C?ILDOPTR
0075 C3 829 CLR C
0076 94FF 830 SUBB A,#0FFH
0078 E5F0 831 MOV A,B
007A 94FF 832 SUBB A,#0FFH
007C 5010 833 JNC ?C0015
834 ; pevent->OSEventCnt++; /* Increment semaphore count to reg
ister event */
835 ; SOURCE LINE # 331
007E 900002 836 MOV DPTR,#02H
0081 E4 837 CLR A
0082 75F001 838 MOV B,#01H
0085 120000 F 839 LCALL ?C?IILDOPTR
840 ; OS_EXIT_CRITICAL();
841 ; SOURCE LINE # 332
0088 D2AF 842 SETB EA
843 ; return (OS_NO_ERR);
844 ; SOURCE LINE # 333
008A 7F00 845 MOV R7,#00H
008C 8004 846 SJMP ?C0012
847 ; }
848 ; SOURCE LINE # 334
008E 849 ?C0015:
850 ; OS_EXIT_CRITICAL(); /* Semaphore value has reached its
maximum */
851 ; SOURCE LINE # 335
008E D2AF 852 SETB EA
853 ; return (OS_SEM_OVF);
854 ; SOURCE LINE # 336
0090 7F32 855 MOV R7,#032H
856 ; }
857 ; SOURCE LINE # 337
0092 858 ?C0012:
0092 900003 859 MOV DPTR,#03H
0095 020000 F 860 LJMP ?C?ADDXBP
861 ; END OF _?OSSemPost
862
863 END
A51 MACRO ASSEMBLER OS_SEM 05/17/2005 11:19:57 PAGE 16
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
?C0001 . . . . . . . . . C ADDR 0023H R SEG=?PR?_?OSSEMCREATE?OS_SEM
?C0002 . . . . . . . . . C ADDR 00BCH R SEG=?PR?_?OSSEMCREATE?OS_SEM
?C0003 . . . . . . . . . C ADDR 0051H R SEG=?PR?_?OSSEMCREATE?OS_SEM
?C0004 . . . . . . . . . C ADDR 00B3H R SEG=?PR?_?OSSEMCREATE?OS_SEM
?C0005 . . . . . . . . . C ADDR 002BH R SEG=?PR?_?OSSEMPEND?OS_SEM
?C0006 . . . . . . . . . C ADDR 012BH R SEG=?PR?_?OSSEMPEND?OS_SEM
?C0007 . . . . . . . . . C ADDR 0047H R SEG=?PR?_?OSSEMPEND?OS_SEM
?C0008 . . . . . . . . . C ADDR 0065H R SEG=?PR?_?OSSEMPEND?OS_SEM
?C0009 . . . . . . . . . C ADDR 0098H R SEG=?PR?_?OSSEMPEND?OS_SEM
?C0010 . . . . . . . . . C ADDR 0104H R SEG=?PR?_?OSSEMPEND?OS_SEM
?C0011 . . . . . . . . . C ADDR 001BH R SEG=?PR?_?OSSEMPOST?OS_SEM
?C0012 . . . . . . . . . C ADDR 0092H R SEG=?PR?_?OSSEMPOST?OS_SEM
?C0013 . . . . . . . . . C ADDR 002FH R SEG=?PR?_?OSSEMPOST?OS_SEM
?C0014 . . . . . . . . . C ADDR 0066H R SEG=?PR?_?OSSEMPOST?OS_SEM
?C0015 . . . . . . . . . C ADDR 008EH R SEG=?PR?_?OSSEMPOST?OS_SEM
?C0020 . . . . . . . . . C ADDR 0044H R SEG=?PR?_?OSSEMPEND?OS_SEM
?C0021 . . . . . . . . . C ADDR 0062H R SEG=?PR?_?OSSEMPEND?OS_SEM
?C0022 . . . . . . . . . C ADDR 0095H R SEG=?PR?_?OSSEMPEND?OS_SEM
?C0023 . . . . . . . . . C ADDR 0102H R SEG=?PR?_?OSSEMPEND?OS_SEM
?C0024 . . . . . . . . . C ADDR 0128H R SEG=?PR?_?OSSEMPEND?OS_SEM
?C?ADDXBP. . . . . . . . C ADDR ----- EXT
?C?CLDOPTR . . . . . . . C ADDR ----- EXT
?C?CLDPTR. . . . . . . . C ADDR ----- EXT
?C?CSTPTR. . . . . . . . C ADDR ----- EXT
?C?IILDOPTR. . . . . . . C ADDR ----- EXT
?C?ILDOPTR . . . . . . . C ADDR ----- EXT
?C?ISTOPTR . . . . . . . C ADDR ----- EXT
?C?PLDOPTR . . . . . . . C ADDR ----- EXT
?C?PLDXDATA. . . . . . . C ADDR ----- EXT
?C?PSTOPTR . . . . . . . C ADDR ----- EXT
?C?PSTXDATA. . . . . . . C ADDR ----- EXT
?C?XBPOFF. . . . . . . . C ADDR ----- EXT
?C_XBP . . . . . . . . . D ADDR ----- EXT
?PR?_?OSSEMCREATE?OS_SEM C SEG 00C2H REL=UNIT
?PR?_?OSSEMPEND?OS_SEM . C SEG 0131H REL=UNIT
?PR?_?OSSEMPOST?OS_SEM . C SEG 0098H REL=UNIT
AC . . . .
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -