📄 os_sem.c
字号:
/*
*********************************************************************************************************
* uC/OS-16
* The Real-Time Kernel
* SEMAPHORE MANAGEMENT
*
* File : OS_SEM.C
* By : zhang xian
* Date : 2006-11-26
*********************************************************************************************************
*/
#include "Includes.h"
#if EN_OS_SEM > 0
/*
*********************************************************************************************************
* Initialize a semaphore
*********************************************************************************************************
*/
void OSSemInit (INT8U SemIndex,INT8U SemCount)
{
OSSemBuf[SemIndex] = SemCount;
}
/*
*********************************************************************************************************
* ACCEPT SEMAPHORE
*
* Description: This function checks the semaphore to see if a resource is available or, if an event
* occurred. Unlike OSSemPend(), OSSemAccept() does not suspend the calling task if the
* resource is not available or the event did not occur.
*
* Returns : > 0 if the resource is available or the event did not occur the semaphore is
* decremented to obtain the resource.
* == 0 if the resource is not available
*********************************************************************************************************
*/
#if EN_OS_SEM_ACCEPT > 0
INT8U OSSemAccept (INT8U SemIndex)
{
INT8U cnt;
Assert( SemIndex<=OS_MAX_SEMS );
cnt = OSSemBuf[SemIndex];
if (cnt > 0)
{ /* See if resource is available */
OSSemBuf[SemIndex]--; /* Yes, decrement semaphore and notify caller */
}
return (cnt); /* Return semaphore count */
}
#endif
/*
*********************************************************************************************************
* Pend a semaphore
*********************************************************************************************************
*/
INT8U OSSemPend (INT8U SemIndex, INT8U Timeout) reentrant
{
OS_SIZE TaskMap;
Assert( SemIndex<=OS_MAX_SEMS ); //&& Timeout!=0 );
OS_ENTER_CRITICAL();
OSIntNesting = 0;
if( OSSemBuf[SemIndex]==0 )
{
TaskMap = OSMapTbl[OSTaskID];
OSTaskReady &= ~TaskMap;
OSDlyTicks[OSTaskID] = Timeout; // if( Timeout==0 ) it'l wait for ever
OSSemTask[SemIndex] |= TaskMap;
OS_Sched();
if( (OSSemTask[SemIndex]&TaskMap)!=0 ) // 超时,信号量未就绪
{
OSSemTask[SemIndex] &= ~TaskMap;
OS_EXIT_CRITICAL();
return OS_TIMEOUT;
}
}
OSSemBuf[SemIndex]--;
OS_EXIT_CRITICAL();
return OS_NO_ERR;
}
/*
*********************************************************************************************************
* Post a semaphore
*********************************************************************************************************
*/
void OSSemPost (INT8U SemIndex) reentrant
{
INT8U WaitTask;
//OS_SIZE SemTask;
Assert( SemIndex<=OS_MAX_SEMS );
if( OSSemBuf[SemIndex]<255 )
{
OSSemBuf[SemIndex]++;
}
WaitTask = FindBitNum( OSSemTask[SemIndex] );
if( WaitTask<OS_MAX_TASKS )
{
//SemTask = OSMapTbl[WaitTask];
OSSemTask[SemIndex] &= ~OSMapTbl[WaitTask];//~SemTask;
OSTaskReady |= OSMapTbl[WaitTask];//SemTask;
OSNextTaskID = WaitTask;
OSDlyTicks[WaitTask] = 1;
OSCtxSw();
}
}
/*********************************************************************************************************/
INT8U OSSemQuery( INT8U SemIndex ) reentrant
{
return OSSemBuf[SemIndex];
}
#endif
/*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -