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

📄 jwl-gtf_core.c

📁 基于arm核的RTOS
💻 C
📖 第 1 页 / 共 3 页
字号:
/********************************************************************************************************
*                                                JWL-GTF						*
*                                           实时多任务操作系统						*
*					     								*
*      				              作者:JWL-GTF			                        *
*  					     日期:2004/04/24                                            *
*					 修改日期:2004/04/24						*
*                                       								*
*                                       功能说明:线程的基本管理					*
*********************************************************************************************************/
#include "JWL-GTF.H"

/*定义全局变量*/
#if (jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable)
	static  jwl_gtf_TaskCB jwl_gtf_Task[jwl_gtf_MaxTask+jwl_gtf_FreeTask];	/*本系统中总的可用任务数*/
	jwl_gtf_bool jwl_gtf_ProStatus;				/*当前插入的优先级是否存在,True存在,False不存在*/
#else 
	static  jwl_gtf_TaskCB jwl_gtf_Task[jwl_gtf_MaxTask];	/*本系统中总的可用任务数*/
#endif	
jwl_gtf_TaskCB *tmpExchOCB;

/********************************************************************************************************
*                                        jwl_gtf_TaskFreeInit						*
* 描述:系统初始化全局任务OCB										*
* 参数: 无												*
* 返回: 无												*
*********************************************************************************************************/
_jwl_gtf_BuildFreeLinkInit(Task,jwl_gtf_MaxTask+jwl_gtf_FreeTask)

/********************************************************************************************************
*                                        jwl_gtf_TaskVarInit						*
* 描述:系统初始化及对一些定义进行检测									*
* 参数: 无												*
* 返回:        jwl_gtf_MaxTask        :参看JWL-GTF_error.h						*
*              jwl_gtf_EqProPoli  									*
*              jwl_gtf_Noerror    									*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_TaskVarInit()
{
	jwl_gtf_IDNext=0;			/*初始化任务ID号,从0开始,新建一个则应jwl_gtf_INNext++*/	
	jwl_gtf_ReadyCounter=0;			/*就绪态线程计数初始0*/
	
	jwl_gtf_TaskFree=jwl_gtf_NULL;
	jwl_gtf_TaskRun=jwl_gtf_NULL;
	jwl_gtf_TaskRDFirst=jwl_gtf_NULL;
	jwl_gtf_TaskRDMiddle=jwl_gtf_NULL;
	jwl_gtf_TaskRDLast=jwl_gtf_NULL;
	jwl_gtf_TOutLink=jwl_gtf_NULL;	
	
#if  jwl_gtf_ResumeAllTask==jwl_gtf_True
	jwl_gtf_TaskHupup=jwl_gtf_NULL:
#endif	
	
#if jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable	
	jwl_gtf_MulCLink=jwl_gtf_NULL;
#endif	
	
	jwl_gtf_TaskFreeInit();			/*初始化任务OCB*/	
	return jwl_gtf_Noerror;
}

/********************************************************************************************************
*                                        jwl_gtf_FindProi						*
* 描述:查看是否有相同的优先级										*
* 参数: TaskProi		:待查的优先级								*
*        TaskCB			:找到时返回的线程指针							*
* 返回: jwl_gtf_Noerror		:成功找到								*
*       jwl_gtf_NoFindProi	:没有找到								*
*********************************************************************************************************/
jwl_gtf_TaskCB *jwl_gtf_FindProi(jwl_gtf_u8 TaskProi)
{
	jwl_gtf_TaskCB *jwl_gtf_OCB;
	jwl_gtf_OCB=jwl_gtf_RDFirst;
	for(;jwl_gtf_OCB->jwl_gtf_TaskPro!=TaskPro&&jwl_gtf_OCB!=jwl_gtf_NULL;\
	   jwl_gtf_OCB=jwl_gtf_OCB->jwl_gtf_Link->Next))
		return jwl_gtf_OCB;
}

/********************************************************************************************************
*                                        jwl_gtf_FindName						*
* 描述:查看系统中的线程的名字是否存在									*
* 参数: TaskName		:待查线称的名字								*
*       TaskCB			:找到时返回的线程指针							*
* 返回: jwl_gtf_Noerror		:成功找到								*
*       jwl_gtf_NoFindProi	:没有找到								*
*********************************************************************************************************/
jwl_gtf_s8 *jwl_gtf_FindName(jwl_gtf_u8 *TaskName,jwl_gtf_TaskCB *TaskCB)
{
	if(strlen(TaskName)==0)							/*名字是否为空?*/
		return jwl_gtf_ParaError;
	jwl_gtf_TaskCB *jwl_gtf_OCB;
	jwl_gtf_OCB=jwl_gtf_RDFirst;
	for(;jwl_gtf_OCB;)
	{
		if(strlen(jwl_gtf_OCB->jwl_gtf_TaskName)==strlen(TaskName)
		{
			if(strncmp(jwl_gtf_OCB->jwl_gtf_TaskName,TaskName,strlen(TaskName)==0)
			{
				TaskCB=jwl_gtf_OCB;
				return jwl_gtf_Noerror;
			}
		}
		jwl_gtf_OCB=jwl_gtf_OCB->jwl_gtf_Link->Next;
	}
	return jwl_gtf_NoFindName;						/*没有找到相应的控制块*/
}

/********************************************************************************************************
*                                        jwl_gtf_void jwl_gtf_InsertSameProiLinkTaskTail		*
* 描述:插入优先级相同就绪任务链表头									*
* 参数:a			:任务指针指针								*
*      b  			:b插入到a后面								*
* 返回: 			:jwl_gtf_void								*
*********************************************************************************************************/
_jwl_gtf_BuildInsertTail(SameProiLink,jwl_gtf_TaskCB)

/********************************************************************************************************
*                                        jwl_gtf_InsertReadyTask					*
* 描述:插入就优先级相等绪任务链尾									*
* 参数:TaskCB			:待要插入的任务指针							*
*        												*
* 返回: 			:jwl_gtf_void								*
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_InsertReadyTask(jwl_gtf_TaskCB *TaskCB)
{
	jwl_gtf_TaskCB *jwl_gtf_OCB;
	if(jwl_gtf_TaskRDFirst==jwl_gtf_NULL)						/*是否没有线程:First==Middle==Last==NULL*/
	{
		jwl_gtf_TaskRDFirst=TaskCB;
		jwl_gtf_TaskRDFirst->jwl_gtf_Link->Next=jwl_gtf_NULL;
		jwl_gtf_TaskRDFirst->jwl_gtf_Link->Pre=TaskCB;
	}
	else if(jwl_gtf_TaskRDMiddle==jwl_gtf_NULL)					/*系统中目前只有一个进程*/
	{
		jwl_gtf_TaskRDMiddle=jwl_gtf_TaskRDFirst;
		jwl_gtf_TaskRDFirst=TaskCB;
		jwl_gtf_TaskRDmiddle->jwl_gtf_Link->Pre=TaskCB;
		jwl_gtf_TaskRDFirst->jwl_gtf_Link->Pre=TaskCB;
	}
	else if(jwl_gtf_TaskRDLast==jwl_gtf_NULL)					/*系统中只有2个任务,即First==Middle=同一ID*/
	{
		jwl_gtf_TaskRDLast=jwl_gtf_TaskRDMiddle;
		if(TaskCB->jwl_gtf_TaskPro<jwl_gtf_RDFirst->jwl_gtf_TaskPro)		/*TaskCB的优先级小于First*/
		{
			jwl_gtf_TaskRDMiddle=jwl_gtf_TaskRDFirst;
			jwl_gtf_TaskRDFirst=TaskCB;
		}
		else if(Task->jwl_gtf_TaskPro>jwl_gtf_TaskRDFirst->jwl_gtf_TaskPro)	/*TaskCB的优先级大于First*/
			jwl_gtf_TaskRDMiddle=TaskCB;
#if    jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable
		else									/*TaskCB的优先级等于First*/
		{
			if(jwl_gtf_MulSchMethod==jwl_gtf_TaskFIFO)			/*先进先出方式排列*/
				jwl_gtf_TaskRDMiddle=TaskCB;
			else								/*后进先出排列*/
			{
				jwl_gtf_TaskRDMiddle=jwl_gtf_TaskRDFirst;
				jwl_gtf_TaskRDFirst=TaskCB;
			}
			jwl_gtf_TaskRDFirst->jwl_gtf_SameProiLink=jwl_gtf_Link;
			jwl_gtf_TaskRDFirst->jwl_gtf_SameProiLink->jwl_gtf_TaskRDMiddle;
			jwl_gtf_TaskRDMiddle->jwl_gtf_SameProiLink->Pre=jwl_gtf_NULL;
			jwl_gtf_TaskRDMiddle->jwl_gtf_SameProiLink->Next=jwl_gtf_NULL;
		}
#endif
		jwl_gtf_TaskRDLast->jwl_gtf_Link->Pre=jwl_gtf_TaskRDMiddle;
		jwl_gtf_TaskRDMiddle->jwl_gtf_Link->Next=jwl_gtf_TaskRDLast;
		jwl_gtf_TaskRDMiddle->jwl_gtf_Link->Pre=jwl_gtf_TaskRDFirst;
		jwl_gtf_TaskRDFirst->jwl_gtf_Link->Next=jwl_gtf_TaskRDMiddle;
		jwl-gtf_TaskRDFirst->jwl_gtf_Link->Pre=jwl_gtf_TaskRDFirst;		
	}
	else if(jwl_gtf_TaskRDMiddle->jwl_gtf_TaskPro=>TaskCB->jwl_gtf_TaskPro)		/*判断Middle->Proi>=TaskCB->jwl_gtf_TaskProi?*/
	{
		jwl_gtf_OCB=jwl_gtf_TaskRDFirst;
#if    jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable			
		if(jwl_gtf_ProStatus!=jwl_gtf_True)					/*存在相同优先级的任务*/
		{
#endif
			for(;jwl_gtf_OCB->TaskPro<TaskCB->jwl_gtf_TaskPro;jwl_gtf_OCB=\
				jwl_gtf_OCB->jwl_gtf_Link->Next)
#if    jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable
		}
		else									/*存存在相同优先级的任务存在*/
		{
			if(jwl_gtf_MulSchMethod==jwl_gtf_TaskFIFO)			/*先进先出*/
				for(;jwl_gtf_OCB->jwl_gtf_TaskPro<=TaskCB->jwl_gtf_TaskPro;\
				  jwl_gtf_OCB=jwl_gtf_OCB->jwl_gtf_Link->Next)
			else								/*后进先出*/
				for(;jwl_gtf_OCB->jwl_gtf_TaskPro!=TaskCB->jwl_gtf_TaskPro;\
				  jwl_gtf_OCB=jwl_gtf_OCB->jwl_gtf_Link->Next)
		}
		if(jwl_gtf_OCB->jwl_gtf_TaskPro>TaskCB->jwl_gtf_TaskPro)		/*待插入的优先级是否在系统中最大*/
		{
			TaskCB->jwl_gtf_Link->Next=jwl_gtf_TaskRDFirst;
			jwl_gtf_TaskRDFirst->jwl_gtf_Link->Pre=TaskCB;
			jwl_gtf_TaskRDFirst=TaskCB;
			TaskCB->jwl_gtf_Link->Pre=jwl_gtf_TaskRDFirst;
		}
		else
		{
			TaskCB->jwl_gtf_Link->Next=jwl_gtf_OCB;
			jwl_gtf_OCB->jwl_gtf_Link->Pre->jwl_gtf_Link->Next=TaskCB;
			TaskCB->jwl_gtf_Link->Pre=jwl_gtf_OCB->jwl_gtf_Link->Pre;
			jwl_gtf_OCB->jwl_gtf_Link->Pre=TaskCB;
		}
		jwl_gtf_ReadyCounter++;
#endif
	}
	else										/*Middle->Proi<TaskCB->jwl_gtf_TaskProi*/
	{
		jwl_gtf_OCB=jwl_gtf_TaskRDMiddle->jwl_gtf_Link->Next;
#if    jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable			
		if(jwl_gtf_ProStatus!=jwl_gtf_True)					/*存在相同优先级的任务*/
		{
#endif			
			for(;jwl_gtf_OCB->TaskPro<TaskCB->jwl_gtf_TaskPro;jwl_gtf_OCB=\
				jwl_gtf_OCB->jwl_gtf_Link->Next)
#if    jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable				
		}	
		else									/*存存在相同优先级的任务存在*/
		{
			if(jwl_gtf_MulSchMethod==jwl_gtf_TaskFIFO)			/*先进先出*/
				for(;jwl_gtf_OCB->jwl_gtf_TaskPro<=TaskCB->jwl_gtf_TaskPro;\
				  jwl_gtf_OCB=jwl_gtf_OCB->jwl_gtf_Link->Next)
			else								/*后进先出*/
				for(;jwl_gtf_OCB->jwl_gtf_TaskPro!=TaskCB->jwl_gtf_TaskPro;\
				  jwl_gtf_OCB=jwl_gtf_OCB->jwl_gtf_Link->Next)
		}
		TaskCB->jwl_gtf_Link->Next=jwl_gtf_OCB;
		jwl_gtf_OCB->jwl_gtf_Link->Pre->jwl_gtf_Link->Next=TaskCB;
		TaskCB->jwl_gtf_Link->Pre=jwl_gtf_OCB->jwl_gtf_Link->Pre;
		jwl_gtf_OCB->jwl_gtf_Link->Pre=TaskCB;
		jwl_gtf_ReadyCounter--;
	}
#if     jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable	
	if(jwl_gtf_ProStatus==jwl_gtf_True)						/*把相同优先级的线程控制块连接起来*/
	{
		if(jwl_gtf_MulSchMethod==jwl_gtf_TaskFIFO)				/*先进先出*/
		{
			if(TaskCB->jwl_gtf_Link->Pre->jwl_gtf_SameProLink->Next==jwl_gtf_NULL)			/*是否第二个相同的优先级*/
			{
				TaskCB->jwl_gtf_Link->Pre->jwl_gtf_SameProiLink->Pre=TaskCB;
				TaskCB->jwl_gtf_Link->Pre->jwl_gtf_SameProiLink->Next=TaskCB;
				TaskCB->jwl_gtf_SameProiLink->Pre=TaskCB->jwl_gtf_Link->Pre;
				TaskCB->jwl_gtf_SameProiLink->Next=TaskCB->jwl_gtf_Link->Pre;				
			}
			else
				jwl_gtf_InsertSameProiLinkTaskTail(TaskCB->jwl_gtf_List->Pre,TaskCB);
		}
		else									/*后进先出*/
		{
			if(TaskCB->jwl_gtf_Link->Next->jwl_gtf_SameProiLink->Next==jwl_gtf_NULL)		/*是否第二个相同的优先级*/
			{
				TaskCB->jwl_gtf_Link->Next->jwl_gtf_SameProiLink->Pre=TaskCB;
				TaskCB->jwl_gtf_Link->Next->jwl_gtf_SameProiLink->Next=TaskCB;
				TaskCB->jwl_gtf_SameProiLink->Pre=TaskCB->jwl_gtf_Link->Next;
				TaskCB->jwl_gtf_SameProiLink->Next=TaskCB->jwl_gtf_Link->Next;					
			}
			else
			{
				if(jwl_gtf_TaskRun==TaskCB->jwl_gtf_Link->Next)					/*进程是否正在运行*/
					jwl_gtf_InsertSameProiLinkTaskTail(TaskCB->jwl_gtf_List->Next,TaskCB);
				
				jwl_gtf_InsertSameProiLinkTaskTail(TaskCB->jwl_gtf_List->Next->jwl_gtf_SameProiLink->Pre,TaskCB);
			}
		}		
		jwl_gtf_ProStatus=jwl_gtf_False;					/*恢复优先级状态标志*/
	}
#endif	
	if(jwl_gtf_ReadyCounter==2)
	{
		jwl_gtf_TaskRDMiddle=jwl_gtf_TaskRDMiddle->jwl_gtf_Link->Pre;
		jwl_gtf_TaskRDMiddle=0;
	}
	else if(jwl_gtf_ReadyCounter==-2)
	{
		jwl_gtf_TaskRDMiddle=jwl_gtf_TaskRDMiddle->jwl_gtf_Link-Next;
		jwl_gtf_TaskRDMiddle=0;
	}
	return;
}

/********************************************************************************************************
*                                        TaskCreate							*
* 描述:系统创建线程并初始化一些变量									*
* 参数: TaskName		:线程名								*
	TaskPro			:线程优先级								*
	(*task)(void *pd)	:线程函数入口								*
	param			:线程函数参数								*
*       TaskIDk         	:任务ID								*
*       TaskCB  		:创建任务指针								*
*返回: 		:参看JWL-GTF_error.h									*
*********************************************************************************************************/
jwl_gtf_s8  jwl_gtf_u8 TaskCreate(jwl_gtf_u8 *TaskName,jwl_gtf_u16 TaskPro,jwl_gtf_void (*task)(jwl_gtf_void *),\
                jwl_gtf_void *param,jwl_gtf_u8 *TaskID,jwl_gtf_TaskCB *TaskCB)
{
	jwl_gtf_s8	iRet=jwl_gtf_False;
	jwl_gtf_TaskCB *tmpTaskCB;
	jwl_gtf_ClrInrupt							/*关中断*/

⌨️ 快捷键说明

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