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

📄 jwl-gtf_sem.c

📁 基于arm核的RTOS
💻 C
📖 第 1 页 / 共 2 页
字号:
/********************************************************************************************************
*                                                JWL-GTF						*
*                                           实时多任务操作系统						*
*					     								*
*      				              作者:JWL-GTF			                        *
*  					     日期:2004/03/18                                            *
*					 修改日期:2004/04/01						*
*                                       								*
*                                       功能说明:信号量详细实现功能					*
*********************************************************************************************************/

/*初始化宏定义*/
_jwl_gtf_BuildFreeLinkInit(Sem,jwl_gtf_MaxSem)

/********************************************************************************************************
*                                        jwl_gtf_SemInit						*
* 描述:系统初始化全局全局信号量										*
* 参数: 无												*
* 返回: 无												*
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_SemFreeInit()
{
	jwl_gf_SemID=0;
	jwl_gtf_SemUsed=jwl_gtf_NULL:
	jwl_gtf_SemWaitT=jwl_gtf_NULL;
	wl_gtf_SemFreeInit();
	retrun;
}

/********************************************************************************************************
*                                        jwl_gtf_GetSem							*
* 描述:获得空闲信号量											*
* 参数: SemID												*
*	Sem												*
* 返回: 参看JWL-GTF.H											*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_GetFreeSem(jwl_gtf_Sem *Sem,jwl_gtf_u8 *SemID)
{
	if(jwl_gtf_SemFree==jwl_gtf_NULL)
		return	jwl_gtf_NoSemRes;
	Sem=jwl_gtf_SemFree;
	if(jwl_gtf_SemFree->jwl_gtf_Link->Next=jwl_gtf_NULL)
		jwl_gtf_SemFree=jwl_gtf_NULL;
	else
	{
		jwl_gtf_SemFree=jwl_gtf_SemFree->jwl_gtf_Link->Next;
		jwl_gtf_SemFree->jwl_gtf_Link->Pre=jwl_gtf_SemFree;
	}
	if(jwl_gtf_SemUsed==jwl_gtf_NULL)
	{
		jwl_gtf_SemUsed=Sem;
		jwl_gtf_SemUsed->jwl_gtf_Link->Next=jwl_gtf_NULL;
		jwl_gtf_SemUsed->jwl_gtf_link->Pre=jwl_gtf_SemUsed;
	}
	else
	{
		Sem->jwl_gtf_Link->Next=jwl_gtf_SemUsed;
		jwl_gtf_SemUsed->jwl_gtf_Link->Pre=Sem;
		jwl_gtf_SemUsed=Sem;
		jwl_gtf_SemUsed->jwl_gtf_Link->Pre=jwl_gtf_SemUsed;
	}
	*SemID=Sem->jwl_gtf_SemID=jwl_gtf_SemID++;
	Sem->jwl_gtf_Status=jwl_gtf_SemUnInit;									/*初始化用*/
	return jwl_gtf_NULL:
}

/********************************************************************************************************
*                                        jwl_gtf_FindSem						*
* 描述:系统初始化全局全局互斥体										*
* 参数: SemID												*
* 返回: jwl_gtf_Sem											*
*********************************************************************************************************/
jwl_gtf_Sem *jwl_gtf_FindSem(jwl_gtf_u8 SemID)
{
	jwl_gtf_Sem *tmpSem;
	if(jwl_gtf_SemUsed==jwl_gtf_NULL)
		return jwl_gtf_NULL;
	tmpSem=jwl_gtf_SemUsed;
	for(;tmpSem&&tmpSem->jwl_gtf_SemID!=SemID;tmpSem=tmpSem->jwl_gtf_Link->Next)
	return tmpSem;	
}

/********************************************************************************************************
*                                        jwl_gtf_FreeSem						*
* 描述:系统初释放回收信号量										*
* 参数: SemID												*
*	Sem												*
* 返回: 参看JWL-GTF.H											*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_FreeSem(jwl_gtf_Sem *Sem,jwl_gtf_u8 SemID)
{
	jwl_gtf_Sem *tmpSem;
	if(Sem==jwl_gtf_NULL)
	{
		if(tmpSem=jwl_gtf_FindSem(SemID)==jwl_gtf_NULL)
			return jwl_gtf_NotSemID;
	}
	else
		tmpSem=Sem;
	if(tmpSem->jwl_gtf_Count!=tmpSem->jwl_gtf_Save&&tmpSem->Status!=jwl_gtf_SemUnInit)
		return jwl_gtf_SemResUsing;
	if(tmpSem->jwl_gtf_Link->Pre==tmpSem)
	{
		if(tmpSem->jwl_gtf_Link->Next==jwl_gtf_NULL)
			jwl_gtf_SemUsed=jwl_gtf_NULL;
		else
		{
			jwl_gtf_SemUsed=jwl_gtf_SemUsed->jwl_gtf_Link->Next;
			jwl_gtf_SemUsed->jwl_gtf_Link->Next=jwl_gtf_NULL;
			jwl_gtf_SemUsed->jwl_gtf_Link->Pre=jwl_gtf_SemUsed;			
		}
	}
	else if(tmpSem->jwl_gtf_Link->Next==jwl_gtf_NULL)
		tmpSem->jwl_gtf_Link->Pre->jwl_gtf_Link->Next=jwl_gtf_NULL;
	else
	{
		tmpSem->jwl_gtf_Link->Pre->jwl_gtf_Link->Next=\
			tmpSem->jwl_gtf_Link->Next;
		tmpSem->jwl_gtf_Link->Next->jwl_gtf_Link->Pre=\
			tmpSem->jwl_gtf_Link->Pre;
	}
	if(jwl_gtf_SemFree==jwl_gtf_NULL)
	{
		jwl_gtf_SemFree=tmpSem;
		jwl_gtf_SemFree->jwl_gtf_Link->Next=jwl_gtf_NULL;
		jwl_gtf_SemFree->jwl_gtf_Link->Pre=jwl_gtf_SemFree;
	}
	else
	{
		tmpSem->jwl_gtf_Link->Next=jwl_gtf_SemFree;
		jwl_gtf_SemFree->jwl_gtf_Link->Pre=tmpSem;
		jwl_gtf_SemFree=tmpSem;
		tmpSem->jwl_gtf_Link->Pre=tmpSem;
	}
	return jwl_gtf_NULL:
}

/********************************************************************************************************
*                                        jwl_gtf_SemInit						*
* 描述:系统初始化全局全局互斥体										*
* 参数: SemID												*
*	Sem												*
*	Count												*
*	WaitStatus											*
* 返回: 参看JWL-GTF.H											*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_SemInit(jwl_gtf_Sem *Sem,jwl_gtf_u8 SemID,jwl_gtf_u32 Count,jwl_gtf_bool Status)
{
	jwl_gtf_Sem *tmpSem;
	if(Count<=0)
		return jwl_gtf_ParaError;
	if(Status!=jwl_gtf_SemPro&&Status!=jwl_gtf_SemFIFO&&Status!=jwl_gtf_SemLIFO)
		return jwl_gtf_ParaError;
	if(Sem==jwl_gtf_NULL)
	{
		if(tmpSem=jwl_gtf_FindSem(SemID)==jwl_gtf_NULL)
			return jwl_gtf_NotSemID;
	}
	else
		tmpSem=Sem;
	if(tmpSem->jwl_gtf_Save!=-1)
		return jwl_gtf_SemInited;						/*已经初始化*/
	tmpSem->jwl_gtf_Count=Count;
	tmpSem->jwl_gtf_Save=Count;
	tmpSem->jwl_gtf_SemLink=jwl_gtf_NULL;
	tmpSem->jwl_gtf_WStatus=Status;
	tmpSem->jwl_gtf_Status=jwl_gtf_SemInit;
	return Noerror;
}

/********************************************************************************************************
*                                        jwl_gtf_GetSem							*
* 描述:获得空闲信号量											*
* 参数: SemID												*
*	Sem												*
*	TimeOut												*
* 返回: 参看JWL-GTF.H											*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_GetSem(jwl_gtf_Sem *Sem,jwl_gtf_u8 SemID,jwl_gtf_u32 TimeOut)
{
	jwl_gtf_TaskCB *tmpTaskCB;
	jwl_gtf_Sem *tmpSem;
	jwl_gtf_s8  tmpRetCode;
	if(TimeOut<0)
		return jwl_gtf_ParaError;
	if(Sem==jwl_gtf_NULL)
	{
		if(tmpSem=jwl_gtf_FindSem(SemID)==jwl_gtf_NULL)
			return jwl_gtf_NotSemID;		
	}
	else
		tmpSem=Sem;
	if(tmpSem->jwl_gtf_Status==jwl_gtf_SemUnInit)						/*信号量没有初始化*/
		returen jwl_gtf_SemNoInit;
	jwl_gtf_TaskRun->jwl_gtf_TaskStatus=jwl_gtf_TaskRun->jwl_gtf_TaskStatus|jwl_gtf_Sem;
	jwl_gtf_TaskRun->jwl_gtf_Sem=tmpSem;
	if(tmpSem->jwl_gtf_Count>0)
		tmpSem->jwl_gtf_Count--;
	else
	{
		
		if(tmpSem->jwl_gtf_SemLink==jwl_gtf_NULL)
		{
			tmpSem->jwl_gtf_SemLink=jwl_gtf_TaskRun;
			tmpSem->jwl_gtf_SemLink->jwl_gtf_EvenLink->Next=jwl_gtf_NULL;
			tmpSem->jwl_gtf_SemLink->jwl_gtf_EvenLink->Pre=tmpSem->jwl_gtf_SemLink;
		}
		else if(tmpSem->jwl_gtf_WStatus==jwl_gtf_Sem_Pro)			/*按优先级顺序*/
		{
			tmpTaskCB=tmpSem->jwl_gtf_SemLink;
			for(;tmpTaskCB->jwl_gtf_TaskPro<=jwl_gtf_TaskRun->jwl_gtf_TaskPro&&\
			  tmpTaskCB!=jwl_gtf_NULL;tmpTaskCB=tmpTaskCB->jwl_gtf_EvenLink->Next)
			if(tmpTaskCB->jwl_gtf_EvenLink->Pre=tmpTaskCB)
			{
				jwl_gtf_TaskRun->jwl_gtf_EvenLink->Next=tmpSem->jwl_gtf_SemLink;
				tmpSem->jwl_gtf_SemLink->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
				tmpSem->jwl_gtf_SemLink=jwl_gtf_TaskRun;
				tmpSem->jwl_gtf_SemLink->jwl_gtf_EvenLink->Pre=tmpSem->jwl_gtf_SemLink;
			}
			else if(tmpTaskCB!=jwl_gtf_NULL)
			{
				tmpTaskCB->jwl_gtf_EvenLink->Pre->jwl_gtf_EvenLink->Next=jwl_gtf_TaskRun;
				jwl_gtf_TaskRun->jwl_gtf_EvenLink->Pre=tmpTaskCB->jwl_gtf_EvenLink->Pre;
				jwl_gtf_TaskRun->jwl_EvenLink->Next=jwl_gtf_NULL;
			}
			else
			{
				tmpTaskCB->jwl_gtf_EvenLink->Pre->jwl_gtf_EvenLink->Next=jwl_gtf_TaskRun;
				jwl_gtf_TaskRun->jwl_gtf_EvenLink->Next=tmpTaskCB->jwl_gtf_EvenLink->Pre;
				tmpTaskCB->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
				jwl_gtf_TaskRun->jwl_gtf_EvenLink->Next=tmpTaskCB:
			}			
		}
		else if(tmpSem->jwl_gtf_WStatus==jwl_gtf_SemFIFO)		/*按先进先出*/
		{
			tmpTaskCB=tmpSem->jwl_gtf_SemLink;
			for(;tmpTaskCB->jwl_gtf_EnveLink->Next!=jwl_gtf_NULL;\
			   tmpTaskCB=tmpTaskCB->jwl_gtf_EvenLink->Next)
			tmpTaskCB->jwl_gtf_EvenLink->Next=jwl_gtf_TaskRun;
			jwl_gtf_TaskRun->jwl_gtf_EvenLink->Pre=tmpTaskCB;
			jwl_gtf_TaskRun->jwl_gtf_EvenLink->Next=jwl_gtf_NULL;
		}
		else								/*按后进先出*/
		{
			jwl_gtf_TaskRun->jwl_gtf_EvenLink->Next=tmpSem->jwl_gtf_SemLink;
			tmpSem->jwl_gtf_SemLink->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
			tmpSem->jwl_gtf_SemLink=jwl_gtf_TaskRun;
			tmpSem->jwl_gtf_SemLink->Pre=tmpSem->jwl_gtf_SemLink;
		}
		if(TimeOut>0)
		{
			if(jwl_gtf_SemWaitT==jwl_gtf_NULL)
			{
				jwl_gtf_SemWaitT=jwl_gtf_TaskRun;
				jwl_gtf_SemWaitT->jwl_gtf_WaitTLink->Next=jwl_gtf_NULL;
				jwl_gtf_SemWaitT->jwl_gtf_WaitTlink->Pre=jwl_gtf_SemWaitT;
			}
			else
			{
				jwl_gtf_TaskRun->jwl_gtf_WaitTLink->Next=jwl_gtf_SemWaitT;
				jwl_gtf_SemWaitT->jwl_gtf_WaitTLink->Pre=jwl_gtf_TaskRun;
				jwl_gtf_SemWaitT=jwl_gtf_TaskRun;
				jwl_gtf_SemWaitT->jwl_gtf_WaitTlink->Pre=jwl_gtf_SemWaitT;
			}
			jwl_gtf_TaskRun->jwl_gt_TimeOut=TimeOut;
		}
	}
	jwl_gtf_FindRunTask();
	jwl_gtf_Switch
	tmpRetCode=jwl_gtf_TaskCB->jwl_gtf_RetCode;
	jwl_gtf_TaskCB->jwl_gtf_RetCode=jwl_gtf_Noerror;
	return tmpRetCode;
}

/********************************************************************************************************
*                                        jwl_gtf_PutSem							*
* 描述:获得空闲信号量											*
* 参数: SemID												*
*	Sem												*
* 返回: 参看JWL-GTF.H											*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_PutSem(jwl_gtf_Sem *Sem,jwl_gtf_u8 SemID)
{
	jwl_gtf_TaskCB *tmpTaskCB;
	jwl_gtf_Sem *tmpSem;
	if(Sem==jwl_gtf_NULL)
	{
		if(tmpSem=jwl_gtf_FindSem(SemID)==jwl_gtf_NULL)
			return jwl_gtf_NotSemID;
	}
	else
		tmpSem=Sem;
	if(tmpSem->jwl_gtf_Status==jwl_gtf_SemUnInit)						/*信号量没有初始化*/
		returen jwl_gtf_SemNoInit;
	if(tmpSem->jwl_gtf_SemLink==jwl_gtf_NULL)
		tmpSem->jwl_gtf_Count++;
	else
	{
		tmpTaskCB=tmpSem->jwl_gtf_SemLink;
		if(tmpSem->jwl_gtf_SemLink->Next==jwl_gtf_NULL)
			tmpSem->jwl_gtf_SemLink=jwl_gtf_NULL;
		else
		{
			tmpSem->jwl_gtf_SemLink=tmpSem->jwl_gtf_SemLink->jwl_gtf_WaitTlink->Next;
			tmpSem->jwl_gtf_SemLink->jwl_gtf_WaitTLink->Pre=tmpSem->jwl_gtf_SemLink;
		}
		tmpTaskCB->jwl_gtf_TaskStatus=tmpTaskCB->jwl_gtf_TaskStatus&(!jwl_gtf_Sem);
		tmpTaskCB->jwl_gtf_Sem=jwl_gtf_NULL;
		if(tmpTaskCB->jwl_gtf_WaitTLink!={jwl_gtf_NULL,jwlgtf_NULL}

⌨️ 快捷键说明

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