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

📄 jwl-gtf_mutex.c

📁 基于arm核的RTOS
💻 C
📖 第 1 页 / 共 3 页
字号:
	{
		tmpMutex=tmpTaskCB->jwl_gtf_Mutex;
		if(tmpMutex->jwl_gtf_Using==tmpTaskCB)
			return jwl_gtf_NotCancelMutex;
		tmpTaskCB->jwl_gtf_RetCode=jwl_gtf_HupUpTaskCancel;
		if(tmpMutex->jwl_gtf_RevOCB==tmpTaskCB)		/*反转优先指定线程的优先级*/
		{
			jwl_gtf_ProiRevert(tmpMutex->jwl_gtf_Using,tmpMutex->jwl_gtf_RevOCB);/*恢复原状态*/
			tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
			tmpMutex->RevOCB=jwl_gtf_NULL;
		}
		if(tmpMutex->jwl_gtf_MutexLink==tmpTaskCB)		/*链表头*/
		{
			if(tmpTaskCB->jwl_gtf_EvenLink->Next==jwl_gtf_NULL)/*只有一个挂起*/
				tmpMutex->jwl_gtf_MutexLink=jwl_gtf_NULL;
			else						/*否则*/
			{
				tmpMutex->jwl_gtf_EvenLink=tmpMutex->jwl_gtf_MutexLink->\
					jwl_gtf_EvenLink->Next;
				tmpMutex->jwl_gtf_EvenLink->jwl_gtf_EvenLink->Pre=tmpMutex->jwl_gtf_EvenLink;
			}
		}
		else if(tmpTaskCB->jwl_gtf_EvenLink->Next=jwl_gtf_NULL)	/*链表尾*/
			tmpTaskCB->jwl_gtf_EvenLink->Pre->jwl_gtf_EvenLink->Next=jwl_gtf_NULL;
		else							/*中间*/
		{
			tmpTaskCB->jwl_gtf_EvenLink->Pre->jwl_gtf_EvenLink->Next=\
				tmpTaskCB->jwl_gtf_EvenLink->Next;
			tmpTaskCB->jwl_gtf_EvenLink->Next->jwl_gtf_EvenLink->Pre=\
				tmpTaskCB->jwl_gtf_EvenLink->Pre;
		}
		tmpTaskCB->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
		tmpTaskCB->jwl_gtf_Mutex=jwl_gtf_NULL;
		tmpTaskCB->jwl_gtf_TaskStatus=tmpTaskCB->jwl_gtf_TaskStatus&(!jwl_gtf_Mutex);
		if(tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink!={jwl_gtf_NULL,jwl_gtf_NULL})
		{
			if(tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Pre==jwl_gtf_TOutMutex)
			{
				jwl_gtf_TOutMutex=jwl_gtf_TOutMutex->jwl_gtf_WatiTLink->Next;
				jwl_gtf_TOutMutex->jwl_gtf_WaitTLink->Pre=jwl_gtf_TOutMutex;						
			}
			else if(tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Next==jwl_gtf_NULL)
				tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Pre->\
				    jwl_gtf_WaitTLink->Next=jwl_gtf_NULL;
			else
			{
				tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Pre->jwl_gtf_WaitTLink\
				  ->Next=tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Next;
				tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Next->jwl_gtf_WaitTLink\
				  ->Pre=tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Pre;
			}
			tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink={jwl_gtf)NULL,jwl_gtf_NULL};
		}
		if(tmpTaskCB->jwl_gtf_TaskPro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
		{
			tmpExchOCB=tmpTaskCB;
			jwl_gtf_Switch
		}
		return jwl_gtf_Noerror;
	}
}

/********************************************************************************************************
*                                        jwl_gtf_CancelAllMutexLock					*
* 描述:取消所有等待线程											*
* 参数: MutexID		:给出的互斥体ID号								*
*	Mutex		:给出的互斥体指针								*
* 返回: :参看JWL-GTF_error.h										*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_CancelAllMutexLock(jwl_gtf_TaskMutex *Mutex,jwl_gtf_u8 MutexID)
{
	jwl_gtf_TaskMutex *tmpMutex;
	jwl_gtf_TaskCB	  *tmpTaskCB,*oldTaskCB,*TaskCB;
	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_Status=jwl_gtf_Usable)
		return jwl_gtf_MutexUsef
	else
	{
		if(tmpMutex->jwl_gtf_Using==jwl_gtf_NULL||tmpMutex->jwl_gtf_MutexLink==jwl_gtf_NULL)
			return jwl_gtf_Noerror;
		if(tmpMutex->jwl_gtf_RevOCB!=jwl_gtf_NULL)			/*是否有反转*/
		{
			jwl_gtf_ProiRevert(tmpMutex->jwl_gtf_Using,tmpMutex->jwl_gtf_RevOCB);
			tmpMutex->jwl_gtf_RevPCB=jwl_gtf_NULL:
		}
		tmpTaskC=jwl_gtf_get_idle();
		oldTaskCB=tmpMutex->jwl_gtf_MutexLink;
		jwl_gtf_TOutMutex=jwl_gtf_NULL;
		for(;oldTaskCB!=jwl_gtf_NULL;)
		{
			Task=oldTaskCB;
			oldTaskCB=toldTaskCB->jwl_gtf_EvenLink->Next;
			Task->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
			Task->jwl_gtf_Mutex=jwl_gtf_NULL:
			Task->jwl_gtf_RetCode=jwl_gtf_HupUpTaskCancel;
			Task->jwl_gtf_TaskStatus=Task->jwl_gtf_TaskStatus&(!jwl_gtf_Mutex);			
			oldTaskCB->jwl_gtf_WaitTLink={jwl_gtf_NULL,jwl_gtf_NULL};		
			if(tmpTaskCB->jwl_gtf_TaskPro<Task->jwl_gtf_TaskPro)
				tmpTaskCB=TaskCB;
		}
		oldTaskCB=tmpMutex->jwl_gtf_Using;
		tmpTaskCB->jwl_gtf_Using=jwl_gtf_NULL;
		tmpMutex->jwl_gtf_Status=jwl_gtf_Usable;
		oldTaskCB->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
		oldTaskCB->jwl_gtf_TaskStatus=oldTaskCB->jwl_gtf_TaskStatus&(!jwl_gtf_Mutex);
		if(oldTaskCB->jwl_gtf_TaskPro<TaskCB->jwl_gtf_TaskPro)
			tmpTaskCB=oldTaskCB;
		if(tmpTaskCB->jwl_gtf_TaskPro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
		{
			tmpExchOCB=tmpTaskCB;
			jwl_gtf_Switch
		}
		return jwl_gtf_Noerror;
	}
}

/********************************************************************************************************
*                                        jwl_gtf_SetMutexProtocol					*
* 描述:获得互斥体											*
* 参数: ID		:给出的互斥体ID号								*
*	Mutex		:给出的互斥体指针								*
*	Protocol	:优先级反转处理协议								*
* 返回: :参看JWL-GTF_error.h										*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_SetMutexProtocol(jwl_gtf_u8 ID,jwl_gtf_TaskMutex *Mutex,jwl_gtf_bool Protocol)
{
	jwl_gtf_TaskMutex *tmpMutex;
	jwl_gtf_TaskCB	*tmpTaskCB,*oldTaskCB;
	if(Protocol!=jwl_gtf_MutexNone&&Protocol!=jwl_gtf_MutexInherit)			/*判断参数是否合法*/
		return jwl_gtf_ParaError;
	if(Mutex==jwl_gtf_NULL)
	{
		if(tmpMutex=jwl_gtf_FindMutex(ID)==jwl_gtf_NULL)
			return jwl_gtf_NoFindMutex;
	}
	else
		tmpMutex=Mutex;
	if(tmpMutex->jwl_gtf_MutexProtocol==Protocol)
		return jwl_gtf_Noerror;
	tmpMutex->jwl_gtf_MutexProtocol=Protocol;		
	if(Protocol==jwl_gtf_MutexInherit)							/*变成反转*/
	{
		odlTaskCB=jwl_gtf_get_idle();
		tmpTaskCB=tmpMutex->jwl_gtf_MutexLink;
		for(;tmpTaskCB!=jwl_gtf_NULL;tmpTaskCB=tmpTaskCB->jwl_gtf_EvenLink->Next)
		{
			if(tmpTaskCB->jwl_gtf_TaskPro<oldTaskCB->jwl_gtf_TaskPro)
				oldTaskCB=tmpTaskCB;
		}
		if(oldTaskCB!=jwl_gtf_NULL&&oldTaskCB->jwl_gtf_TaskPro<tmpMutex->\
			jwl_gtf_Using->jwl_gtf_TaskPro)
		{
			jwl_gtf_ProiRevert(odlTaskCB,tmpMutex->jwl_gtf_Using);
			tmpMutex->jwl_gtf_Status=jwl_gtf_ProRev;
			tmpMutex->jwl_gtf_RevOCB=oldTaskCB;
			if(tmpMutex->jwl_gtf_Using->jwl_gtf_TaskPro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
			{
				tmpExchOCB=tmpMutex->jwl_gtf_Using;
				jwl_gtf_Switch
			}
		}
	}
	else										/*变成没有反转*/
	{
		if(tmpMutex->jwl_gtf_RevOCB!=jwl_gtf_NULL)
		{
			jwl_gtf_ProiRevert(tmpMutex->jwl_gtf_Using,tmpMutex->RevOCB);
			tmpMutex->RevOCB=jwl_gtf_NULL;
			if(jwl_gtf_TaskRun==tmpMutex->jwl_gtf_Using)
			{
				jwl_gtf_FindRunTask();
				jwl_gtf_Switch
			}
			else
			{
				if(tmpMutex->jwl_gtf_Using->jwl_gtf_TaskPro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
				{
					tmpExchOCB=tmpMutex->jwl_gtf_Using;
					jwl_gtf_Switch	
				}
			}
		}
	}
	return jwl_gtf_Noerror;
}

/********************************************************************************************************
*                                        jwl_gtf_GettMutexInfo						*
* 描述:获得互斥体											*
* 参数: ID		:给出的互斥体ID号								*
*	Mutex		:给出的互斥体指针								*
* 返回: 		:jwl_gtf_MutexInfo指针								*
*********************************************************************************************************/
jwl_gtf_MutexInfo *jwl_gtf_GettMutexInfo(jwl_gtf_u MutexID,jwl_gtf_TaskMutex *Mutex)
{
	jwl_gtf_TaskMutex *tmpMutex;
	jwl_gtf_MutexInfo *Info;
	if(Mutex==jwl_gtf_NULL)
		tmpMutex=jwl_gtf_FindMutex(ID);
	
	else
		tmpMutex=Mutex;
	if(tmpMutex==jwl_gtf_NULL)
		return jwl_gtf_NULL;
	Info->jwl_gtf_Status=tmpMutex->jwl_gtf_Status;
	Info->jwl_gtf_MutexProtocol=tmpMutex->jwl_gtf_MutexProtocol;
	Info->jwl_gtf_WaitStatus=tmpMutex->jwl_gtf_WaitStatus;
	return Info;
}

/********************************************************************************************************
*                                        jwl_gtf_MutexFree						*
* 描述:获得互斥体											*
* 参数: ID		:给出的互斥体ID号								*
*	Mutex		:给出的互斥体指针								*
*	Status		:给出的处理状态									*
* 返回: :参看JWL-GTF_error.h										*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_MutexFree(jwl_gtf_u8 ID,jwl_gtf_TaskMutex *Mutex,jwl_gtf_bool Status)
{
	jwl_gtf_TaskMutex *tmpMute;
	jwl_gtf_TaskCB *tmpOCB;
	jwl_gtf_u8 tmpPro;
	if(Mutex!=jwl_gtf_NULL)						/*是否为空*/
	{
		if(tmpMutex=jwl_gtf_Findmutex(ID)==jwl_gtf_NULL)	/*是空则用ID查找互斥体*/
			return jwl_gtf_NoFindMutex;
	}
	else
		tmpMutex=Mutex;
	if(tmpMutex->jwl_gtf_Using!=jwl_gtf_NULL)			/*有线程在用*/
	{
		if(Status==jwl_gtf_Realse)
			jwl_gtf_CancelAllMutexLock(tmpMutex,0);
		else
			return jwl_gtf_NotCancelMutex
	}
	if(tmpMute->jwl_gtf_Link->Pre=jwl_gtf_MutexUse)
		jwl_gtf_DeleteLinkHead(jwl_gtf_MutexUse);
	else
		jwl_gtf_DeleteLinkHead(tmpMutex);
	jwl_gtf_DeleteLinkTail(jwl_gtf_MutexFree,tmpMutex);
	return jwl_gtf_NULL;
}

/********************************************************************************************************
*                                        jwl_gtf_MutexToutDeal						*
* 描述:获得互斥体											*
* 返回: jwl_gtf_void											*
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_MutexToutDeal()
{
	jwl_gtf_TaskCB *tmpTaskCB,*oldTaskCB,*Task,Task1;
	if(jwl_gtf_TOutMutex==jwl_gtf_NULL)
		return;
	else
	{
		tmpTaskCB=jwl_gtf_TOutMutex;
		for(;tmpTaskCB!=jwl_gtf_NULL;)
		{
			oldTaskCB=tmpTaskCB->jwl_gtf_WaitTLink->Next;
			tmpTaskCB=tmpTaskCB->jwl_gtf_WaitTLink->Pre;
			if(--tmpTaskCB->jwl_gtf_TimeOut==0)
			{
				if(tmpTaskCB->jwl_gtf_Mutex->jwl_gtf_RevOCB==tmpTaskCB)
				{
					jwl_gtf_ProiRevert(jwl_gtf_TimeOut->jwl_gtf_Mutex->jwl_gtf_Using,tmpTaskCB);
					Task=tmpTaskCB->jwl_gtf_Mutex->jwl_gtf_MutexLink;
					Task1=jwl_gtf_get_idle();
					for(;Task!=jwl_gtf_NULL;Task=Task->jwl_gtf_EvenLink->Next)
					{
						if(Task->jwl_gtf_TaskPro<Task1->jwl_gtf_TaskPro&&Task1!=tmpTaskCB\
						   &&Task->jwl_gtf_TimeOut!=2)
							Task1=Task;
					}
					if(Task1!=jwl_gtf_NULL&&Task1->jwl_gtf_TaskPro<tmpTaskCB->jwl_gtf_Mutex->\
					  jwl_gtf_Using->jwl_gtf_TaskPro)
					{
						jwl_gtf_ProiRevert(jwl_gtf_TimeOut->jwl_gtf_Mutex->jwl_gtf_Using,TaskCB1);
						tmpTaskCB->jwl_gtf_Mutex->RevOCB=Task1;
					}
					else
					{
						tmpTaskCB->jwl_gtf_Mutex->jwl_gtf_Status=jwl_gtf_Using;
						tmpTaskCB->jwl_gtf_Mutex->RevOCB=jwl_gtf_NULL;							
					}				
				}
				if(tmpTaskCB->jwl_gtf_WaitTLink->Pre==jwl_gtf_TOutMutex)
				{
					if(tmpTaskCB->jwl_gtf_WaitTLink->Next=jwl_gtf_NULL)
						jwl_gtf_TimeOut=jwl_gtf_NULL;
					else
					{
						jwl_gtf_TimeOut=jwl_gtf_TimeOut->jwl_gtf_WaitTLink->Next;
						jwl_gtf_TimeOut->jwl_gtf_WaitTLink->Pre=jwl_gtf_TimeOut;
					}
				}
				else if(tmpTaskCB->jwl_gtf_WaitTLink->Next=jwl_gtf_NULL)
					tmpTaskCB->jwl_gtfWaitTLink->Pre->jwl_gtf_\
					    WaitTLink->Next=jwl_gtf_NULL;
				else
				{
					tmpTaskCB->jwl_gtfWaitTLink->Pre->jwl_gtf_WaitTLink\
					 ->Next=tmpTaskCB->jwl_gtfWaitTLink->Next;
					tmpTaskCB->jwl_gtfWaitTLink->Next->jwl_gtf_WaitTLink\
					 ->Pre=tmpTaskCB->jwl_gtfWaitTLink->Pre;
				}
				tmpTaskCB->jwl_gtf_WaitTLink={jwl_gtf_NULL,jwl_gtf_NULL};
				tmpTaskCB->jwl_gtf_RetCode=jwl_gtf_HupUpTaskTOut;
				tmpTaskCB->jwl_gtf_TaskStatus=jwl_gtf_Ready;
			}
			tmpTaskCB=oldTaskCB;
		}
	}
	return;
}

⌨️ 快捷键说明

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