📄 sem.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 + -