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

📄 os_sem.ls1

📁 在51单片机上移植成功的UCOS-II操作系统源代码,包括源代码及相关注释
💻 LS1
📖 第 1 页 / 共 2 页
字号:
                     192     ; *****************************************************************************************
                             ****************
                     193     ; */
                     194     ; 
                     195     ; void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err) reentrant
                     196     ; {
                     197     ;     OS_ENTER_CRITICAL();
                     198     ;     if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type       
                                           */
                     199     ;         OS_EXIT_CRITICAL();
                     200     ;         *err = OS_ERR_EVENT_TYPE;
                     201     ;     }
                     202     ;     if (pevent->OSEventCnt > 0) {                     /* If sem. is positive, resource av
                             ailable ...   */
                     203     ;         pevent->OSEventCnt--;                         /* ... decrement semaphore only if 
                             positive.     */
                     204     ;         OS_EXIT_CRITICAL();
                     205     ;         *err = OS_NO_ERR;
                     206     ;     } else if (OSIntNesting > 0) {                    /* See if called from ISR ...      
                                           */
                     207     ;         OS_EXIT_CRITICAL();                           /* ... can't PEND from an ISR      
                                           */
                     208     ;         *err = OS_ERR_PEND_ISR;
                     209     ;     } else {                                          /* Otherwise, must wait until event
                              occurs       */
                     210     ;         OSTCBCur->OSTCBStat    |= OS_STAT_SEM;        /* Resource not available, pend on 
                             semaphore     */
                     211     ;         OSTCBCur->OSTCBDly      = timeout;            /* Store pend timeout in TCB       
                                           */
                     212     ;         OSEventTaskWait(pevent);                      /* Suspend task until event or time
                             out occurs    */
                     213     ;         OS_EXIT_CRITICAL();
A51 MACRO ASSEMBLER  OS_SEM                                                               09/09/2007 21:13:34 PAGE     5

                     214     ;         OSSched();                                    /* Find next highest priority task 
                             ready         */
                     215     ;         OS_ENTER_CRITICAL();
                     216     ;         if (OSTCBCur->OSTCBStat & OS_STAT_SEM) {      /* Must have timed out if still wai
                             ting for event*/
                     217     ;             OSEventTO(pevent);
                     218     ;             OS_EXIT_CRITICAL();
                     219     ;             *err = OS_TIMEOUT;                        /* Indicate that didn't get event w
                             ithin TO      */
                     220     ;         } else {
                     221     ;             OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
                     222     ;             OS_EXIT_CRITICAL();
                     223     ;             *err = OS_NO_ERR;
                     224     ;         }
                     225     ;     }
                     226     ; }
                     227     ; /*$PAGE*/
                     228     ; /*
                     229     ; *****************************************************************************************
                             ****************
                     230     ; *                                         POST TO A SEMAPHORE
                     231     ; *
                     232     ; * Description: This function signals a semaphore
                     233     ; *
                     234     ; * Arguments  : pevent        is a pointer to the event control block associated with the 
                             desired 
                     235     ; *                            semaphore.
                     236     ; *
                     237     ; * Returns    : OS_NO_ERR          The call was successful and the semaphore was signaled.
                     238     ; *              OS_SEM_OVF         If the semaphore count exceeded its limit.  In other wo
                             rds, you have 
                     239     ; *                                 signalled the semaphore more often than you waited on i
                             t with either
                     240     ; *                                 OSSemAccept() or OSSemPend().
                     241     ; *              OS_ERR_EVENT_TYPE  If you didn't pass a pointer to a semaphore
                     242     ; *****************************************************************************************
                             ****************
                     243     ; */
                     244     ; 
                     245     ; INT8U OSSemPost (OS_EVENT *pevent) reentrant
                     246     ; {
                     247     ;     OS_ENTER_CRITICAL();
                     248     ;     if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {        /* Validate event block type  
                                           */
                     249     ;         OS_EXIT_CRITICAL();
                     250     ;         return (OS_ERR_EVENT_TYPE);
                     251     ;     }
                     252     ;     if (pevent->OSEventGrp) {                              /* See if any task waiting for
                              semaphore    */
                     253     ;         OSEventTaskRdy(pevent, (void *)0, OS_STAT_SEM);    /* Ready highest prio task wai
                             ting on event */
                     254     ;         OS_EXIT_CRITICAL();
                     255     ;         OSSched();                                    /* Find highest priority task ready
                              to run       */
                     256     ;         return (OS_NO_ERR);
                     257     ;     } else {
                     258     ;         if (pevent->OSEventCnt < 65535) {             /* Make sure semaphore will not ove
                             rflow         */
                     259     ;             pevent->OSEventCnt++;                     /* Increment semaphore count to reg
                             ister event   */
                     260     ;             OS_EXIT_CRITICAL();
                     261     ;             return (OS_NO_ERR);
                     262     ;         } else {                                      /* Semaphore value has reached its 
                             maximum       */
                     263     ;             OS_EXIT_CRITICAL();
                     264     ;             return (OS_SEM_OVF);
A51 MACRO ASSEMBLER  OS_SEM                                                               09/09/2007 21:13:34 PAGE     6

                     265     ;         }
                     266     ;     }
                     267     ; }
                     268     ; /*
                     269     ; *****************************************************************************************
                             ****************
                     270     ; *                                          QUERY A SEMAPHORE
                     271     ; *
                     272     ; * Description: This function obtains information about a semaphore
                     273     ; *
                     274     ; * Arguments  : pevent        is a pointer to the event control block associated with the 
                             desired 
                     275     ; *                            semaphore
                     276     ; *
                     277     ; *              pdata         is a pointer to a structure that will contain information ab
                             out the 
                     278     ; *                            semaphore.
                     279     ; *
                     280     ; * Returns    : OS_NO_ERR          The call was successful and the message was sent
                     281     ; *              OS_ERR_EVENT_TYPE  If you are attempting to obtain data from a non semapho
                             re.
                     282     ; *****************************************************************************************
                             ****************
                     283     ; */
                     284     ; 
                     285     ; INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *ppdata) reentrant
                     286     ; {
                     287     ;     INT8U  i;
                     288     ;     INT8U *psrc;
                     289     ;     INT8U *pdest;
                     290     ;     
                     291     ;     
                     292     ;     OS_ENTER_CRITICAL();
                     293     ;     if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {        /* Validate event block type  
                                           */
                     294     ;         OS_EXIT_CRITICAL();
                     295     ;         return (OS_ERR_EVENT_TYPE);
                     296     ;     }
                     297     ;     ppdata->OSEventGrp = pevent->OSEventGrp;                /* Copy message mailbox wait 
                             list           */
                     298     ;     psrc              = &pevent->OSEventTbl[0];
                     299     ;     pdest             = &ppdata->OSEventTbl[0];
                     300     ;     for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
                     301     ;         *pdest++ = *psrc++;   
                     302     ;     }
                     303     ;     ppdata->OSCnt      = pevent->OSEventCnt;                /* Get semaphore count       
                                            */
                     304     ;     OS_EXIT_CRITICAL();
                     305     ;     return (OS_NO_ERR);
                     306     ; }
                     307     ; #endif
                     308     ; *** sync lost ***
                     309     ; *** sync lost ***
                     310     ; *** sync lost ***
                     311             END
A51 MACRO ASSEMBLER  OS_SEM                                                               09/09/2007 21:13:34 PAGE     7

SYMBOL TABLE LISTING
------ ----- -------


N A M E             T Y P E  V A L U E   ATTRIBUTES

AC . . . . . . . .  B ADDR   00D0H.6 A   
ACC. . . . . . . .  D ADDR   00E0H   A   
B. . . . . . . . .  D ADDR   00F0H   A   
CY . . . . . . . .  B ADDR   00D0H.7 A   
DPH. . . . . . . .  D ADDR   0083H   A   
DPL. . . . . . . .  D ADDR   0082H   A   
EA . . . . . . . .  B ADDR   00A8H.7 A   
ES . . . . . . . .  B ADDR   00A8H.4 A   
ET0. . . . . . . .  B ADDR   00A8H.1 A   
ET1. . . . . . . .  B ADDR   00A8H.3 A   
EX0. . . . . . . .  B ADDR   00A8H.0 A   
EX1. . . . . . . .  B ADDR   00A8H.2 A   
F0 . . . . . . . .  B ADDR   00D0H.5 A   
IE . . . . . . . .  D ADDR   00A8H   A   
IE0. . . . . . . .  B ADDR   0088H.1 A   
IE1. . . . . . . .  B ADDR   0088H.3 A   
INT0 . . . . . . .  B ADDR   00B0H.2 A   
INT1 . . . . . . .  B ADDR   00B0H.3 A   
IP . . . . . . . .  D ADDR   00B8H   A   
IT0. . . . . . . .  B ADDR   0088H.0 A   
IT1. . . . . . . .  B ADDR   0088H.2 A   
OS_SEM . . . . . .  N NUMB   -----       
OV . . . . . . . .  B ADDR   00D0H.2 A   
P. . . . . . . . .  B ADDR   00D0H.0 A   
P0 . . . . . . . .  D ADDR   0080H   A   
P1 . . . . . . . .  D ADDR   0090H   A   
P2 . . . . . . . .  D ADDR   00A0H   A   
P3 . . . . . . . .  D ADDR   00B0H   A   
PCON . . . . . . .  D ADDR   0087H   A   
PS . . . . . . . .  B ADDR   00B8H.4 A   
PSW. . . . . . . .  D ADDR   00D0H   A   
PT0. . . . . . . .  B ADDR   00B8H.1 A   
PT1. . . . . . . .  B ADDR   00B8H.3 A   
PX0. . . . . . . .  B ADDR   00B8H.0 A   
PX1. . . . . . . .  B ADDR   00B8H.2 A   
RB8. . . . . . . .  B ADDR   0098H.2 A   
RD . . . . . . . .  B ADDR   00B0H.7 A   
REN. . . . . . . .  B ADDR   0098H.4 A   
RI . . . . . . . .  B ADDR   0098H.0 A   
RS0. . . . . . . .  B ADDR   00D0H.3 A   
RS1. . . . . . . .  B ADDR   00D0H.4 A   
RXD. . . . . . . .  B ADDR   00B0H.0 A   
SBUF . . . . . . .  D ADDR   0099H   A   
SCON . . . . . . .  D ADDR   0098H   A   
SM0. . . . . . . .  B ADDR   0098H.7 A   
SM1. . . . . . . .  B ADDR   0098H.6 A   
SM2. . . . . . . .  B ADDR   0098H.5 A   
SP . . . . . . . .  D ADDR   0081H   A   
T0 . . . . . . . .  B ADDR   00B0H.4 A   
T1 . . . . . . . .  B ADDR   00B0H.5 A   
TB8. . . . . . . .  B ADDR   0098H.3 A   
TCON . . . . . . .  D ADDR   0088H   A   
TF0. . . . . . . .  B ADDR   0088H.5 A   
TF1. . . . . . . .  B ADDR   0088H.7 A   
TH0. . . . . . . .  D ADDR   008CH   A   
TH1. . . . . . . .  D ADDR   008DH   A   
TI . . . . . . . .  B ADDR   0098H.1 A   
TL0. . . . . . . .  D ADDR   008AH   A   
TL1. . . . . . . .  D ADDR   008BH   A   
TMOD . . . . . . .  D ADDR   0089H   A   
A51 MACRO ASSEMBLER  OS_SEM                                                               09/09/2007 21:13:34 PAGE     8

TR0. . . . . . . .  B ADDR   0088H.4 A   
TR1. . . . . . . .  B ADDR   0088H.6 A   
TXD. . . . . . . .  B ADDR   00B0H.1 A   
WR . . . . . . . .  B ADDR   00B0H.6 A   


REGISTER BANK(S) USED: 0 

ASSEMBLY COMPLETE.  0 WARNING(S), 0 ERROR(S)

⌨️ 快捷键说明

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