📄 jwl-gtf_sem.c
字号:
/********************************************************************************************************
* JWL-GTF *
* 实时多任务操作系统 *
* *
* 作者:JWL-GTF *
* 日期:2004/03/18 *
* 修改日期:2004/04/01 *
* *
* 功能说明:信号量详细实现功能 *
*********************************************************************************************************/
/*初始化宏定义*/
_jwl_gtf_BuildFreeLinkInit(Sem,jwl_gtf_MaxSem)
/********************************************************************************************************
* jwl_gtf_SemInit *
* 描述:系统初始化全局全局信号量 *
* 参数: 无 *
* 返回: 无 *
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_SemFreeInit()
{
jwl_gf_SemID=0;
jwl_gtf_SemUsed=jwl_gtf_NULL:
jwl_gtf_SemWaitT=jwl_gtf_NULL;
wl_gtf_SemFreeInit();
retrun;
}
/********************************************************************************************************
* jwl_gtf_GetSem *
* 描述:获得空闲信号量 *
* 参数: SemID *
* Sem *
* 返回: 参看JWL-GTF.H *
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_GetFreeSem(jwl_gtf_Sem *Sem,jwl_gtf_u8 *SemID)
{
if(jwl_gtf_SemFree==jwl_gtf_NULL)
return jwl_gtf_NoSemRes;
Sem=jwl_gtf_SemFree;
if(jwl_gtf_SemFree->jwl_gtf_Link->Next=jwl_gtf_NULL)
jwl_gtf_SemFree=jwl_gtf_NULL;
else
{
jwl_gtf_SemFree=jwl_gtf_SemFree->jwl_gtf_Link->Next;
jwl_gtf_SemFree->jwl_gtf_Link->Pre=jwl_gtf_SemFree;
}
if(jwl_gtf_SemUsed==jwl_gtf_NULL)
{
jwl_gtf_SemUsed=Sem;
jwl_gtf_SemUsed->jwl_gtf_Link->Next=jwl_gtf_NULL;
jwl_gtf_SemUsed->jwl_gtf_link->Pre=jwl_gtf_SemUsed;
}
else
{
Sem->jwl_gtf_Link->Next=jwl_gtf_SemUsed;
jwl_gtf_SemUsed->jwl_gtf_Link->Pre=Sem;
jwl_gtf_SemUsed=Sem;
jwl_gtf_SemUsed->jwl_gtf_Link->Pre=jwl_gtf_SemUsed;
}
*SemID=Sem->jwl_gtf_SemID=jwl_gtf_SemID++;
Sem->jwl_gtf_Status=jwl_gtf_SemUnInit; /*初始化用*/
return jwl_gtf_NULL:
}
/********************************************************************************************************
* jwl_gtf_FindSem *
* 描述:系统初始化全局全局互斥体 *
* 参数: SemID *
* 返回: jwl_gtf_Sem *
*********************************************************************************************************/
jwl_gtf_Sem *jwl_gtf_FindSem(jwl_gtf_u8 SemID)
{
jwl_gtf_Sem *tmpSem;
if(jwl_gtf_SemUsed==jwl_gtf_NULL)
return jwl_gtf_NULL;
tmpSem=jwl_gtf_SemUsed;
for(;tmpSem&&tmpSem->jwl_gtf_SemID!=SemID;tmpSem=tmpSem->jwl_gtf_Link->Next)
return tmpSem;
}
/********************************************************************************************************
* jwl_gtf_FreeSem *
* 描述:系统初释放回收信号量 *
* 参数: SemID *
* Sem *
* 返回: 参看JWL-GTF.H *
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_FreeSem(jwl_gtf_Sem *Sem,jwl_gtf_u8 SemID)
{
jwl_gtf_Sem *tmpSem;
if(Sem==jwl_gtf_NULL)
{
if(tmpSem=jwl_gtf_FindSem(SemID)==jwl_gtf_NULL)
return jwl_gtf_NotSemID;
}
else
tmpSem=Sem;
if(tmpSem->jwl_gtf_Count!=tmpSem->jwl_gtf_Save&&tmpSem->Status!=jwl_gtf_SemUnInit)
return jwl_gtf_SemResUsing;
if(tmpSem->jwl_gtf_Link->Pre==tmpSem)
{
if(tmpSem->jwl_gtf_Link->Next==jwl_gtf_NULL)
jwl_gtf_SemUsed=jwl_gtf_NULL;
else
{
jwl_gtf_SemUsed=jwl_gtf_SemUsed->jwl_gtf_Link->Next;
jwl_gtf_SemUsed->jwl_gtf_Link->Next=jwl_gtf_NULL;
jwl_gtf_SemUsed->jwl_gtf_Link->Pre=jwl_gtf_SemUsed;
}
}
else if(tmpSem->jwl_gtf_Link->Next==jwl_gtf_NULL)
tmpSem->jwl_gtf_Link->Pre->jwl_gtf_Link->Next=jwl_gtf_NULL;
else
{
tmpSem->jwl_gtf_Link->Pre->jwl_gtf_Link->Next=\
tmpSem->jwl_gtf_Link->Next;
tmpSem->jwl_gtf_Link->Next->jwl_gtf_Link->Pre=\
tmpSem->jwl_gtf_Link->Pre;
}
if(jwl_gtf_SemFree==jwl_gtf_NULL)
{
jwl_gtf_SemFree=tmpSem;
jwl_gtf_SemFree->jwl_gtf_Link->Next=jwl_gtf_NULL;
jwl_gtf_SemFree->jwl_gtf_Link->Pre=jwl_gtf_SemFree;
}
else
{
tmpSem->jwl_gtf_Link->Next=jwl_gtf_SemFree;
jwl_gtf_SemFree->jwl_gtf_Link->Pre=tmpSem;
jwl_gtf_SemFree=tmpSem;
tmpSem->jwl_gtf_Link->Pre=tmpSem;
}
return jwl_gtf_NULL:
}
/********************************************************************************************************
* jwl_gtf_SemInit *
* 描述:系统初始化全局全局互斥体 *
* 参数: SemID *
* Sem *
* Count *
* WaitStatus *
* 返回: 参看JWL-GTF.H *
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_SemInit(jwl_gtf_Sem *Sem,jwl_gtf_u8 SemID,jwl_gtf_u32 Count,jwl_gtf_bool Status)
{
jwl_gtf_Sem *tmpSem;
if(Count<=0)
return jwl_gtf_ParaError;
if(Status!=jwl_gtf_SemPro&&Status!=jwl_gtf_SemFIFO&&Status!=jwl_gtf_SemLIFO)
return jwl_gtf_ParaError;
if(Sem==jwl_gtf_NULL)
{
if(tmpSem=jwl_gtf_FindSem(SemID)==jwl_gtf_NULL)
return jwl_gtf_NotSemID;
}
else
tmpSem=Sem;
if(tmpSem->jwl_gtf_Save!=-1)
return jwl_gtf_SemInited; /*已经初始化*/
tmpSem->jwl_gtf_Count=Count;
tmpSem->jwl_gtf_Save=Count;
tmpSem->jwl_gtf_SemLink=jwl_gtf_NULL;
tmpSem->jwl_gtf_WStatus=Status;
tmpSem->jwl_gtf_Status=jwl_gtf_SemInit;
return Noerror;
}
/********************************************************************************************************
* jwl_gtf_GetSem *
* 描述:获得空闲信号量 *
* 参数: SemID *
* Sem *
* TimeOut *
* 返回: 参看JWL-GTF.H *
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_GetSem(jwl_gtf_Sem *Sem,jwl_gtf_u8 SemID,jwl_gtf_u32 TimeOut)
{
jwl_gtf_TaskCB *tmpTaskCB;
jwl_gtf_Sem *tmpSem;
jwl_gtf_s8 tmpRetCode;
if(TimeOut<0)
return jwl_gtf_ParaError;
if(Sem==jwl_gtf_NULL)
{
if(tmpSem=jwl_gtf_FindSem(SemID)==jwl_gtf_NULL)
return jwl_gtf_NotSemID;
}
else
tmpSem=Sem;
if(tmpSem->jwl_gtf_Status==jwl_gtf_SemUnInit) /*信号量没有初始化*/
returen jwl_gtf_SemNoInit;
jwl_gtf_TaskRun->jwl_gtf_TaskStatus=jwl_gtf_TaskRun->jwl_gtf_TaskStatus|jwl_gtf_Sem;
jwl_gtf_TaskRun->jwl_gtf_Sem=tmpSem;
if(tmpSem->jwl_gtf_Count>0)
tmpSem->jwl_gtf_Count--;
else
{
if(tmpSem->jwl_gtf_SemLink==jwl_gtf_NULL)
{
tmpSem->jwl_gtf_SemLink=jwl_gtf_TaskRun;
tmpSem->jwl_gtf_SemLink->jwl_gtf_EvenLink->Next=jwl_gtf_NULL;
tmpSem->jwl_gtf_SemLink->jwl_gtf_EvenLink->Pre=tmpSem->jwl_gtf_SemLink;
}
else if(tmpSem->jwl_gtf_WStatus==jwl_gtf_Sem_Pro) /*按优先级顺序*/
{
tmpTaskCB=tmpSem->jwl_gtf_SemLink;
for(;tmpTaskCB->jwl_gtf_TaskPro<=jwl_gtf_TaskRun->jwl_gtf_TaskPro&&\
tmpTaskCB!=jwl_gtf_NULL;tmpTaskCB=tmpTaskCB->jwl_gtf_EvenLink->Next)
if(tmpTaskCB->jwl_gtf_EvenLink->Pre=tmpTaskCB)
{
jwl_gtf_TaskRun->jwl_gtf_EvenLink->Next=tmpSem->jwl_gtf_SemLink;
tmpSem->jwl_gtf_SemLink->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
tmpSem->jwl_gtf_SemLink=jwl_gtf_TaskRun;
tmpSem->jwl_gtf_SemLink->jwl_gtf_EvenLink->Pre=tmpSem->jwl_gtf_SemLink;
}
else if(tmpTaskCB!=jwl_gtf_NULL)
{
tmpTaskCB->jwl_gtf_EvenLink->Pre->jwl_gtf_EvenLink->Next=jwl_gtf_TaskRun;
jwl_gtf_TaskRun->jwl_gtf_EvenLink->Pre=tmpTaskCB->jwl_gtf_EvenLink->Pre;
jwl_gtf_TaskRun->jwl_EvenLink->Next=jwl_gtf_NULL;
}
else
{
tmpTaskCB->jwl_gtf_EvenLink->Pre->jwl_gtf_EvenLink->Next=jwl_gtf_TaskRun;
jwl_gtf_TaskRun->jwl_gtf_EvenLink->Next=tmpTaskCB->jwl_gtf_EvenLink->Pre;
tmpTaskCB->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
jwl_gtf_TaskRun->jwl_gtf_EvenLink->Next=tmpTaskCB:
}
}
else if(tmpSem->jwl_gtf_WStatus==jwl_gtf_SemFIFO) /*按先进先出*/
{
tmpTaskCB=tmpSem->jwl_gtf_SemLink;
for(;tmpTaskCB->jwl_gtf_EnveLink->Next!=jwl_gtf_NULL;\
tmpTaskCB=tmpTaskCB->jwl_gtf_EvenLink->Next)
tmpTaskCB->jwl_gtf_EvenLink->Next=jwl_gtf_TaskRun;
jwl_gtf_TaskRun->jwl_gtf_EvenLink->Pre=tmpTaskCB;
jwl_gtf_TaskRun->jwl_gtf_EvenLink->Next=jwl_gtf_NULL;
}
else /*按后进先出*/
{
jwl_gtf_TaskRun->jwl_gtf_EvenLink->Next=tmpSem->jwl_gtf_SemLink;
tmpSem->jwl_gtf_SemLink->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
tmpSem->jwl_gtf_SemLink=jwl_gtf_TaskRun;
tmpSem->jwl_gtf_SemLink->Pre=tmpSem->jwl_gtf_SemLink;
}
if(TimeOut>0)
{
if(jwl_gtf_SemWaitT==jwl_gtf_NULL)
{
jwl_gtf_SemWaitT=jwl_gtf_TaskRun;
jwl_gtf_SemWaitT->jwl_gtf_WaitTLink->Next=jwl_gtf_NULL;
jwl_gtf_SemWaitT->jwl_gtf_WaitTlink->Pre=jwl_gtf_SemWaitT;
}
else
{
jwl_gtf_TaskRun->jwl_gtf_WaitTLink->Next=jwl_gtf_SemWaitT;
jwl_gtf_SemWaitT->jwl_gtf_WaitTLink->Pre=jwl_gtf_TaskRun;
jwl_gtf_SemWaitT=jwl_gtf_TaskRun;
jwl_gtf_SemWaitT->jwl_gtf_WaitTlink->Pre=jwl_gtf_SemWaitT;
}
jwl_gtf_TaskRun->jwl_gt_TimeOut=TimeOut;
}
}
jwl_gtf_FindRunTask();
jwl_gtf_Switch
tmpRetCode=jwl_gtf_TaskCB->jwl_gtf_RetCode;
jwl_gtf_TaskCB->jwl_gtf_RetCode=jwl_gtf_Noerror;
return tmpRetCode;
}
/********************************************************************************************************
* jwl_gtf_PutSem *
* 描述:获得空闲信号量 *
* 参数: SemID *
* Sem *
* 返回: 参看JWL-GTF.H *
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_PutSem(jwl_gtf_Sem *Sem,jwl_gtf_u8 SemID)
{
jwl_gtf_TaskCB *tmpTaskCB;
jwl_gtf_Sem *tmpSem;
if(Sem==jwl_gtf_NULL)
{
if(tmpSem=jwl_gtf_FindSem(SemID)==jwl_gtf_NULL)
return jwl_gtf_NotSemID;
}
else
tmpSem=Sem;
if(tmpSem->jwl_gtf_Status==jwl_gtf_SemUnInit) /*信号量没有初始化*/
returen jwl_gtf_SemNoInit;
if(tmpSem->jwl_gtf_SemLink==jwl_gtf_NULL)
tmpSem->jwl_gtf_Count++;
else
{
tmpTaskCB=tmpSem->jwl_gtf_SemLink;
if(tmpSem->jwl_gtf_SemLink->Next==jwl_gtf_NULL)
tmpSem->jwl_gtf_SemLink=jwl_gtf_NULL;
else
{
tmpSem->jwl_gtf_SemLink=tmpSem->jwl_gtf_SemLink->jwl_gtf_WaitTlink->Next;
tmpSem->jwl_gtf_SemLink->jwl_gtf_WaitTLink->Pre=tmpSem->jwl_gtf_SemLink;
}
tmpTaskCB->jwl_gtf_TaskStatus=tmpTaskCB->jwl_gtf_TaskStatus&(!jwl_gtf_Sem);
tmpTaskCB->jwl_gtf_Sem=jwl_gtf_NULL;
if(tmpTaskCB->jwl_gtf_WaitTLink!={jwl_gtf_NULL,jwlgtf_NULL}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -