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

📄 jwl-gtf_core.c

📁 基于arm核的RTOS
💻 C
📖 第 1 页 / 共 3 页
字号:
	if(strlen(TaskName)>jwl_gtf_NameMaxLen)					/*判断文件名是否过长*/
		return jwl_gtf_NameLen;
	if(*TaskPro==jwl_gtf_MaxTask)						/*判断线程是否为Idle线程*/
	{
		if(jwl_gtf_TaskRDFirst!=jwl_gtf_NULL)
			return jwl_gtf_Idelexist;	
	}
	if(jwl_gtf_FindProi(TaskPro,tmpTaskCB)==jwl_gtf_Noerror)		/*判断此优先级是否存在*/
	{
#if    jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable
		jwl_gtf_ProStatus=jwl_gtf_True;
		tmpTaskCB->jwl_gtf_MulTaskC=jwl_gtf_TaskTiks;
		iRet=jwl_gtf_True;
#else
		return jwl_gtf_NoSamePro;					/*不允许有多个相同优先级的进程存在*/
#endif		
	}
	if(jwl_gtf_Taskfree==jwl_gtf_NULL)					/*是否还有空的任务块*/
		return jwl_gtf_NoFreeOCB;
	tmpTaskCB=jwl_gtf_Taskfree;						/*获得线程控制块*/
	jwl_gtf_Taskfree=tmpTaskCB->jwl_gtf_Link->Next;				/*把所得控制块从jwl_gtf_Taskfree块中断开*/
	tmpTaskCB->jwl_gtf_Link->Next->jwl_gtf_Link->pre=jwl_gtf_Taskfree;
	tmpTaskCB->jwl_gtf_Link->Next=tmpTaskCB->jwl_gtf_Link->Pre=jwl_gtf_NULL;
	tmpTaskCB->jwl_gtf_TaskPro=TaskPr;					/*任务控制块优先级设置*/
	jwl_gtf_InsertReadyTask(tmpTaskCB);					/*把任务插入到就绪态链表中*/
	strcpy(tmpTaskCB->jwl_gtf_TaskName,TaskName,strlen(TaskName));
	tmpTaskCB->jwl_gtf_TaskID=jwl_gtf_IDNext++;
	*TaskID=tmpTaskCB->jwl_gtf_TaskID;
	tmpTaskCB->jwl_gtf_TaskPro=TaskPro;
	tmpTaskCB->jwl_gtf_RetCode=jwl_gtf_NOerror;
	tmpTaskCB->jwl_gtf_TaskStatus=jwl_gtf_Creat;
	tmpTaskCB->jwl_gtf_TimeOut=0;
	jwl_gtf_WaitTLink=jwl_gtf_NULL;
	
#if jwl_gtf_ResumeAllTask==jwl_gtf_True	
	tmpTaskCB->jwl_gtf_HupUpLink={jwl_gtf_NULL,jwl_gtf_NULL};
#endif	
	
#if jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable
	if(iRet==jwl_gtf_True)
		tmpTaskCB->jwl_gtf_MulTaskC=jwl_gtf_TaskTiks;
	else
		tmpTaskCB->jwl_gtf_MulTaskC=0;
	tmpTaskCB->jwl_gtf_SameProiLink={jwl_gtf_NULL,jwl_gtf_NULL};
#endif
	
#if Mutex||ConVar
	jwl_gtf_EvenLink=jwl_gtf_NULL;
#endif

#if Mutex
	jwl_gtf_Mutex=jwl_gtf_NULL;
#endif

#if	ConVar
	jwl_gtf_ConVar=jwl_gtf_NULL;
#endif

	tmpTaskCB->jwl_gtf_task=jwl_gtf_void (*task)(jwl_gtf_void *);
	tmpTaskCB->jwl_gtf_param=param;	
	jwl_gtf_InitStack							/*堆栈指针初始化*/
	tmpTaskCB->jwl_gtf_PrivateDate=jwl_gtf_NULL;
	TaskCB=tmpTaskCB;
	jwl_gtf_EnInrupt							/*开中断*/
	return jwl_gtf_Noerror;							/*成功返回*/
}

/********************************************************************************************************
*                                        jwl_gtf_get_curr						*
* 描述:该线程返回当前线程的线程控制块指针								*
* 参数: TaskCB			:线程控制块指针							*
	TaskID			:线程ID								*
	TaskProi		: 任务优先级								*
	*返回: 		:参看JWL-GTF_error.h								*
*********************************************************************************************************/
jwl_gtf_TaskCB *jwl_gtf_gtf_Curr(jwl_gtf_void)
{
	return jwl_gtf_TaskRun;
}

/********************************************************************************************************
*                                        jwl_gtf_get_idle						*
* 描述:该线程返回当前线程的线程控制块指针								*
* 参数: TaskCB			:线程控制块指针							*
	TaskID			:线程ID								*
	*返回: 		:参看JWL-GTF_error.h								*
*********************************************************************************************************/
jwl_gtf_TaskCB *jwl_gtf_get_idle(jwl_gtf_void)
{
	if(jwl_gtf_TaskRDFirst==jwl_gtf_NULL)					/*Idle进程是否存在*/
		return	jwl_gtf_TaskRDFirst;
	else
	{
		if(jwl_gtf_TaskRDLast!=jwl_gtf_NULL)
			return jwl_gtf_TaskRDLast;
		else if(jwl_gtf_TaskRDMiddle!=jwl_gtf_NULL)
			return jwl_gtf_TaskMiddle;
		else
			return jwl_gtf_RDLast;					/*获得线程指针*/
	}
}

/********************************************************************************************************
*                                        jwl_gtf_FindByID						*
* 描述:用TaskID查找任务控制块										*
* 参数: TaskID			:线程任务 ID								*
*	TaskCB			: 线程控制块指针							*
*	*返回: 		:参看JWL-GTF_error.h								*
*********************************************************************************************************/
jwl_gtf_TaskCB *jwl_gtf_FundByID(jwl_gtf_u8 TaskID)
{
	jwl_gtf_TaskCB *tmpOCB;
	tmpOCB=jwl_gtf_RDFirst;
	for(;tmpOCB->jwl_gtf_TaskID!=TaskID&&tmpOCB!=jwl_gtf_NULL;tmpOCB=tmpOCB->jwl_gtf_Link->Next)
	return tmpOCB;
}

/********************************************************************************************************
*                                        jwl_gtf_StartRun						*
* 描述:是创建态任务进入就绪态										*
* 参数: TaskCB			:线程控制块指针							*
	TaskID			:线程ID								*
	*返回: 		:参看JWL-GTF_error.h								*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_startrun(jwl_gtf_TaskCB *TaskCB,jwl_gtf_u8 TaskID)
{
	if(TaskCB==jwl_gtf_NULL)						/*所给的任务控制块是否为NULL*/
	{
		if(TaskID>jwl_gtf_IDNext)					/*ID号是否为合法*/
			return jwl_gtf_NoTaskID;				/*任务ID号非法*/
		else
		{
			if(TaskCB=jwl_gtf_FundByID(TaskID)!=jwl_gtf_NULL)
				return jwl_gtf_NoRunCB;
		}
	}
	if(TaskCB->jwl_gtf_TaskStatus!=jwl_gtf_Creat)				/*任务是否在创建态*/
		return jwl_gtf_TaskNotCreat;					/*任务已经运行了*/
	TaskCB->jwl_gtf_TaskStatus=jwl_gtf_Ready;
	if(jwl_gtf_TaskRun==jwl_gtf_NULL||TaskCB->jwl_gtf_TaskPro<\		/*当前进程是否为NULL或优先级比运行进程高*/
	     jwl_gtf_TaskRun->jwl_gtf_TaskPro)
	{
		tmpExchOCB=TaskCB;
		jwl_gtf_Switch
	}
	return jwl_gtf_Noerror;
}

#if jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable
/********************************************************************************************************
*                                        jwl_gtf_threadyied()						*
* 描述:使当前进程放弃对MCU的控制,让位于相同等级的优先级进程,否则此处理无效				*
* 参数: 												*
	*返回: 		:参看JWL-GTF_error.h								*
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_threadyied()
{
	if(jwl_gtf_TaskRun->jwl_gtf_SameProiLink->Next==jwl_gtf_NULL)
		return jwl_gtf_NoSameProi;					/*运行中的进程没有相同优先级存在*/
	tmpExchOCB=jwl_gtf_TaskRun->jwl_gtf_SameProiLink->Next;
	jwl_gtf_Switch
	return ;
}
#endif

/********************************************************************************************************
*                                        jwl_gtf_void jwl_gtf_InsertWaitTLinkHead			*						*
* 描述:插入超时链表头											*
* 参数:  a	:表头											*
*        b	:要插入的指针										*
*	*返回: 		:无										*
*********************************************************************************************************/
_jwl_gtf_BuildInsertLinkHead(WaitTLink,jwl_gtf_TaskCB)

/********************************************************************************************************
*                                        jwl_gtf_void jwl_gtf_InsertWaitTLinkTaskTail			*
* 描述:插入超时链表头尾											*
* 参数:a			:任务指针指针								*
*      b  			:b插入到a后面								*
* 返回: 			:jwl_gtf_void								*
*********************************************************************************************************/
_jwl_gtf_BuildInsertTail(WaitTLink,jwl_gtf_TaskCB)

/********************************************************************************************************
*                                        jwl_gtf_void jwl_gtf_FindNextReady				*
* 描述:确定下一个运行任务指针											*
* 返回: 			:jwl_gtf_void								*
*********************************************************************************************************/
wl_gtf_void jwl_gtf_FindNextRun()
{
	jwl_gtf_TaskCB	*tmpTaskCB;
	tmpTaskCB=jwl_gtf_TaskRun->jwl_gtf_Link->Next;
	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_delayTime()						*
* 描述:使线程超时处理											*
* 参数:  Timeout	:超时间										*
*	*返回: 		:无										*
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_delayTime(jwl_gtf_u16 TimeOut)
{
	jwl_gtf_TaskCB *tmpTaskCB;
	jwl_gtf_TaskRun->jwl_gtf_TaskStatus=jwl_gtf_Dormant;
	jwl_gtf_TaskRun->jwl_gtf_TimeOut=TimeOut;
	if(jwl_gtf_TOutLink==jwl_gtf_NULL)					/*冥睡指针是否NULL*/
	{
		jwl_gtf_TOutLink=jwl_gtf_TaskRun;
		jwl_gtf_TaskRun->jwl_gtf_WaitTLink->Next=jwl_gtf_NULL;
		jwl_gtf_TaskRun->jwl_gtf_WaitTLink->pre=jwl_gtf_TOutLink;
	}
	else									/*冥睡指针不是NULL*/
	{
		tmpTaskCB=jwl_gtf_WaitTLink;
		if(jwl_gtf_TaskWaitMethod==jwl_gtf_TaskWaitFIFO)		/*先进先出*/
		{
			for(;tmpTaskCB->jwl_gtf_TimeOut<TimeOut&&tmpTaskCB!=jwl_gtf_NULL;\
				tmpTaskCB=tmpTaskCB->jwl_gtf_WaitTLink->Next)
		}
		else								/*后进先出*/
		{
			for(;tmpTaskCB->jwl_gtf_TimeOut<=TimeOut&&tmpTaskCB!=jwl_gtf_NULL;\
				tmpTaskCB=tmpTaskCB->jwl_gtf_WaitTLink->Next)
		}
		if(tmpTaskCB->jwl_gtf_WaitTLink->pre=tmpTaskCB)
			jwl_gtf_InsertWaitTLinkHead(jwl_gtf_TOutLink,tmpTaskCB);
		else
			jwl_gtf_InsertWaitTLinkTaskTail(tmpTaskCB->jwl_gtf_WaitTLink->Pre,tmpTaskCB);			
	}
	jwl_gtf_FindNextRun();
	jwl_gtf_Switch
	return;
}

/********************************************************************************************************
*                                        jwl_gtf_DeleteTOutLinkHead					*
* 描述:从超时链表头断开											*
*参数	a		:从要断开的链表头								*
*	*返回: 		:jwl_gtf_void									*
*********************************************************************************************************/
_jwl_gtf_BuildDeleteLinkHead(TOutLink,jwl_gtf_TaskCB)

/********************************************************************************************************
*                                        jwl_gtf_DeleteTOutLinkTail					*
* 描述:从超时链尾断开											*
*参数	a		:从要断开的链表头								*
*	*返回: 		:jwl_gtf_void									*
*********************************************************************************************************/
_jwl_gtf_BuildDeleteLinkTail(TOutLink,jwl_gtf_TaskCB)

/********************************************************************************************************
*                                        jwl_gtf_CancelDelayTask()					*
* 描述:取消定超时线程											*
* 参数:  TaskID		:要取消的指定线程ID								*
*        TaskCB		:要取消指定的线程指针								*
*	*返回: 		:参看JWL-GTF_error.h								*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_CancelDelayTask(jwl_gtf_u8 TaskID,jwl_gtf_TaskCB *TaskCB)
{
	jwl_gtf_TaskCB *tmpTaskCB;
	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_TaskStaus!=jwl_gtf_Dormant)
		return jwl_gtf_NotDorStatus;					/*线程不在冥睡状态*/
	if(tmpTaskCB->jwl_gtf_TOutLink->Pre==jwl_gtf_TOutLink)
		jwl_gtf_DeleteTOutLinkHead(jwl_gtf_TOutLink);
	else
		jwl_gtf_DeleteTOutLinkTail(tmpTaskCB);
	if(tmpTaskCB->jwl_gtf_TaskPro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)		/*判断唤醒的任务优先级是否比运行的高*/
	{
		tmpExchOCB=tmpTaskCB;
		jwl_gtf_Switch
	}
	return jwl_gtf_Noerror;
}

/********************************************************************************************************
*                                        jwl_gtf_CancelAllDelayTask()					*
* 描述:取消定超时线程											*
*	*返回: 		:jwl_gtf_void									*
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_CancelAllDelayTask()
{
	jwl_gtf_TaskCB *tmpTaskCB,oldTaskCB;
	if(jwl_gtf_TOutLink==jwl_gtf_NULL
		return;
	else
	{
		oldTaskCB=jwl_gtf_get_idle();
		tmpTaskCB=jwl_gtf_TOutLink;

⌨️ 快捷键说明

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