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

📄 jwl-gtf_hb.c

📁 基于arm核的RTOS
💻 C
字号:
/********************************************************************************************************
*                                                JWL-GTF						*
*                                           实时多任务操作系统						*
*					     								*
*      				              作者:JWL-GTF			                        *
*  					     日期:2004/03/29                                            *
*					 修改日期:2004/03/29						*
*                                       								*
*                                       功能说明:系统Half-Bottom系统功能				*
*********************************************************************************************************/

/********************************************************************************************************
*                                        jwl_gtf_BHFreeInit						*
* 描述:BH结构及相关链表初始化										*
* 返回:        jwl_gtf_void										*
*********************************************************************************************************/
_jwl_gtf_BuildFreeLinkInit(HB,jwl_gtf_BH)

/********************************************************************************************************
*                                        jwl_gtf_BHInit							*
* 描述:BH结构及相关链表初始化										*
* 返回:        参看JWL-GTF_error.h									*
*********************************************************************************************************/
jwl_gtf_u8 jwl_gtf_BHInit()
{
	jwl_gtf_BHFreeInit();
	jwl_gtf_BHID=0;
	jwl_gtf_BHOther=jwl_gtf_NULL;
	jwl_gtf_BHIdle=jwl_gtf_NULL;
	reutn jwl_gtf_Noerror;
}

/********************************************************************************************************
*                                        jwl_gtf_InserHBHead						*
* 描述:系统HB插入链表头											*
*参数:		a:要被插入的链表头									*
*		b:要插入的HB指针									*
* 返回:		 :jwl_gtf_void										*
*********************************************************************************************************/
_jwl_gtf_BuildInsertLinkHead(HBLink,jwl_gtf_HB)

/********************************************************************************************************
*                                        jwl_gtf_InserHBLinkTail					*
* 描述:系统HB插入链表尾											*
*参数:		a:要被插入的链表尾									*
*		b:要插入的HB器指针									*
* 返回:		 :jwl_gtf_void										*
*********************************************************************************************************/
_jwl_gtf_BuildInsertLinkTail(HBLink,jwl_gtf_HB)

/********************************************************************************************************
*                                        jwl_gtf_DeleteBHLinkHead					*
* 描述:系统BH除链表头											*
*参数:		a:要被删除的链表头									*
* 返回:		 :jwl_gtf_void										*
*********************************************************************************************************/
_jwl_gtf_BuildDeleteLinkHead(HBLink,jwl_gtf_HB)

/********************************************************************************************************
*                                        jwl_gtf_DeleteBHLinkTail					*
* 描述:系统定HB删除链表尾										*
*参数:		a:要被删除的链表尾									*
* 返回:		 :jwl_gtf_void										*
*********************************************************************************************************/
_jwl_gtf_BuildDeleteLinkTail(Timer,jwl_gtf_HB)

/********************************************************************************************************
*                                        jwl_gtf_AddBH							*
* 描述:得到BH并设定运行信息										*
* 参数: (*fun)(void*)	:函数入口									*
* 	param		:函数参数									*
*	RunEnv		:运行位置									*
*	ID		:系统返回ID号									*
*	Bh		:系统返回的BH指针								*
* 返回:        参看JWL-GTF_error.h									*
*********************************************************************************************************/
jwl_gtf_u8 jwl_gtf_AddBH(jwl_gtf_void (*fun)(jwl_gtf_void *),jwl_gtf_void *param,jwl_gtf_bool RunEnv,\
                  jwl_gtf_u8 *ID,jwl_gtf_BH *BH)
{
	jwl_gtf_BH *tmpBH,*oldBH;
	if(jwl_gtf_BHFree==jwl_gtf_NULL)				/*是否有可用的BH*/
		reutrn jwl_gtf_NoAviableBH;				/*没有可用的BH*/
	if(jwl_gtf_BHFree->jwl_gtf_Link->Next==jwl_gtf_NULL)	/*系统中最后一个可用的BH*/
	{
		tmpBH=jwl_gtf_BHFree;
		jwl_gtf_BHFree=jwl_gtf_NULL;
	}
	else								/*否则*/
	{
		tmpBH=jwl_gtf_BHFree;
		jwl_gtf_BHFree=jwl_gtf_BHFree->jwl_gtf_Link->Next;
		jwl_gtf_BHFree->jwl_gtf_Link->Pre=jwl_gtf_BHFree;
	}
	tmpBH->jwl_gtf_func=(*fun)();					/*赋值*/
	tmpBH->jwl_gtf_data=param;
	tmpBH->jwl_gtf_Status=RunEnv;
	tmpBH->jwl_gtf_Pending=jwl_gtf_BHMask;				/*初始化为屏蔽不运行*/
	*ID=jwl_gtf_BHID;
	tmpBH->jwl_gtf_BHID=jwl_gtf_BHID++;
	BH=tmpBH;
	if(RunEnv==jwl_gtf_BHIdle)					/*运行于Idle中*/
	{
		if(jwl_gtf_BHIdle==jwl_gtf_NULL)			/*Idle中没有BH?*/
			jwl_gtf_InserHBHead(jwl_gtf_BHIdle,tmpBH);
		else							/*否则*/
		{
			if(jwl_gtf_BHMethod==jwl_gtf_BHFIFO)
			{
				oldBH=jwl_gtf_BHIdle;
				for(;oldBH->jwl_gtf_BHLink!=jwl_gtf_NULL;oldBH=oldBH->jwl_gtf_BHLink->Next)
				jwl_gtf_InserHBLinkTail(oldBH,tmpBH);
			}
			else
				jwl_gtf_InserHBHead(jwl_gtf_BHIdle,tmpBH);
		}
	}
	else if(RunEnv==jwl_gtf_BHOther)				/*其他*/
	{
		if(jwl_gtf_BHOther==jwl_gtf_NULL)			/*Idle中没有BH?*/
			jwl_gtf_InserHBHead(jwl_gtf_BHOther,tmpBH);
		else							/*否则*/
		{
			if(jwl_gtf_BHMethod==jwl_gtf_BHFIFO)
			{
				oldBH=jwl_gtf_BHOther;
				for(;oldBH->jwl_gtf_BHLink!=jwl_gtf_NULL;oldBH=oldBH->jwl_gtf_BHLink->Next)
				jwl_gtf_InserHBLinkTail(oldBH,tmpBH);
			}
			else
				jwl_gtf_InserHBHead(jwl_gtf_BHOther,tmpBH);
		}
	}
	if(jwl_gtf_BHUsed==jwl_gtf_NULL)				/*是否为NULL*/
	{
		jwl_gtf_BHUsed=tmpBH;
		tmpBH->jwl_gtf_Link->Next=jwl_gtf_NULL;
		tmpBH->jwl_gtf_Link->Pre=jwl_gtf_BHUsed;
	}
	else								/*否*/
	{
		tmpBH->jwl_gtf_Link->Next=jwl_gtf_BHUsed;
		jwl_gtf_BHUsed->jwl_gtf_Link->Pre=tmpBH;
		jwl_gtf_BHUsed=tmpBH;
		tmpBH->jwl_gtf_Link->Pre=jwl_gtf_BHUsed;		
	}
	return jwl_gtf_Noerror;
}

/********************************************************************************************************
*                                        jwl_gtf_FindBH							*
* 描述:查找BH												*
* 参数: ID		:系统查找的ID号									*
* 返回:        系统返回的BH指针										*
*********************************************************************************************************/
jwl_gtf_BH *jwl_gtf_FindBH(jwl_gtf_u8 ID)
{
	jwl_gtf_BH *tmp;
	tmpBH=jwl_gtf_BHUsed;
	for(;tmpBH->jwl_gtf_BHID!=ID&&tmpBH!=jwl_gtf_NULL;tmpBH=tmpBH->jwl_gtf_LInk->Next)
	return tmpBH;
}

/********************************************************************************************************
*                                        jwl_gtf_DelBH							*
* 描述:删除BH												*
* 参数: ID		:给定的ID号									*
*	Bh		:给定的BH指针									*
* 返回:        参看JWL-GTF_error.h									*
*********************************************************************************************************/
jwl_gtf_u8 jwl_gtf_DelBH(jwl_gtf_u8 ID,jwl_gtf_BH *BH)
{
	jwl_gtf_BH *tmpBH;
	if(BH==jwl_gtf_NULL)
	{
		if(tmpBH=jwl_gtf_FindBH(ID)==jwl_gtf_NULL)
			return jwl_gtf_NoBHID;
	}
	else
		tmpBH=BH;
	if(tmpHB->jwl_gtf_BHLink->Pre=tmpBH)				/*是否在链表头?*/
	{
		if(tmpBH->jwl_gtf_Status==jwl_gtf_IdleBH)
			jwl_gtf_DeleteBHLinkHead(tmpHB);
		else
			jwl_gtf_DeleteBHLinkHead(jwl_gtf_BHOther);
	}
	else									/*否则*/
		jwl_gtf_DeleteBHLinkTail(jwl_gtf_BHOther);
	if(tmpBH->jwl_gtf_Link->Pre=tmpBH)
	{
		if(tmpBH->jwl_gtf_Link->Next=jwl_gtf_NULL)
			jwl_gtf_BHUsed==jwl_gtf_NULL;
		else
		{
			jwl_gtf_BHUsed=jwl_gtf_BHUsed->jwl_gtf_Link->Next;
			jwl_gtf_BHUsed->jwl_gtf_Link->Pre=jwl_gtf_BHUsed;
		}
	}
	else
	{
		if(tmpBH->jwl_gtf_Link->Next=jwl_gtf_NULL)
			tmpBH->jwl_gtf_Link->Pre->jwl_gtf_Link->Next=jwl_gtf_NULL;
		else
		{
			tmpBH->jwl_gtf_Link->Next->jwl_gtf_Link->Pre=tmpBH->jwl_gtf_Link->Pre;
			tmpBH->jwl_gtf_Link->Pre->jwl_gtf_Link->Next=tmpBH->jwl_gtf_Link->Next;
		}
	}
	if(jwl_gtf_BHFree==jwl_gtf_NULL)					/*是否空?*/
	{
		jwl_gtf_BHFree=tmpBH;
		tmpBH->jwl_gtf_BHLink->Next=jwl_gtf_NULL;
		tmpBH->jwl_gtf_BHLink->Pre=jwl_gtf_BHFree;
	}
	else									/*否*/
	{
		tmpBH->jwl_gtf_BHLink->Next=jwl_gtf_BHFree;
		jwl_gtf_BHFree->jwl_gtf_BHLink->Pre=tmpBH;
		jwl_gtf_BHFree=tmpBH;
		jwl_gtf_BHFree->jwl_gtf_BHLink=jwl_gtf_BHFree;		
	}
	return jwl_gtf_Noerror;
}

/********************************************************************************************************
*                                        jwl_gtf_MarkBH							*
* 描述:修改BH运行状态											*
* 参数: ID		:给定的ID号									*
*	BH		:给定的BH指针									*
*	RunStatus	:运行状态									*
* 返回:        参看JWL-GTF_error.h									*
*********************************************************************************************************/
jwl_gtf_u8 jwl_gtf_MarkBH(jwl_gtf_u8 ID,jwl_gtf_BH *BH,jwl_gtf_bool RunStatus)
{
	jwl_gtf_BH *tmpBH;
	if(RunStatus!=jwl_gtf_BHMask&&RunStatus!=jwl_gtf_BHRun)
		return jwl_gtf_ParaError;
	if(BH==jwl_gtf_NULL)
	{
		if(tmpBH=jwl_gtf_FindBH(ID)==jwl_gtf_NULL)
			return jwl_gtf_NoBHID;
	}
	else
		tmpBH=BH;
	tmpBH->jwl_gtf_Pending=RunStatus;
	return	jwl_gtf_Noerror;
)

/********************************************************************************************************
*                                        jwl_gtf_ChangeEnvBH						*
* 描述:修改BH运行状态											*
* 参数: ID		:给定的ID号									*
*	BH		:给定的BH指针									*
*	RunEnv		:运行状态									*
* 返回:        参看JWL-GTF_error.h									*
*********************************************************************************************************/
jwl_gtf_u8 jwl_gtf_ChangeEnvBH(jwl_gtf_u8 *ID,jwl_gtf_BH *BH,jwl_gtf_bool EnvStatus)
{
	jwl_gtf_BH *tmpBH,*oldBH;
	if(EnvStatus!=jwl_gtf_BHIdle&&EnvStatus!=jwl_gtf_BHOther)
		return jwl_gtf_ParaError;
	if(BH==jwl_gtf_NULL)
	{
		if(tmpBH=jwl_gtf_FindBH(ID)==jwl_gtf_NULL)
			return jwl_gtf_NoBHID;
	}
	else
		tmpBH=BH;
	if(tmpBH->jwl_gtf_Status==EnvStatus)					/*BH已经在所设的环境?*/
		return jwl_gtf_EnvError;
	if(tmpBH->jwl_gtf_Status==jwl_gtf_IdleBH)				/*改变到Indel环境*/
	{
		if(tmpBH->jwl_gtf_Link->Pre=jwl_gtf_BHIdle)
			jwl_gtf_DeleteBHLinkHead(jwl_gtf_BHIdle);
		else
			jwl_gtf_DeleteBHLinkTail(tmpBH);
		if(jwl_gtf_BHOther==jwl_gtf_NULL)
			jwl_gtf_DeleteBHLinkTail(jwl_gtf_BHOther,tmpBH);
		else
		{
			if(jwl_gtf_BHMethod==jwl_gtf_BHFIFO)
			{
				oldBH=jwl_gtf_BHOther;
				for(;oldBH->jwl_gtf_BHLink!=jwl_gtf_NULL;oldBH=oldBH->jwl_gtf_BHLink->Next)
				jwl_gtf_InserHBLinkTail(oldBH,tmpBH);
			}
			else
				jwl_gtf_InserHBHead(jwl_gtf_BHOther,tmpBH);
		}		
	}
	else									/*改变到其他环境*/
	{
		if(tmpBH->jwl_gtf_Link->Pre=jwl_gtf_BHOther)
			jwl_gtf_DeleteBHLinkHead(jwl_gtf_BHOther);
		else
			jwl_gtf_DeleteBHLinkTail(tmpBH);
		if(jwl_gtf_BHOther==jwl_gtf_NULL)
			jwl_gtf_DeleteBHLinkTail(jwl_gtf_BHOther,tmpBH);
		else
		{
			if(jwl_gtf_BHMethod==jwl_gtf_BHFIFO)
			{
				oldBH=jwl_gtf_BHOther;
				for(;oldBH->jwl_gtf_BHLink!=jwl_gtf_NULL;oldBH=oldBH->jwl_gtf_BHLink->Next)
				jwl_gtf_InserHBLinkTail(oldBH,tmpBH);
			}
			else
				jwl_gtf_InserHBHead(jwl_gtf_BHOther,tmpBH);
		}
	}
	tmpBH->jwl_gtf_Status=EnvStatus;
	return	jwl_gtf_Noerror;
)

/********************************************************************************************************
*                                        jwl_gtf_GetBHInfo						*
* 描述:查找BH												*
* 参数: ID		:系统查找的ID号									*
*	Bh		:系统给定的BH指针								*
* 返回:        jwl_gtf_BHInfo										*
*********************************************************************************************************/
jwl_gtf_BHInfo *jwl_gtf_GetBHInfo(jwl_gtf_u8 ID,jwl_gtf_BH *BH)
{
	jwl_gtf_BH *tmp;
	jwl_gtf_BHInfo *Info;
	if(BH==jwl_gtf_NULL)
		tmp=jwl_gtf_FindBH(ID);
	else
		BH=tmpBH;
	if(tmp==jwl_gtf_NULL)
		return jwl_gtf_NULL;
	else
	{
		Info->jwl_gtf_Status=tmp->jwl_gtf_Status;
		Info->jwl_gtf_Pending=tmp->jwl_gtf_Pending;
		return Info;
	}
}

/********************************************************************************************************
*                                        jwl_gtf_IdleRunList						*
* 描述:运行IdleBH											*
* 返回:        参看JWL-GTF_error.h									*
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_IdleRunList()
{
	jwl_gtf_BH *tmpBH;
	if(jwl_gtf_BHIdle==jwl_gtf_NULL)
		return;
	tmpBH=jwl_gtf_BHIdle;
	for(;tmpBH-=jwl_gtf_NULL;tmpBH=tmpBH->jwl_gtf_BHLink->Next)
	{
		if(tmpBH->jwl_gtf_Pending==jwl_gtf_BHRun)
			jwl_gtf_void(*tmpBH->jwl_gtf_fun)(tmpBH->jwl_gtf_data);	
	}
	return;
}

/********************************************************************************************************
*                                        jwl_gtf_OtherRunList						*
* 描述:运行OtherBH											*
* 返回:        参看JWL-GTF_error.h									*
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_OtherRunList()
{
	jwl_gtf_BH *tmpBH;
	if(jwl_gtf_BHOther==jwl_gtf_NULL)
		return;
	tmpBH=jwl_gtf_BHIdle;
	for(;tmpBH!=jwl_gtf_NULL;tmpBH=tmpBH->jwl_gtf_BHLink->Next)
	{
		if(tmpBH->jwl_gtf_Pending==jwl_gtf_BHRun)
			jwl_gtf_void(*tmpBH->jwl_gtf_fun)(tmpBH->jwl_gtf_data);	
	}
	return;
}

⌨️ 快捷键说明

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