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

📄 sem.c

📁 ucos2.85在vs2005上模拟环境
💻 C
字号:
#include "rtos.h"

#define RTOS_SemaphoreIsValid(semaphore) \
        (semaphore &&(((OS_EVENT*)semaphore)->OSEventType==OS_EVENT_TYPE_SEM))

/*
*******************************************************************************
**
** Create a new semaphore and initializes it with the given value.
**
*******************************************************************************
*/
RTOS_Semaphore RTOS_SemaphoreCreate( U32 init )
{
    if( init > 0x0000FFFF )
        return( (RTOS_Semaphore)0 );
    
    return( (RTOS_Semaphore) OSSemCreate( (INT16U) init ) );
}

/*
*******************************************************************************
**
** Destroy a given semaphore.
**
*******************************************************************************
*/
int RTOS_SemaphoreDestroy( RTOS_Semaphore semaphore )
{    
   INT8U     error;
   OS_EVENT* event;
    
    if( ! RTOS_SemaphoreIsValid( semaphore ) )
        return( -1 );
        
    event = OSSemDel( (OS_EVENT*)semaphore, OS_DEL_NO_PEND, &error ); 
    if( ( event != 0 ) || ( error != OS_NO_ERR ) )   
        return( -1 );

    return( 0 );
}

/*
*******************************************************************************
**
** Query (read) the current value from a given semaphore.
**
*******************************************************************************
*/
int RTOS_SemaphoreQuery( RTOS_Semaphore semaphore )
{
    OS_SEM_DATA semdata;
    
    if( ! RTOS_SemaphoreIsValid( semaphore ) )
        return( -1 );

    if( OSSemQuery( (OS_EVENT*)semaphore, &semdata ) != OS_NO_ERR )
        return( -1 );

    return( (int) semdata.OSCnt );
}

/*
*******************************************************************************
**
** Wait and decrement a given semaphore
**
*******************************************************************************
*/
int RTOS_SemaphoreWait( RTOS_Semaphore semaphore, bool suspend )
{
    INT8U       error = OS_NO_ERR;
    INT16U      count = 1;
//  OS_SEM_DATA semdata;
    
    if( ! RTOS_SemaphoreIsValid( semaphore ) )
        return( -1 );

//  if( suspend ) 
//  {
//      OSSemPend( (OS_EVENT*)semaphore, (INT16U)0, &error );  
//      if( error != OS_NO_ERR )
//          return( RTOS_FAILURE );
//  }            
//                
//  if( OSSemQuery( (OS_EVENT*)semaphore, &semdata ) != OS_NO_ERR )
//      return( RTOS_FAILURE ); 
//
//  return( semdata.OSCnt + 1 );                                         

    if( suspend )
        OSSemPend( (OS_EVENT*)semaphore, (INT16U)0, &error ); 
    else
        count = OSSemAccept( (OS_EVENT*)semaphore );    
           
    if( ( error != OS_NO_ERR ) || ( count == 0 ) )
        return( -1 );
        
    return( 1 );                                         
}

/*
*******************************************************************************
**
** Wait and decrement a given semaphore (with timeout)
**
** msecs:
**   '0'   means no-blocking, withount time-out
**   '-1'  means blocking, without time-out
**   '>=1' means blocking, with time-out
**
*******************************************************************************
*/
int RTOS_SemaphoreWaitTimeout( RTOS_Semaphore semaphore, INT16U msecs )
{
    INT16U      ticks = msecs / (1000 / OS_TICKS_PER_SEC);
    INT8U       error = OS_NO_ERR;
    OS_SEM_DATA semdata;

    if( ! RTOS_SemaphoreIsValid( semaphore ) )
        return( -1 );

    if( msecs == 0 )
        return( RTOS_SemaphoreWait( semaphore, false ) );
            
    if( msecs == (INT16U)-1)
        return( RTOS_SemaphoreWait( semaphore, true ) );
        
    OSSemPend( (OS_EVENT*)semaphore, ticks, &error );  
    if( error != OS_NO_ERR )
        return( -1 );
                  
    if( OSSemQuery( (OS_EVENT*)semaphore, &semdata ) != OS_NO_ERR )
        return( -1 ); 

    return ( (int) semdata.OSCnt );
}
    
/*
*******************************************************************************
**
** Signal an occupied semaphore 
**
*******************************************************************************
*/
int RTOS_SemaphoreRelease( RTOS_Semaphore semaphore )
{
    if( ! RTOS_SemaphoreIsValid( semaphore ) )
        return( -1 );
    
    if( OSSemPost( (OS_EVENT*)semaphore ) != OS_NO_ERR )
        return( -1 );
        
    return( 0 );
}

void sem_lock(RTOS_Semaphore semaphore )
{
	RTOS_SemaphoreWait(semaphore, true);
}

void sem_unlock(RTOS_Semaphore semaphore )
{
	RTOS_SemaphoreRelease(semaphore);
}

⌨️ 快捷键说明

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