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

📄 jwl-gtf_mutex.c

📁 基于arm核的RTOS
💻 C
📖 第 1 页 / 共 3 页
字号:
/********************************************************************************************************
*                                                JWL-GTF						*
*                                           实时多任务操作系统						*
*					     								*
*      				              作者:JWL-GTF			                        *
*  					     日期:2004/04/31                                            *
*					 修改日期:2004/04/31						*
*                                       								*
*                                       功能说明:多任务的互斥相关功能定义				*
*********************************************************************************************************/
/********************************************************************************************************
*                                         jwl_gtf_MutexFreeInit						*
* 描述:系统初始化全局全局互斥体										*
* 参数: 无												*
* 返回: jwl_gtf_void											*
*********************************************************************************************************/
_jwl_gtf_BuildFreeLinkInit(Mutex,jwl_gtf_MutexMax)

/********************************************************************************************************
*                                        jwl_gtf_MutexInit						*
* 描述:系统初始化全局全局互斥体										*
* 参数: 无												*
* 返回: 无												*
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_MutexInit()
{
	jwl_gtf_MutexFreeInit();
	jwl_gtf_MutexUse=jwl_gtf_NULL;
	jwl_gtf_MutexID=0;
	return ;
}

/********************************************************************************************************
*                                          jwl_gtf_DeleteLinkHead					*
* 描述:从不用链表头中短开										*
* 参数: 无												*
* 返回: jwl_gtf_void											*
*********************************************************************************************************/
_jwl_gtf_BuildDeleteLinkHead(Link,jwl_gtf_TaskMutex)

/********************************************************************************************************
*                                          jwl_gtf_DeleteLinkTail					*
* 描述:从不用链表尾中短开										*
* 参数: 无												*
* 返回: jwl_gtf_void											*
*********************************************************************************************************/
_jwl_gtf_BuildDeleteLinkTail(Link,jwl_gtf_TaskMutex)

/********************************************************************************************************
*                                          jwl_gtf_InsertLinkHead					*
* 描述:插入可用链表头											*
* 参数: 无												*
* 返回: jwl_gtf_void											*
*********************************************************************************************************/
_jwl_gtf_BuildDInsertLinkHead(Link,jwl_gtf_TaskMutex)

/********************************************************************************************************
*                                          jwl_gtf_InsertLinkTail					*
* 描述:插入可用链表尾											*
* 参数: 无												*
* 返回: jwl_gtf_void											*
*********************************************************************************************************/
_jwl_gtf_BuildDInsertLinkTail(Link,jwl_gtf_TaskMutex)

/********************************************************************************************************
*                                        jwl_gtf_MutexGet						*
* 描述:获得互斥体											*
* 参数: ID		:系统返回互斥体ID号								*
*	Mutex		:系统返回互斥体指针								*
*	Protocol	:优先级反转协议									*
*	Status		:挂起队列的排列顺序方式								*
* 返回: :参看JWL-GTF_error.h										*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_MutexGet(jwl_gtf_u8 *ID,jwl_gtf_TaskMutex *Mutex,jwl_gtf_bool Protocol,jwl_gtf_bool Status)
{
	jwl_gtf_TaskMutex *tmpMutex;
	if(jwl_gtf_MutexFree==jwl_gtf_NULL)					/*是否有可用的资源*/
		return jwl_gtf_NoMutex;						/*没有可用的互斥体资源*/
	if(Protocol!=jwl_gtf_MutexNone&&Prococol!=jwl_gtf_MutexInherit)
		return jwl_gtf_ParaError;
	if(Status!=jwl_gtf_MutexPro&&Status!=jwl_gtf_MutexFIFO&&\
	   Status!=jwl_gtf_MutexLIFO)
	   	return jwl_gtf_ParaError;
	if(jwl_gtf_MutexFree==jwl_gtf_NULL)
		return jwl_gtf_NoMutex;
	tmpMutex=jwl_gtf_MutexFree;
	jwl_gtf_DeleteLinkHead(jwl_gtf_MutexFree);				/*从空链表中得到一个资源*/
	jwl_gtf_InsertLinkHead(jwl_gtf_MutexUse,tmpMutex);
	Mutex=tmpMutex;
	Mutex->jwl_gtf_Status=jwl_gtf_Usable;
	Mutex->jwl_gtf_MutexID=jwl_gtf_MutexID++;
	Mutex->jwl_gtf_MutexProtocol=Protocol;
	Mutex->jwl_gtf_WaitStatus=Status;
	Mutex->jwl_gtf_MutexLink=jwl_gtf_NULL;
	Mutex->jwl_gtf_Using=jwl_gtf_NULL;
	Mutex->jwl_gtf_RevOCB=jwl_gtf_NULL;
	Mutex->jwl_gtf_TOutReturnCode=jwl_gtf_Noerror;
	return jwl_gtf_Noerror;
}

/********************************************************************************************************
*                                        jwl_gtf_FindMutex						*
* 描述:获得互斥体											*
* 参数: ID		:给出的互斥体ID号								*
*	Mutex		:系统返回的互斥体指针								*
* 返回: :参看JWL-GTF_error.h										*
*********************************************************************************************************/
jwl_gtf_TaskMutex *jwl_gtf_FindMutex(jwl_gtf_u8 ID)
{
	jwl_gtf_TaskMutex *tmpMutex;
	tmpMutex=jwl_gtf_MutexFree;
	for(;tmpMutex->jwl_gtf_MutexID!=ID&&tmpMutex!=jwl_gtf_NULL;\
		tmpMutex=tmpMutex->jwl_gtf_StatusLink->Next)
	return tmpMutex;
}

/********************************************************************************************************
*                                          jwl_gtf_InsertMutexLinkHead					*
* 描述:插入可用链表头											*
* 参数: 无												*
* 返回: jwl_gtf_void											*
*********************************************************************************************************/
_jwl_gtf_BuildDInsertLinkHead(NutexLink,jwl_gtf_TaskMutex)

/********************************************************************************************************
*                                        jwl_gtf_ProiRevert						*
* 描述:获得互斥体											*
* 参数: TaskCB1		:给出的要反转的线程								*
*	TaskCB2		:给出的要反转的线程								*
* 返回: :jwl_gtf_voide											*
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_ProiRevert(jwl_gtf_TaskCB *TaskCB1,jwl_gtf_TaskCB *TaskCB2)
{
	jwl_gtf_List *List;
	jwl_gtf_u8    tmpPro;
	List=TaskCB1->jwl_gtf_Link;
	TaskCB1->jwl_gtf_Link=TaskCB2->jwl_gtf_Link;
	TaskCB2->jwl_gtf_Link=List;
	tmpPro=TaskCB1->jwl_gtf_TaskPro;
	TaskCB1->jwl_gtf_TaskPro=TaskCB2->jwl_gtf_TaskPro;
	TaskCB2->jwl_gtf_TaskPro=tmpPro;
	return;
}

/********************************************************************************************************
*                                        jwl_gtf_FindRunTask						*
* 描述:重新确定可运行的线程										*
* 返回: :jwl_gtf_void											*
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_FindRunTask()
{
	jwl_gtf_TaskCB	*tmpTaskCB;
	tmpTaskCB=jwl_gtf_TaskRDFirst;
	for(;tmpTaskCB->jwl_gtf_TaskStatus&jwl_gtf_Ready!=0&&tmpTaskCB->jwl_gtf_TaskProi==\
		jwl_gtf_MaxTask;tmpTaskCB=tmpTaskCB->jwl_gtf_Link->Next)
	tmpExchOCB=tmpTaskCB;
	return;
}

/********************************************************************************************************
*                                        jwl_gtf_MutexLock						*
* 描述:获得互斥体											*
* 参数: MutexID		:给出的互斥体ID号								*
*	Mutex		:给出的互斥体指针								*
*	TimeOut		:超时时间									*
* 返回: :参看JWL-GTF_error.h										*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_MutexLock(jwl_gtf_u8 MutexID,jwl_gtf_TaskMutex *Mutex,jwl_gtf_u32 TimeOut)
{
	jwl_gtf_TaskMutex *tmpMutex;
	jwl_gtf_TaskCB	  *tmpTaskCB;
	jwl_gtf_s8	   tmpRetCode;
	if(TimeOut<0)
		return jwl_gtf_ParaError;
	if(Mutex==jwl_gtf_NULL)						/*互斥体控制块是否为空*/
	{
		if(tmpMutex=jwl_gtf_FindMutex(MutexID)==jwl_gtf_NULL)	/*用ID号找互斥体*/
			return	jwl_gtf_NoFindMutex;
	}
	else
		tmpMutex=Mutex;
	if(tmpMutex->jwl_gtf_Using==jwl_gtf_TaskRun)
		return jwl_gtf_NotMutexNest;				/*互斥体不能嵌套自己*/
	if(tmpMutex->jwl_gtf_Status==jwl_gtf_Usable)			/*互斥体是否可用*/
	{
		jwl_gtf_TaskRun->jwl_gtf_Mutex=tmpMutex;
		tmpMutex->jwl_gtf_Using=jwl_gtf_TaskRun;
		tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
		jwl_gtf_TaskRun->jwl_gtf_Status=jwl_gtf_Ready|jwl_gtf_Mutex;
	}
	else								/*被占用*/
	{
		jwl_gtf_TaskRun->jwl_gtf_Status=jwl_gtf_Hupup|jwl_gtf_Mutex;
		jwl_gtf_TaskRun->jwl_gtf_Mutex=tmpMutex;
		if(tmpMutex->jwl_gtf_MutexLink==jwl_gtf_NULL)		/*挂起队列指针为空*/
		{
			tmpMutex->jwl_gtf_MutexLink=jwl_gtf_TaskRun;
			jwl_gtf_TaskRun->jwl_gtf_EvenLink->Next=jwl_gtf_NULL;
			jwl_gtf_TaskRun->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
		}
		else							/*挂起队列非空*/
		{
			tmpTaskCB=tmpMutex->jwl_gtf_MutexLink;
			if(tmpMutex->jwl_gtf_WaitStatus==jwl_gtf_MutexPro)	/*优先级先后顺序*/
			{
				for(;tmpTaskCB->jwl_gtf_TaskPro<=jwl_gtf_TaskRun->jwl_gtf_TaskPro\
				  &&tmpTaskCB!=jwl_gtf_NULL;tmpTaskTaskCB=tmpTaskCB->jwl_gtf_MutexLink)
				if(tmpTaskCB->jwl_gtf_Pre=tmpTaskCB)		/*是否在链表头*/
				{
					tmpTaskCB->jwl_gtf_EvenLink->Next=jwl_gtf_TaskRun->jwl_gtf_MutexLink;
					tmpMutex->jwl_gtf_MutexLink->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
					tmpMutex->jwl_gtf_MutexLink=jwl_gtf_TaskRun;
					tmpMutex->jwl_gtf_MutexLink->Pre=jwl_gtf_TaskRun->jwl_gtf_MutexLink;
				}
				else if(tmpTaskCb->jwl_gtf_EvenLink->Next=jwl_gtf_NULL)/*是否在链表尾*/
				{
					tmpTaskCB->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=tmpTaskCB;
					jwl_gtf_TaskRun->jwl_gtf_EvenLink->Pre=tmpTaskCB->jwl_gtf_EvenLink->Pre;
					tmpTaskCB->jwl_gtf_EvenLink->Pre->jwl_gtf_EvenLink->Next=jwl_gtf_TaskRun;
					tmpTaskCB->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
				}
			}
			else if(tmpMutex->jwl_gtf_WaitStatus==jwl_gtf_MutexFIFO)	/*先进先出*/
			{
				for(;tmpTaskCB->jwl_gtf_EvenLink->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_Next=jwl_gtf_NULL;
			}
			else								/*后进先出*/
			{
				jwl_gtf_TaskRun->jwl_gtf_EvenLik->Next=tmpMutex->jwl_gtf_MutexLink;
				tmpMutex->jwl_gtf_MutexLink->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
				tmpMutex->jwl_gtf_MutexLink=jwl_gtf_TaskRun;
				jwl_gtf_TaskRun->jwl_gtf_EvenLink->Pre=tmpMutex->jwl_gtf_MutexLink;			
			}
			if(TimeOut!=0)								/*处理超时*/
			{
				jwl_gtf_TaskRUn->jwl_gtf_TimeOut=TimeOut;
				if(jwl_gtf_TOutMutex==jwl_gtf_NULL)				/*互斥超时队列为空*/
				{
					jwl_gtf_TOutMutex=jwl_gtf_TaskRun;
					jwl_gtf_TaskRun->jwl_gtf_WaitTLink->Next=jwl_gtf_NULL;
					jwl_gtf_TaskRun->jwl_gtf_WaitTLink->Pre=jwl_gtf_TOutMutex;	
				}
				else								/*不为空*/
				{
					jwl_gtf_TaskRun->jwl_gtf_WaitTLink->Next=jwl_gtf_TOutMutex;
					jwl_gtf_TOutMutex->jwl_gtf_WaitTLink->Pre=jwl_gtf_TaskRun;
					jwl_gtf_TOutMutex=jwl_gtf_TaskRun;
					jwl_gtf_TaskRun->jwl_gtf_WaitTLink->Pre=jwl_gtf_TOutMutex;
				}
			}
			if(tmpMutex->jwl_gtf_MutexProtocol==jwl_gtf_MutexInherit)		/*优先级反转处理*/
			{
				if(tmpMutex->jwl_gtf_Using->jwl_gtf_TaskPro>			/*判断当前进程优先级是否大*/
				   jwl_gtf_TaskRun->jwl_gtf_TaskRpo)
				{
					if(tmpMutex->jwl_gtf_Status=jwl_gtf_Using)		/*运行没有优先级反转*/
						tmpMutex->jwl_gtf_Status=jwl_gtf_ProRev;
					else							/*运行且已经是优先级反转*/
						jwl_gtf_ProiRevert(tmpMutex->jwl_gtf_Using,tmpMutex->jwl_gtf_RevOCB);
					tmpMutex->jwl_gtf_RevOCB=jwl_gtf_TaskRun;
					jwl_gtf_ProiRevert(tmpMutex->jwl_gtf_Using,tmpMutex->jwl_gtf_RevOCB);
				}
			}
		}
		jwl_gtf_FindRunTask();
		jwl_gtf_Switch
		tmpRetCode=jwl_gtf_TaskRun->jwl_gtf_RetCode;
		jwl_gtf_TaskRun->jwl_gtf_RetCode=jwl_gtf_Noerror;
		return tmpRetCode;
	}
	return jwl_gtf_Noerror;
}

/********************************************************************************************************
*                                        jwl_gtf_TryMutexLock						*
* 描述:试图获得互斥体,否则退出不等待,失败								*
* 参数: MutexID		:给出的互斥体ID号								*
*	Mutex		:给出的互斥体指针								*
* 返回: :参看JWL-GTF_error.h										*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_TryMutexLock(jwl_gtf_u8 MutexID,jwl_gtf_TaskMutex *Mutex)
{
	jwl_gtf_TaskMutex *tmpMutex;
	if(Mutex==jwl_gtf_NULL)						/*互斥体控制块是否为空*/
	{
		if(tmpMutex=jwl_gtf_FindMutex(MutexID)==jwl_gtf_NULL)	/*用ID号找互斥体*/
			return	jwl_gtf_NoFindMutex;
	}
	else
		tmpMutex=Mutex;
	if(tmpMutex->jwl_gtf_Stauts!=jwl_gtf_Usable)
		return jwl_gtf_NoUsableMutex;
	else
	{
		jwl_gtf_TaskRun->jwl_gtf_Mutex=tmpMutex;
		tmpMutex->jwl_gtf_Using=jwl_gtf_TaskRun;
		tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
		jwl_gtf_TaskRun->jwl_gtf_Status=jwl_gtf_Ready|jwl_gtf_Mutex;
		return jwl_gtf_Noerror;
	}
}

/********************************************************************************************************
*                                        jwl_gtf_MutexUnLock						*
* 描述:解锁互斥体											*
* 返回: :参看JWL-GTF_error.h										*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_MutexUnLock()
{
	jwl_gtf_Mutex  *tmpMutex;
	jwl_gtf_TaskCB *tmpTaskCB,*oldTaskCB;
	if(jwl_gtf_TaskRun->jwl_gtf_Mutex==jwl_gtf_NULL)

⌨️ 快捷键说明

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