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

📄 jwl-gtf_convar.c

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

/********************************************************************************************************
*                                         jwl_gtf_ConVarFreeInit					*
* 描述:系统初始化全局全局条件变量									*
* 参数: 无												*
* 返回: jwl_gtf_void											*
*********************************************************************************************************/
_jwl_gtf_BuildFreeLinkInit(ConVar,jwl_gtf_MaxConVar)

/********************************************************************************************************
*                                        jwl_gtf_ConVarInit						*
* 描述:系统初始化全局全局条件变量									*
* 参数: 无												*
* 返回: 无												*
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_ConVarInit()
{
	jwl_gtf_ConVarID=0;
	jwl_gtf_ConVarUsed=jwl_gtf_NULL;	
	jwl_gtf_ConVarFreeInit();	
}

/********************************************************************************************************
*                                         jwl_gtf_DeleteHead						*
* 描述:系统初始化全局全局条件变量									*
* 参数: 无												*
* 返回: jwl_gtf_void											*
*********************************************************************************************************/
_jwl_gtf_BuildDeleteLinkHead(Link,jwl_gtf_ConVar)

/********************************************************************************************************
*                                      jwl_gtf_InsertLinkHead						*
* 描述:插入链表头											*
* 参数: 无												*
* 返回: jwl_gtf_void											*
*********************************************************************************************************/
_jwl_gtf_BuildInsertLinkHead(Link,jwl_gtf_ConVar)

/********************************************************************************************************
*                                        jwl_gtf_GetConVar						*
* 描述:从系统中获得条件变量										*
* 参数: 无												*
* 返回: jwl_gtf_ConVar											*
*********************************************************************************************************/
jwl_gtf_ConVar *jwl_gtf_GetConVar()
{
	jwl_gtf_ConVar *tmpConVar;
	if(jwl_gtf_ConVarFree==jwl_gtf_NULL)					/*没有可用资源*/
		return jwl_gtf_NULL;
	tmpConVar=jwl_gtf_ConVarFree;
	jwl_gtf_DeleteHead(jwl_gtf_ConVarFree);
	jwl_gtf_InsertLinkHead(jwl_gtf_ConVarUsed,tmpConVar);
	tmpConVar->jwl_gtf_Status=jwl_gtf_ConVarUnUsed;
	tmpConVar->jwl_gtf_ConVarID=jwl_gtf_ConVarID++;
	tmpConVar->jwl_gtf_ConVarLink=jwl_gtf_NULL;
	tmpConVar->jwl_gtf_Mutex=jwl_gtf_NULL;
	return 	jwl_gtf_ConVarFree;
}

/********************************************************************************************************
*                                        jwl_gtf_FindConVar						*
* 描述:和互斥量联合起来											*
* 参数: 	ConVarID										*
* 返回: 	jwl_gtf_TaskConVat									*
*********************************************************************************************************/
jwl_gtf_ConVar *jwl_gtf_FindConVar(jwl_gtf_u8 ConVarID)
{
	jwl_gtf_ConVar *tmpConVar;
	tmpConVar=jwl_gtf_ConVarFree;
	for(;tmpConVar!=jwl_gtf_NULL&&tmpConVar->jwl_gtf_ConVarID!=ID;\
	    tmpConVar=tmpConVar->jwl_gtf_Link->Next)
	return tmpConVar;
}

/********************************************************************************************************
*                                        jwl_gtf_ConVarConnectMutex					*
* 描述:和互斥量联合起来											*
* 参数: 	ConVarID										*
*		ConVar											*
*		MutexID											*
*		Mutex											*
* 返回: 	参看JWL-GTF.h										*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_ConVarConnectMutex(jwl_gtf_u8 ConVarID,jwl_gtf_ConVar *ConVar,jwl_gtf_TaskMutex *Mutex\
				,jwl_gtf_u8 TaskCBID,jwl_gtf_bool Staus)
{
	jwl_gtf_ConVar 	  *tmpConVar;
	jwl_gtf_TaskMutex *tmpMutex;
	if(Status!=jwl_gtf_ConVarFIFO&&Status!=jwl_gtf_LIFO&&Status!=jwl_gtf_ConVarPro)
		return jwl_gtf_ParaError;
	if(ConVar==jwl_gtf_NULL)
	{
		if(tmpConVar=jwl_gtf_FindConVar(ConVarID)==jwl_gtf_NULL)
			return jwl_gtf_NoConVarUsed;
	}
	else
		tmpConVar=ConVar;
	if(tmpMutex->jwl_gtf_Status==jwl_gtf_ConVarUsed)				/*条件变量是否被锁*/
		return jwl_gtf_ConVarLock;
	if(Mutex==jwl_gtf_NULL)
		tmpMutex=jwl_gtf_FundMutex(MutexID);
	else
		tmpMutex=Mutex;
	tmpConVar->jwl_gtf_Mutex=tmpMutex;						/*和互斥量连接*/
	tmpConVar->jwl_gtf_Status=jwl_gtf_ConVarUsed;					/*此资源已被用*/
	tmpConVar->jwl_gtf_WaiteStatus=Status;
	return jwl_gtf_NULL;
}

/********************************************************************************************************
*                                        jwl_gtf_LockConVar						*
* 描述:给自己连接的互斥量加锁										*
* 参数: 	ConVarID										*
*		ConVar											*
* 返回: 参看JWL-GTF.h											*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_LockConVar(jwl_gtf_ConVar *ConVar,jwl_gtf_u8 ID)
{
	jwl_gtf_ConVar *tmpConVar;
	if(ConVar==jwl_gtf_NULL)
	{
		if(tmpConViar=jwl_gtf_FindConVar(ID)==jwl_gtf_NULL)
			return jwl_gtf_NoConVarID;
	}
	else
		tmpConVar=ConVar;
	if(tmpConVar->jwl_gtf_Status!=jwl_gtf_ConVarUsed)
		return jwl_gtf_NotConnectMutex;						/*此条件变量没有连接到互斥量*/
	if(tmpConVar->jwl_gtf_Mutex==jwl_gtf_NULL)
		return jwl_gtf_Noerror;
	jwl_gtf_MutexLock(0,tmpConVar->jwl_gtf_Mutex,0);
	return jwl_gtf_Noerror;
}

/********************************************************************************************************
*                                        jwl_gtf_ConVarWait						*
* 描述:给自己连接的互斥量加锁										*
* 参数: 	ConVarID										*
*		ConVar											*
* 返回: 参看JWL-GTF.h											*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_ConVarWait(jwl_gtf_ConVar *ConVar,jwl_gtf_u8 ConVarID,jwl_gtf_u32 TimeOut)
{
	jwl_gtf_ConVar *tmpMutex;
	jwl_gtf_TaskCB *tmpTaskCB;
	jwl_gtf_s8	tmpRetCode;
	if(TimeOut<0)
		return jwl_gtf_ParaError;
	if(ConVar==jwl_gtf_NULL)
	{
		if(tmpConVar=jwl_gtf_FindConVar(ConVarID)==jwl_gtf_NULL)
			return 	jwl_gtf_NoConVarID;
	}
	else
		tmpConVar=ConVar;
	if(tmpConVar->jwl_gtf_Status=!jwl_gtf_ConVarUsed)			/*是否初始化*/
		return jwl_gtf_NotConnectMutex;
	if(tmpConVar->jwl_gtf_Mutex!=jwl_gtf_NULL)
		jwl_gtf_MutexUnLock();
	jwl_gtf_TaskRun->jwl_gtf_Status=jwl_gtf_ConVar;				/*线程变成条件变量状态*/
	jwl_gtf_TaskRun->jwl_gtf_ConVar=tmpConVar;
	if(tmpConVar->jwl_gtf_ConVarLink==jwl_gtf_NULL)				/*挂起指针为NULL*/
	{
		tmpConVar->jwl_gtf_ConVarLink=jwl_gtf_TaskRun;
		jwl_gtf_TaskRun->jwl_gtf_EvenLink->Next=jwl_gtf_NULL;
		jwl_gtf_TaskRun->jwl_gtf_EvenLink->Pre=tmpConVar->jwl_gtf_ConVarLink;
	}
	else									/*否则*/
	{
		tmpTaskCB=tmpConVar->jwl_gtf_ConVarLink;
		if(tmpConVar->jwl_gtf_WaiteStatus==jwl_gtf_ConVarFIFO)		/*先进先出*/
		{
			for(;tmpTaskCB->jwl_gtf_EvenLink->Next!=jwl_gtf_NULL;\
				tmpConVar=tmpConVar->jwl_gtf_EvenLink->Next)
			tmpTaskCB->jwl_gtf_EvenLink->Next=jwl_gtf_TaskRun;
			jwl_gtf_Run->jwl_gtf_EvenLink->Next=jwl_gtf_NULL;
			jwl_gtf_Run->jwl_gtf_EvenLink->Pre=tmpTaskCB;
		}
		else if(tmpConVar->jwl_gtf_WaiteStatus==jwl_gtf_ConVarLIFO)	/*后进先出*/
		{
			jwl_gtf_TaskRun->jwl_gtf_EvenLink->Next=tmpTaskCB;
			tmpTaskCB->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
			tmpTaskCB=jwl_gtf_TaskRun;
			jwl_gtf_TaskRun->jwl_gtf_EvenLink->Pre=tmpTaskCB;
		}
		else								/*按优先级*/
		{
			for(;tmpTaskCB!=jwl_gtf_NULL&&tmpTaskOCB->jwl_gtf_TaskPro>\
			  jwl_gtf_TaskRun->jwl_gtf_TaskPro;tmpTaskCB->jwl_gtf_EvenLink->Next)
			if(tmpTaskCB->jwl_gtf_EnevLink->Pre=tmpTaskCB)		/*头部*/
			{
				jwl_gtf_TaskRun->jwl_gtf_EvenLink->Next=tmpTaskCB;
				tmpTaskCB->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
				tmpTaskCB=jwl_gtf_TaskRun;
				jwl_gtf_TaskRun->jwl_gtf_EvenLink->Pre=tmpTaskCB;
			}
			else if(tmpTaskCB==jwl_gtf_NULL)			/*尾部*/
			{
				jwl_gtf_TaskRun->jwl_gtf_EvenLink->Next=tmpTaskCB;
				tmpTaskCB->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
				tmpTaskCB=jwl_gtf_TaskRun;
				jwl_gtf_TaskRun->jwl_gtf_EvenLink->Pre=tmpTaskCB;	
			}
			else							/*中间*/
			{
				jwl_gtf_Run->jwl_gtf_EvenLink->Next=tmpTaskCB;
				tmpTaskCB->jwl_gtf_EvenLink->Pre->jwl_gtf_EvenLink->Next=jwl_gtf_TaskRun;
				jwl_gtf_TaskRun->jwl_gtf_EvenLink->Pre=tmpTaskCB->jwl_gtf_EvenLink->Pre;
				tmpTaskCB->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
			}
		}
	}
	jwl_gtf_TaskRun->jwl_gtf_TimeOut=TimeOut;
	if(jwl_gtf_ConVarTOut==jwl_gtf_NULL)					/*是否为NULL*/
	{
		jwl_gtf_ConVarTOut=jwl_gtf_TaskRun;
		jwl_gtf_TaskRun->jwl_gtf_WaitTLink->Next=jwl_gtf_NULL;
		jwl_gtf_TaskRun->jwl_gtf_WatiTLink->Pre=jwl_gtf_ConVarTOut;	
	}
	else
	{
		jwl_gtf_TaskRun->jwl_gtf_WaitTLink->Next=jwl_gtf_ConVarTOut->jwl_gtf_WatTLink;
		jwl_gtf_ConVarTOut->jwl_gtf_WaitTLink->Pre=jwl_gtf_TaskRun;
		jwl_gtf_ConVarTOut=jwl_gtf_TaskRun;
		jwl_gtf_ConVarTOut->jwl_gtf_WaitTLink->Pre-jwl_gtf_ConVarTOut;		
	}
	jwl_gtf_FindRunTask();
	jwl_gtf_Switch
	tmpRetCode=jwl_gtf_TaskRun->jwl_gtf_RetCode;
	jwl_gtf_TaskRun->jwl_gtf_RetCode=jwl_Noerror;
	return tmpRetCode;
}

/********************************************************************************************************
*                                        jwl_gtf_CancelConVarWait					*
* 描述:取消挂起的进程											*
* 参数: 	ConVarID										*
*		ConVar											*
*		TaskID											*
*		Task											*
* 返回: 参看JWL-GTF.h											*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_CancelConVarVarWait(jwl_gtf_ConVar *ConVar,jwl_gtf_u8 ConVarID,jwl_gtf_TaskCB *Task\
	,jwl_gtf_U8 TaskID)
{
	jwl_gtf_TasCB  *tmpTaskCB,*oldTaskCB;
	jwl_gtf_ConVar *tmpConVar;
	jwl_gtf_TaskMutex *tmpMutex;
	if(TaskCB==jwl_gtf_NULL)
	{
		if(tmpTaskCB=jwl_gtf_FundByID(TaskCBID)==jwl_gtf_NULL)			/*检测任务ID号是否存在*/
			return jwl_gtf_NoTaskID;
	}
	else
		tmpTaskCB=TaskCB;
	if(tmpTaskCB->jwl_gtf_TaskStatus==jwl_gtfConVar)
		return jwl_gtf_NoCancelTaskCB;						/*此进程不在条件信号量挂起队列中*/
	if(ConVar==jwl_gtf_NULL)
	{
		if(tmpConVar=jwl_gtf_FindConVar(ConVarID)==jwl_gtf_NULL)
			return jwl_gtf_NoConVarID;
	}
	else
		tmpConVar=ConVar;
	if(ConVar->jwl_gtf_Status!=jwl_gtf_ConVarUsed)
		return jwl_gtf_ConVarNotUsed;
	oldTaskCB=tmpConVar->jwl_gtf_ConVarLink;
	for(;oldTaskCB!=jwl_gtf_NULL&&oldTaskCB!=tmpTaskCB;oldTaskCB->\
	   jwl_gtf_EvenLink->Next);
	if(oldTaskCB==jwl_gtf_NULL)
		return jwl_gtf_ConVarNotTask;						/*条件变量中没有挂起的线程*/
	tmpMutex=tmpConVar->jwl_gtf_Mutex;
	if(oldTaskCB->jwl_gtf_EvenLink->Pre==tmpConVar->jwl_gtf_ConVarLink)		/*是否在链表头*/
	{
		if(oldTaskCB->jwl_gtf_EvenLink->Next==jwl_gtf_NULL)			/*尾巴*/
		{
			tmpConVar->jwl_gtf_ConVarLink=jwl_gtf_NULL;
			tmpConVar->jwl_gtf_Mutex=jwl_gtf_NULL;
		}
		else									/*否则*/
		{
			tmpConVar->jwl_gtf_ConVarlink=tmpConVar->jwl_gtf_ConVarlink->\
				jwl_gtf_EvenLink->Next;
			tmpConVar->jwl_gtf_ConVarlink->jwl_gtf_EvenLink->Pre=\
				tmpConVar->jwl_gtf_ConVarlink;
		}
	}
	else if(oldTaskCB->jwl_gtf_EvenLink->Next==jwl_gtf_NULL)			/*尾巴*/
		oldTaskCB->jwl_gtf_EvenLink->Pre->jwl_gtf_EvenLink->Next=jwl_gtf_NULL;
	else										/*中间*/
	{
		oldTaskCB->jwl_gtf_EvenLink->Pre->jwl_gtf_EvenLink->Next=\
			oldTaskCB->jwl_gtf_EvenLink->Next;
		oldTaskCB->jwl_gtf_EvenLink->Next->jwl_gtf_EvenLink->Pre=\
			oldTaskCB->jwl_gtf_EvenLink->Pre;
	}
	oldTaskCB->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
	oldTaskCB->jwl_gtf_TaskStatus=jwl_gtf_Ready;
	if(oldTaskCB->jwl_gtf_WaitTLink!={jwl_gtf_NULL,jwl_gtf_NULL})				/*断开超时链表*/
	{
		if(oldTaskCB->jwl_gtf_WaitTLink->Pre==oldTaskCB)				/*在头部*/
		{
			if(oldTaskCB->jwl_gtf_WaitTLink->Next==jwl_gtf_NULL)
				jwl_gtf_ConVarTOut=jwl_gtf_NULL;
			else
			{
				jwl_gtf_ConVarTOut=jwl_gtf_ConVarTOut->jwl_gtf_WaitTLink->Next;
				jwl_gtf_ConVarTOut->jwl_gtf_WaitTLink->Pre=jwl_gtf_ConVarTOut;
			}
		}
		else if(oldTaskCB->jwl_gtf_WaitTLink->Next==jwl_gtf_NULL)			/*尾部*/
			oldTaskCB->jwl_gtf_WaitTLink->Pre->jwl_gtf_WaitTLink->Next=jwl_gtf_NULL;
		else										/*其他*/
		{
			oldTaskCB->jwl_gtf_WaitTLink->Pre->jwl_gtf_WaitTLink->Next=\
				oldTaskCB->jwl_gtf_WaitTLink->Next;
			oldTaskCB->jwl_gtf_WaitTLink->Next->jwl_gtf_WaitTLink->Pre=\
				oldTaskCB->jwl_gtf_WaitTLink->Pre;				
		}
		oldTaskCB->jwl_gtf_WaitTLink={jwl_gtf_NULL,jwl_gtf_NULL};
		oldTaskCB->jwl_gtf_TimeOut=0;		
	}
	oldTaskCB->jwl_gtf_ConVar=jwl_gtf_NULL;
	oldTaskCB->jwl_gtf_RetCode=jwl_gtf_HupUpTaskCancel;
	if(oldTaskCB->jwl_gtf_TaskPro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
	{
		tmpExchOCB=tmpTaskCB;
		jwl_gtf_Switch
	}
	return jwl_gtf_Noerror;
}

/********************************************************************************************************
*                                        jwl_gtf_CancelAllConWait					*

⌨️ 快捷键说明

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