📄 jwl-gtf_hb.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 + -