⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_sem.ls1

📁 AT89C55WD上移植的ucos-ii, 非常有用, 串口观看输出与调试。
💻 LS1
📖 第 1 页 / 共 5 页
字号:
                     187     ; 
                     188     ; 
                     189     ; #if OS_ARG_CHK_EN > 0
                     190     ;     if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'               
                                           */
                     191     ;         return (0);
                     192     ;     }
                     193     ;     if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type       
                                           */
                     194     ;         return (0);
                     195     ;     }
                     196     ; #endif
                     197     ;     OS_ENTER_CRITICAL();
                     198     ;     cnt = pevent->OSEventCnt;
                     199     ;     if (cnt > 0) {                                    /* See if resource is available    
                                           */
                     200     ;         pevent->OSEventCnt--;                         /* Yes, decrement semaphore and not
                             ify caller    */
                     201     ;     }
                     202     ;     OS_EXIT_CRITICAL();
                     203     ;     return (cnt);                                     /* Return semaphore count          
                                           */
                     204     ; }
                     205     ; #endif    
                     206     ; 
                     207     ; /*$PAGE*/
                     208     ; /*
                     209     ; *****************************************************************************************
                             ****************
                     210     ; *                                           CREATE A SEMAPHORE
                     211     ; *
                     212     ; * Description: This function creates a semaphore.
                     213     ; *
                     214     ; * Arguments  : cnt           is the initial value for the semaphore.  If the value is 0, 
                             no resource is
                     215     ; *                            available (or no event has occurred).  You initialize the se
                             maphore to a
                     216     ; *                            non-zero value to specify how many resources are available (
                             e.g. if you have
                     217     ; *                            10 resources, you would initialize the semaphore to 10).
                     218     ; *
                     219     ; * Returns    : != (void *)0  is a pointer to the event control clock (OS_EVENT) associate
                             d with the
                     220     ; *                            created semaphore
                     221     ; *              == (void *)0  if no event control blocks were available
                     222     ; *****************************************************************************************
                             ****************
                     223     ; */
                     224     ; 
                     225     ; OS_EVENT  *OSSemCreate (INT16U cnt)LG_REENTRANT
                     226     
----                 227             RSEG  ?PR?_?OSSemCreate?OS_SEM
0000                 228     _?OSSemCreate:
                     229             USING   0
                     230                             ; SOURCE LINE # 83
0000 90FFFE          231             MOV     DPTR,#0FFFEH
0003 120000   F      232             LCALL   ?C?ADDXBP
0006 EE              233             MOV     A,R6
0007 F0              234             MOVX    @DPTR,A
0008 A3              235             INC     DPTR
A51 MACRO ASSEMBLER  OS_SEM                                                               05/17/2005 11:19:57 PAGE     5

0009 EF              236             MOV     A,R7
000A F0              237             MOVX    @DPTR,A
000B 90FFFD          238             MOV     DPTR,#0FFFDH
000E 120000   F      239             LCALL   ?C?ADDXBP
                     240     ; {
                     241     ; #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU st
                             atus register */
                     242     ;     OS_CPU_SR  cpu_sr;
                     243     ; #endif    
                     244     ;     OS_EVENT  *pevent;
                     245     ; 
                     246     ; 
                     247     ;     if (OSIntNesting > 0) {                                /* See if called from ISR ... 
                                           */
                     248                             ; SOURCE LINE # 91
0011 900000   F      249             MOV     DPTR,#OSIntNesting
0014 E0              250             MOVX    A,@DPTR
0015 D3              251             SETB    C
0016 9400            252             SUBB    A,#00H
0018 4009            253             JC      ?C0001
                     254     ;         return ((OS_EVENT *)0);                            /* ... can't CREATE from an IS
                             R             */
                     255                             ; SOURCE LINE # 92
001A 7B00            256             MOV     R3,#00H
001C 7A00            257             MOV     R2,#00H
001E 7900            258             MOV     R1,#00H
0020 020000   F      259             LJMP    ?C0002
                     260     ;     }
                     261                             ; SOURCE LINE # 93
0023                 262     ?C0001:
                     263     ;     OS_ENTER_CRITICAL();
                     264                             ; SOURCE LINE # 94
0023 C2AF            265             CLR     EA
                     266     ;     pevent = OSEventFreeList;                              /* Get next free event control
                              block        */
                     267                             ; SOURCE LINE # 95
0025 900000   F      268             MOV     DPTR,#OSEventFreeList
0028 120000   F      269             LCALL   ?C?PLDXDATA
002B 850083   F      270             MOV     DPH,?C_XBP
002E 850082   F      271             MOV     DPL,?C_XBP+01H
0031 120000   F      272             LCALL   ?C?PSTXDATA
                     273     ;     if (OSEventFreeList != (OS_EVENT *)0) {                /* See if pool of free ECB poo
                             l was empty   */
                     274                             ; SOURCE LINE # 96
0034 900000   F      275             MOV     DPTR,#OSEventFreeList
0037 120000   F      276             LCALL   ?C?PLDXDATA
003A E9              277             MOV     A,R1
003B 4A              278             ORL     A,R2
003C 4B              279             ORL     A,R3
003D 6012            280             JZ      ?C0003
                     281     ;         OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
                     282                             ; SOURCE LINE # 97
003F 900000   F      283             MOV     DPTR,#OSEventFreeList
0042 120000   F      284             LCALL   ?C?PLDXDATA
0045 900004          285             MOV     DPTR,#04H
0048 120000   F      286             LCALL   ?C?PLDOPTR
004B 900000   F      287             MOV     DPTR,#OSEventFreeList
004E 120000   F      288             LCALL   ?C?PSTXDATA
                     289     ;     }
                     290                             ; SOURCE LINE # 98
0051                 291     ?C0003:
                     292     ;     OS_EXIT_CRITICAL();
                     293                             ; SOURCE LINE # 99
0051 D2AF            294             SETB    EA
                     295     ;     if (pevent != (OS_EVENT *)0) {                         /* Get an event control block 
                                           */
A51 MACRO ASSEMBLER  OS_SEM                                                               05/17/2005 11:19:57 PAGE     6

                     296                             ; SOURCE LINE # 100
0053 850083   F      297             MOV     DPH,?C_XBP
0056 850082   F      298             MOV     DPL,?C_XBP+01H
0059 120000   F      299             LCALL   ?C?PLDXDATA
005C E9              300             MOV     A,R1
005D 4A              301             ORL     A,R2
005E 4B              302             ORL     A,R3
005F 6052            303             JZ      ?C0004
                     304     ;         pevent->OSEventType = OS_EVENT_TYPE_SEM;
                     305                             ; SOURCE LINE # 101
0061 850083   F      306             MOV     DPH,?C_XBP
0064 850082   F      307             MOV     DPL,?C_XBP+01H
0067 120000   F      308             LCALL   ?C?PLDXDATA
006A 7403            309             MOV     A,#03H
006C 120000   F      310             LCALL   ?C?CSTPTR
                     311     ;         pevent->OSEventCnt  = cnt;                         /* Set semaphore value        
                                           */
                     312                             ; SOURCE LINE # 102
006F 900003          313             MOV     DPTR,#03H
0072 120000   F      314             LCALL   ?C?XBPOFF
0075 E0              315             MOVX    A,@DPTR
0076 FE              316             MOV     R6,A
0077 A3              317             INC     DPTR
0078 E0              318             MOVX    A,@DPTR
0079 FF              319             MOV     R7,A
007A 850083   F      320             MOV     DPH,?C_XBP
007D 850082   F      321             MOV     DPL,?C_XBP+01H
0080 120000   F      322             LCALL   ?C?PLDXDATA
0083 900002          323             MOV     DPTR,#02H
0086 EE              324             MOV     A,R6
0087 8FF0            325             MOV     B,R7
0089 120000   F      326             LCALL   ?C?ISTOPTR
                     327     ;         pevent->OSEventPtr  = (void *)0;                   /* Unlink from ECB free list  
                                           */
                     328                             ; SOURCE LINE # 103
008C 7B00            329             MOV     R3,#00H
008E 7A00            330             MOV     R2,#00H
0090 7900            331             MOV     R1,#00H
0092 C003            332             PUSH    AR3
0094 C002            333             PUSH    AR2
0096 C001            334             PUSH    AR1
0098 850083   F      335             MOV     DPH,?C_XBP
009B 850082   F      336             MOV     DPL,?C_XBP+01H
009E 120000   F      337             LCALL   ?C?PLDXDATA
00A1 900004          338             MOV     DPTR,#04H
00A4 120000   F      339             LCALL   ?C?PSTOPTR
                     340     ;         OS_EventWaitListInit(pevent);                      /* Initialize to 'nobody waiti
                             ng' on sem.   */
                     341                             ; SOURCE LINE # 104
00A7 850083   F      342             MOV     DPH,?C_XBP
00AA 850082   F      343             MOV     DPL,?C_XBP+01H
00AD 120000   F      344             LCALL   ?C?PLDXDATA
00B0 120000   F      345             LCALL   _?OS_EventWaitListInit
                     346     ;     }
                     347                             ; SOURCE LINE # 105
00B3                 348     ?C0004:
                     349     ;     return (pevent);
                     350                             ; SOURCE LINE # 106
00B3 850083   F      351             MOV     DPH,?C_XBP
00B6 850082   F      352             MOV     DPL,?C_XBP+01H
00B9 120000   F      353             LCALL   ?C?PLDXDATA
                     354     ; }
                     355                             ; SOURCE LINE # 107
00BC                 356     ?C0002:
00BC 900005          357             MOV     DPTR,#05H
00BF 020000   F      358             LJMP    ?C?ADDXBP
A51 MACRO ASSEMBLER  OS_SEM                                                               05/17/2005 11:19:57 PAGE     7

                     359     ; END OF _?OSSemCreate
                     360     
                     361     ; 
                     362     ; /*$PAGE*/
                     363     ; /*
                     364     ; *****************************************************************************************
                             ****************
                     365     ; *                                         DELETE A SEMAPHORE
                     366     ; *
                     367     ; * Description: This function deletes a semaphore and readies all tasks pending on the sem
                             aphore.
                     368     ; *
                     369     ; * Arguments  : pevent        is a pointer to the event control block associated with the 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -