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

📄 jwl-gtf_mutex.c

📁 基于arm核的RTOS
💻 C
📖 第 1 页 / 共 3 页
字号:
		return	jwl_gtf_TaskNoNutex;
	else
	{
		tmpMutex=jwl_gtf_TaskRun->jwl_gtf_Mutex;
		if(tmpMutex->jwl_gtf_RevOCB!=jwl_gtf_NULL)
		{
			jwl_gtf_ProiRevert(jwl_gtf_TaskRun,tmpMutex->jwl_gtf_RevOCB);
			tmpMutex->jwl_gtf_RevOCB=jwl_gtf_NULL;
		}
		jwl_gtf_TaskRun->jwl_gtf_Mutex=jwl_gtf_NULL;
		if(tmpMutex->jwl_gtf_Using=tmpMutex->jwl_gtf_MutexLink==jwl_gtf_NULL)		/*系统中是否没有互斥挂起的线程*/
		{
			jwl_gtf_TaskRun->jwl_gtf_TaskStauts=jwl_gtf_TaskRun->jwl_gtf_TaskStaus&(!jwl_gtf_Mutex);
			tmpMutex->jwl_gtf_Status=jwl_gtf_Usable;
		}
		else										/*有线程挂起*/
		{
			if(tmpMutex->jwl_gtf_MutexLink->jwl_gtf_EvenLink->Next=jwl_gtf_NULL)	/*是否只有一个挂挂起*/
			{
				tmpMutex->jwl_gtf_MutexLink=jwl_gtf_NULL;
				tmpMutex->jwl_gtf_Using->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
				tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
				tmpMutex->jwl_gtf_Using->jwl_gtf_Status=jwl_gtf_Ready|jwl_gtf_Mutex;
				jwl_gtf_TOutMutex=jwl_gtf_NULL;
				tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink={jwl_gtf_NULL,jwl_gtf_NULL};
				if(tmpMutex->jwl_gtf_Using->Taskro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
				{
					tmpExchOCB=tmpMutex->jwl_gtf_Using;
					jwl_gtf_Switch
				}
			}
			else									/*否则*/
			{
				tmpMutex->jwl_gtf_MutexLink=tmpMutex->jwl_gtf_MutexLink->Next;
				tmpMutex->jwl_gtf_MutexLink->jwl_gtf_MutexLink->pre=tmpMutex->jwl_gtf_MutexLink;
				tmpMutex->jwl_gtf_Using->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
				if(tmpMutex->jwl_gtf_MutexProtocol==jwl_gtf_MutexInherit)
				{
					if(tmpMutex->jwl_gtf_WaitStatus!=jwl_gtf_MutexPro)
					{
						oldTaskCB->jwl_gtf_TaskPro=jwl_gtf_MaxTask;
						tmpTaskCB=tmpMutex->jwl_gtf_MutexLink;
						for(;tmpTaskCB!=jwl_gtf_NULL;tmpTaskCB->jwl_gtf_EvenLink->Next)		/*得到挂起最高优先级*/
						{
							if(tmpTaskCB->jwl_gtf_TaskPro<oldTaskCB->jwl_gtf_TaskPro)
								oldTaskCB=tmpTaskCB;
						}
						if(tmpMutex->jwl_gtf_Using->jwl_gtf_TaskPro<oldTaskCB->jwl_gtf_TaskPro)	/*是否要优先级任务反转*/
						{
							jwl_gtf_ProiRevert(tmpMutex->jwl_gtf_Using,oldTaskCB);
							tmpMutex->jwl_gtf_Status=jwl_gtf_ProRev;
							tmpMutex->jwl_gtf_RevOCB=oldTaskCB:
						}
					}
					else
						tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
				}
				else
					tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
				tmpMutex->jwl_gtf_Using->jwl_gtf_Status=jwl_gtf_Ready|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(tmpMutex->jwl_gtf_Using->Taskro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
				{
					tmpExchOCB=tmpMutex->jwl_gtf_Using;
					jwl_gtf_Switch
				}
			}
		}
	}
	return jwl_gtf_Noerror;
}

/********************************************************************************************************
*                                        jwl_gtf_MutexUnLock						*
* 描述:解锁指定互斥体											*
* 参数	TaskCB												*
*	TaskID												*
*	Stauts												*
* 返回: 		参看JWL-GTF_error.h								*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_MutexUnLockSpec(jwl_gtf_TaskCB *TaskCB,jwl_gtf_u8 TaskID,jwl_gtf_bool Status)
{
	jwl_gtf_Mutex  *tmpMutex;
	jwl_gtf_TaskCB *tmpTaskCB,*oldTaskCB,*Task;
	if(Status!=jwl_gtf_Continue&&(Status!=jwl_gtf_Cancel)
		return jwl_gtf_ParaError;
	if(jwl_gtf_TaskRun->jwl_gtf_Mutex==jwl_gtf_NULL)
		return	jwl_gtf_TaskNoNutex;
	if(TaskCB==jwl_gtf_NULL)
	{
		if(tmpTaskCB=jwl_gtf_FindTaskByID(TaskID)==jwl_gtf_NULL)
			return jwl_gtf_NoTaskID;
	}
	else
		tmpTaskCB=TaskCB;
	if(tmpTaskCB->jwl_gtf_Mutex==jwl_gtf_TaskRun->jwl_gtf_Mutex)
	{
		tmpMutex=jwl_gtf_TaskRun->jwl_gtf_Mutex;
		if(tmpMutex->jwl_gtf_RevOCB!=jwl_gtf_NULL)
		{
			jwl_gtf_ProiRevert(jwl_gtf_TaskRun,tmpMutex->jwl_gtf_RevOCB);
			tmpMutex->jwl_gtf_RevOCB=jwl_gtf_NULL;
		}
		jwl_gtf_TaskRun->jwl_gtf_Mutex=jwl_gtf_NULL;
		if(tmpMutex->jwl_gtf_MutexLink->jwl_gtf_EvenLink->Next=jwl_gtf_NULL)	/*是否只有一个挂挂起*/
		{
			tmpMutex->jwl_gtf_Using=tmpMutex->jwl_gtf_MutexLink;
			tmpMutex->jwl_gtf_MutexLink=jwl_gtf_NULL;
			tmpMutex->jwl_gtf_Using->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
			tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
			tmpMutex->jwl_gtf_Using->jwl_gtf_Status=jwl_gtf_Ready|jwl_gtf_Mutex;	
			jwl_gtf_TOutMutex=jwl_gtf_NULL;
			tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink={jwl_gtf_NULL,jwl_gtf_NULL};						
			if(tmpMutex->jwl_gtf_Using->Taskro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
			{
				tmpExchOCB=tmpMutex->jwl_gtf_Using;
				jwl_gtf_Switch
			}
		}
		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;					
			}
			tmpMutex->jwl_gtf_Using->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
			if(tmpMutex->jwl_gtf_MutexProtocol==jwl_gtf_MutexInherit)
			{
				if(tmpMutex->jwl_gtf_WaitStatus!=jwl_gtf_MutexPro)
				{
					oldTaskCB->jwl_gtf_TaskPro=jwl_gtf_MaxTask;
					Task=tmpMutex->jwl_gtf_MutexLink;
					for(;Task!=jwl_gtf_NULL;Task=Task->jwl_gtf_EvenLink->Next)		/*得到挂起最高优先级*/
					{
						if(Task->jwl_gtf_TaskPro<oldTaskCB->jwl_gtf_TaskPro)
							oldTaskCB=Task;
					}
				}
				else
					oldTaskCB=tmpMutex->jwl_gtf_MutexLink;
				if(tmpMutex->jwl_gtf_Using->jwl_gtf_TaskPro<oldTaskCB->jwl_gtf_TaskPro)	/*是否要优先级任务反转*/
				{
					jwl_gtf_ProiRevert(tmpMutex->jwl_gtf_Using,oldTaskCB);
					tmpMutex->jwl_gtf_Status=jwl_gtf_ProRev;
					tmpMutex->jwl_gtf_RevOCB=oldTaskCB:
				}
				else
					tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
			}
			else
				tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
			tmpMutex->jwl_gtf_Using->jwl_gtf_Status=jwl_gtf_Ready|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(tmpMutex->jwl_gtf_Using->Taskro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
			{
				tmpExchOCB=tmpMutex->jwl_gtf_Using;
				jwl_gtf_Switch
			}
		}
	}
	else
	{
		if(Status==jwl_gtf_Cancel)
			return jwl_gtf_Noerror;
		else
		{
			tmpMutex=jwl_gtf_TaskRun->jwl_gtf_Mutex;
			if(tmpMutex->jwl_gtf_RevOCB!=jwl_gtf_NULL)
			{
				jwl_gtf_ProiRevert(jwl_gtf_TaskRun,tmpMutex->jwl_gtf_RevOCB);
				tmpMutex->jwl_gtf_RevOCB=jwl_gtf_NULL;
			}
			jwl_gtf_TaskRun->jwl_gtf_Mutex=jwl_gtf_NULL;
			if(tmpMutex->jwl_gtf_Using=tmpMutex->jwl_gtf_MutexLink==jwl_gtf_NULL)		/*系统中是否没有互斥挂起的线程*/
			{
				jwl_gtf_TaskRun->jwl_gtf_TaskStauts=jwl_gtf_TaskRun->jwl_gtf_TaskStaus&(!jwl_gtf_Mutex);
				tmpMutex->jwl_gtf_Status=jwl_gtf_Usable;
			}
			else										/*有线程挂起*/
			{
				if(tmpMutex->jwl_gtf_MutexLink->jwl_gtf_EvenLink->Next=jwl_gtf_NULL)	/*是否只有一个挂挂起*/
				{
					tmpMutex->jwl_gtf_MutexLink=jwl_gtf_NULL;
					tmpMutex->jwl_gtf_Using->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
					tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
					tmpMutex->jwl_gtf_Using->jwl_gtf_Status=jwl_gtf_Ready|jwl_gtf_Mutex;	
					jwl_gtf_TOutMutex=jwl_gtf_NULL;
					tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink={jwl_gtf_NULL,jwl_gtf_NULL};								
					if(tmpMutex->jwl_gtf_Using->Taskro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
					{
						tmpExchOCB=tmpMutex->jwl_gtf_Using;
						jwl_gtf_Switch
					}
				}
				else									/*否则*/
				{
					tmpMutex->jwl_gtf_MutexLink=tmpMutex->jwl_gtf_MutexLink->Next;
					tmpMutex->jwl_gtf_MutexLink->jwl_gtf_MutexLink->pre=tmpMutex->jwl_gtf_MutexLink;
					tmpMutex->jwl_gtf_Using->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
					if(tmpMutex->jwl_gtf_MutexProtocol==jwl_gtf_MutexInherit)
					{
						if(tmpMutex->jwl_gtf_WaitStatus!=jwl_gtf_MutexPro)
						{
							oldTaskCB->jwl_gtf_TaskPro=jwl_gtf_MaxTask;
							tmpTaskCB=tmpMutex->jwl_gtf_MutexLink;
							for(;tmpTaskCB!=jwl_gtf_NULL;tmpTaskCB->jwl_gtf_EvenLink->Next)		/*得到挂起最高优先级*/
							{
								if(tmpTaskCB->jwl_gtf_TaskPro<oldTaskCB->jwl_gtf_TaskPro)
									oldTaskCB=tmpTaskCB;
							}
						}
						else
							oldTaskCB=tmpMutex->jwl_gtf_NutexLink;
						if(tmpMutex->jwl_gtf_Using->jwl_gtf_TaskPro<oldTaskCB->jwl_gtf_TaskPro)	/*是否要优先级任务反转*/
						{
							jwl_gtf_ProiRevert(tmpMutex->jwl_gtf_Using,oldTaskCB);
							tmpMutex->jwl_gtf_Status=jwl_gtf_ProRev;
							tmpMutex->jwl_gtf_RevOCB=oldTaskCB:
						}
						else
							tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
					}
					else
						tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
					tmpMutex->jwl_gtf_Using->jwl_gtf_Status=jwl_gtf_Ready|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(tmpMutex->jwl_gtf_Using->Taskro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
					{
						tmpExchOCB=tmpMutex->jwl_gtf_Using;
						jwl_gtf_Switch
					}
				}
			}
		}
	}
	return jwl_gtf_Noerror;
}


/********************************************************************************************************
*                                        jwl_gtf_CancelMutexLock					*
* 描述:取消指定挂起的任务										*
* 参数: MutexID		:给出的互斥体ID号								*
*	Mutex		:给出的互斥体指针								*
*	TaskID		:给出的任务ID号									*
*	Task		:给出的任务指针									*
* 返回: :参看JWL-GTF_error.h										*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_CancelMutexLock(wl_gtf_TaskCB *TaskCB,jwl_gtf_u8 TaskID)
{
	jwl_gtf_TaskCB *tmpTaskCB,*oldTaskCB,*sTaskCB;
	jwl_gtf_TaskMutex *tmpMutex;
	if(TaskCB==jwl_gtf_NULL)						/*所给的任务控制块是否为NULL*/
	{
		if(tmpTaskCB=jwl_gtf_FundByID(TaskID)!=jwl_gtf_NULL)
			return jwl_gtf_NoRunCB;
	}
	else
		tmpTaskCB=TaskCB;
	if(tmpTaskCB->jwl_gtf_Mutex==jwl_gtf_NULL)				/*线程是否被互斥*/
		return jwl_gtf_TaskNoNutex;
	else

⌨️ 快捷键说明

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