📄 jwl-gtf_mutex.c
字号:
/********************************************************************************************************
* JWL-GTF *
* 实时多任务操作系统 *
* *
* 作者:JWL-GTF *
* 日期:2004/04/31 *
* 修改日期:2004/04/31 *
* *
* 功能说明:多任务的互斥相关功能定义 *
*********************************************************************************************************/
/********************************************************************************************************
* jwl_gtf_MutexFreeInit *
* 描述:系统初始化全局全局互斥体 *
* 参数: 无 *
* 返回: jwl_gtf_void *
*********************************************************************************************************/
_jwl_gtf_BuildFreeLinkInit(Mutex,jwl_gtf_MutexMax)
/********************************************************************************************************
* jwl_gtf_MutexInit *
* 描述:系统初始化全局全局互斥体 *
* 参数: 无 *
* 返回: 无 *
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_MutexInit()
{
jwl_gtf_MutexFreeInit();
jwl_gtf_MutexUse=jwl_gtf_NULL;
jwl_gtf_MutexID=0;
return ;
}
/********************************************************************************************************
* jwl_gtf_DeleteLinkHead *
* 描述:从不用链表头中短开 *
* 参数: 无 *
* 返回: jwl_gtf_void *
*********************************************************************************************************/
_jwl_gtf_BuildDeleteLinkHead(Link,jwl_gtf_TaskMutex)
/********************************************************************************************************
* jwl_gtf_DeleteLinkTail *
* 描述:从不用链表尾中短开 *
* 参数: 无 *
* 返回: jwl_gtf_void *
*********************************************************************************************************/
_jwl_gtf_BuildDeleteLinkTail(Link,jwl_gtf_TaskMutex)
/********************************************************************************************************
* jwl_gtf_InsertLinkHead *
* 描述:插入可用链表头 *
* 参数: 无 *
* 返回: jwl_gtf_void *
*********************************************************************************************************/
_jwl_gtf_BuildDInsertLinkHead(Link,jwl_gtf_TaskMutex)
/********************************************************************************************************
* jwl_gtf_InsertLinkTail *
* 描述:插入可用链表尾 *
* 参数: 无 *
* 返回: jwl_gtf_void *
*********************************************************************************************************/
_jwl_gtf_BuildDInsertLinkTail(Link,jwl_gtf_TaskMutex)
/********************************************************************************************************
* jwl_gtf_MutexGet *
* 描述:获得互斥体 *
* 参数: ID :系统返回互斥体ID号 *
* Mutex :系统返回互斥体指针 *
* Protocol :优先级反转协议 *
* Status :挂起队列的排列顺序方式 *
* 返回: :参看JWL-GTF_error.h *
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_MutexGet(jwl_gtf_u8 *ID,jwl_gtf_TaskMutex *Mutex,jwl_gtf_bool Protocol,jwl_gtf_bool Status)
{
jwl_gtf_TaskMutex *tmpMutex;
if(jwl_gtf_MutexFree==jwl_gtf_NULL) /*是否有可用的资源*/
return jwl_gtf_NoMutex; /*没有可用的互斥体资源*/
if(Protocol!=jwl_gtf_MutexNone&&Prococol!=jwl_gtf_MutexInherit)
return jwl_gtf_ParaError;
if(Status!=jwl_gtf_MutexPro&&Status!=jwl_gtf_MutexFIFO&&\
Status!=jwl_gtf_MutexLIFO)
return jwl_gtf_ParaError;
if(jwl_gtf_MutexFree==jwl_gtf_NULL)
return jwl_gtf_NoMutex;
tmpMutex=jwl_gtf_MutexFree;
jwl_gtf_DeleteLinkHead(jwl_gtf_MutexFree); /*从空链表中得到一个资源*/
jwl_gtf_InsertLinkHead(jwl_gtf_MutexUse,tmpMutex);
Mutex=tmpMutex;
Mutex->jwl_gtf_Status=jwl_gtf_Usable;
Mutex->jwl_gtf_MutexID=jwl_gtf_MutexID++;
Mutex->jwl_gtf_MutexProtocol=Protocol;
Mutex->jwl_gtf_WaitStatus=Status;
Mutex->jwl_gtf_MutexLink=jwl_gtf_NULL;
Mutex->jwl_gtf_Using=jwl_gtf_NULL;
Mutex->jwl_gtf_RevOCB=jwl_gtf_NULL;
Mutex->jwl_gtf_TOutReturnCode=jwl_gtf_Noerror;
return jwl_gtf_Noerror;
}
/********************************************************************************************************
* jwl_gtf_FindMutex *
* 描述:获得互斥体 *
* 参数: ID :给出的互斥体ID号 *
* Mutex :系统返回的互斥体指针 *
* 返回: :参看JWL-GTF_error.h *
*********************************************************************************************************/
jwl_gtf_TaskMutex *jwl_gtf_FindMutex(jwl_gtf_u8 ID)
{
jwl_gtf_TaskMutex *tmpMutex;
tmpMutex=jwl_gtf_MutexFree;
for(;tmpMutex->jwl_gtf_MutexID!=ID&&tmpMutex!=jwl_gtf_NULL;\
tmpMutex=tmpMutex->jwl_gtf_StatusLink->Next)
return tmpMutex;
}
/********************************************************************************************************
* jwl_gtf_InsertMutexLinkHead *
* 描述:插入可用链表头 *
* 参数: 无 *
* 返回: jwl_gtf_void *
*********************************************************************************************************/
_jwl_gtf_BuildDInsertLinkHead(NutexLink,jwl_gtf_TaskMutex)
/********************************************************************************************************
* jwl_gtf_ProiRevert *
* 描述:获得互斥体 *
* 参数: TaskCB1 :给出的要反转的线程 *
* TaskCB2 :给出的要反转的线程 *
* 返回: :jwl_gtf_voide *
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_ProiRevert(jwl_gtf_TaskCB *TaskCB1,jwl_gtf_TaskCB *TaskCB2)
{
jwl_gtf_List *List;
jwl_gtf_u8 tmpPro;
List=TaskCB1->jwl_gtf_Link;
TaskCB1->jwl_gtf_Link=TaskCB2->jwl_gtf_Link;
TaskCB2->jwl_gtf_Link=List;
tmpPro=TaskCB1->jwl_gtf_TaskPro;
TaskCB1->jwl_gtf_TaskPro=TaskCB2->jwl_gtf_TaskPro;
TaskCB2->jwl_gtf_TaskPro=tmpPro;
return;
}
/********************************************************************************************************
* jwl_gtf_FindRunTask *
* 描述:重新确定可运行的线程 *
* 返回: :jwl_gtf_void *
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_FindRunTask()
{
jwl_gtf_TaskCB *tmpTaskCB;
tmpTaskCB=jwl_gtf_TaskRDFirst;
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_MutexLock *
* 描述:获得互斥体 *
* 参数: MutexID :给出的互斥体ID号 *
* Mutex :给出的互斥体指针 *
* TimeOut :超时时间 *
* 返回: :参看JWL-GTF_error.h *
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_MutexLock(jwl_gtf_u8 MutexID,jwl_gtf_TaskMutex *Mutex,jwl_gtf_u32 TimeOut)
{
jwl_gtf_TaskMutex *tmpMutex;
jwl_gtf_TaskCB *tmpTaskCB;
jwl_gtf_s8 tmpRetCode;
if(TimeOut<0)
return jwl_gtf_ParaError;
if(Mutex==jwl_gtf_NULL) /*互斥体控制块是否为空*/
{
if(tmpMutex=jwl_gtf_FindMutex(MutexID)==jwl_gtf_NULL) /*用ID号找互斥体*/
return jwl_gtf_NoFindMutex;
}
else
tmpMutex=Mutex;
if(tmpMutex->jwl_gtf_Using==jwl_gtf_TaskRun)
return jwl_gtf_NotMutexNest; /*互斥体不能嵌套自己*/
if(tmpMutex->jwl_gtf_Status==jwl_gtf_Usable) /*互斥体是否可用*/
{
jwl_gtf_TaskRun->jwl_gtf_Mutex=tmpMutex;
tmpMutex->jwl_gtf_Using=jwl_gtf_TaskRun;
tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
jwl_gtf_TaskRun->jwl_gtf_Status=jwl_gtf_Ready|jwl_gtf_Mutex;
}
else /*被占用*/
{
jwl_gtf_TaskRun->jwl_gtf_Status=jwl_gtf_Hupup|jwl_gtf_Mutex;
jwl_gtf_TaskRun->jwl_gtf_Mutex=tmpMutex;
if(tmpMutex->jwl_gtf_MutexLink==jwl_gtf_NULL) /*挂起队列指针为空*/
{
tmpMutex->jwl_gtf_MutexLink=jwl_gtf_TaskRun;
jwl_gtf_TaskRun->jwl_gtf_EvenLink->Next=jwl_gtf_NULL;
jwl_gtf_TaskRun->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
}
else /*挂起队列非空*/
{
tmpTaskCB=tmpMutex->jwl_gtf_MutexLink;
if(tmpMutex->jwl_gtf_WaitStatus==jwl_gtf_MutexPro) /*优先级先后顺序*/
{
for(;tmpTaskCB->jwl_gtf_TaskPro<=jwl_gtf_TaskRun->jwl_gtf_TaskPro\
&&tmpTaskCB!=jwl_gtf_NULL;tmpTaskTaskCB=tmpTaskCB->jwl_gtf_MutexLink)
if(tmpTaskCB->jwl_gtf_Pre=tmpTaskCB) /*是否在链表头*/
{
tmpTaskCB->jwl_gtf_EvenLink->Next=jwl_gtf_TaskRun->jwl_gtf_MutexLink;
tmpMutex->jwl_gtf_MutexLink->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
tmpMutex->jwl_gtf_MutexLink=jwl_gtf_TaskRun;
tmpMutex->jwl_gtf_MutexLink->Pre=jwl_gtf_TaskRun->jwl_gtf_MutexLink;
}
else if(tmpTaskCb->jwl_gtf_EvenLink->Next=jwl_gtf_NULL)/*是否在链表尾*/
{
tmpTaskCB->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=tmpTaskCB;
jwl_gtf_TaskRun->jwl_gtf_EvenLink->Pre=tmpTaskCB->jwl_gtf_EvenLink->Pre;
tmpTaskCB->jwl_gtf_EvenLink->Pre->jwl_gtf_EvenLink->Next=jwl_gtf_TaskRun;
tmpTaskCB->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
}
}
else if(tmpMutex->jwl_gtf_WaitStatus==jwl_gtf_MutexFIFO) /*先进先出*/
{
for(;tmpTaskCB->jwl_gtf_EvenLink->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_Next=jwl_gtf_NULL;
}
else /*后进先出*/
{
jwl_gtf_TaskRun->jwl_gtf_EvenLik->Next=tmpMutex->jwl_gtf_MutexLink;
tmpMutex->jwl_gtf_MutexLink->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
tmpMutex->jwl_gtf_MutexLink=jwl_gtf_TaskRun;
jwl_gtf_TaskRun->jwl_gtf_EvenLink->Pre=tmpMutex->jwl_gtf_MutexLink;
}
if(TimeOut!=0) /*处理超时*/
{
jwl_gtf_TaskRUn->jwl_gtf_TimeOut=TimeOut;
if(jwl_gtf_TOutMutex==jwl_gtf_NULL) /*互斥超时队列为空*/
{
jwl_gtf_TOutMutex=jwl_gtf_TaskRun;
jwl_gtf_TaskRun->jwl_gtf_WaitTLink->Next=jwl_gtf_NULL;
jwl_gtf_TaskRun->jwl_gtf_WaitTLink->Pre=jwl_gtf_TOutMutex;
}
else /*不为空*/
{
jwl_gtf_TaskRun->jwl_gtf_WaitTLink->Next=jwl_gtf_TOutMutex;
jwl_gtf_TOutMutex->jwl_gtf_WaitTLink->Pre=jwl_gtf_TaskRun;
jwl_gtf_TOutMutex=jwl_gtf_TaskRun;
jwl_gtf_TaskRun->jwl_gtf_WaitTLink->Pre=jwl_gtf_TOutMutex;
}
}
if(tmpMutex->jwl_gtf_MutexProtocol==jwl_gtf_MutexInherit) /*优先级反转处理*/
{
if(tmpMutex->jwl_gtf_Using->jwl_gtf_TaskPro> /*判断当前进程优先级是否大*/
jwl_gtf_TaskRun->jwl_gtf_TaskRpo)
{
if(tmpMutex->jwl_gtf_Status=jwl_gtf_Using) /*运行没有优先级反转*/
tmpMutex->jwl_gtf_Status=jwl_gtf_ProRev;
else /*运行且已经是优先级反转*/
jwl_gtf_ProiRevert(tmpMutex->jwl_gtf_Using,tmpMutex->jwl_gtf_RevOCB);
tmpMutex->jwl_gtf_RevOCB=jwl_gtf_TaskRun;
jwl_gtf_ProiRevert(tmpMutex->jwl_gtf_Using,tmpMutex->jwl_gtf_RevOCB);
}
}
}
jwl_gtf_FindRunTask();
jwl_gtf_Switch
tmpRetCode=jwl_gtf_TaskRun->jwl_gtf_RetCode;
jwl_gtf_TaskRun->jwl_gtf_RetCode=jwl_gtf_Noerror;
return tmpRetCode;
}
return jwl_gtf_Noerror;
}
/********************************************************************************************************
* jwl_gtf_TryMutexLock *
* 描述:试图获得互斥体,否则退出不等待,失败 *
* 参数: MutexID :给出的互斥体ID号 *
* Mutex :给出的互斥体指针 *
* 返回: :参看JWL-GTF_error.h *
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_TryMutexLock(jwl_gtf_u8 MutexID,jwl_gtf_TaskMutex *Mutex)
{
jwl_gtf_TaskMutex *tmpMutex;
if(Mutex==jwl_gtf_NULL) /*互斥体控制块是否为空*/
{
if(tmpMutex=jwl_gtf_FindMutex(MutexID)==jwl_gtf_NULL) /*用ID号找互斥体*/
return jwl_gtf_NoFindMutex;
}
else
tmpMutex=Mutex;
if(tmpMutex->jwl_gtf_Stauts!=jwl_gtf_Usable)
return jwl_gtf_NoUsableMutex;
else
{
jwl_gtf_TaskRun->jwl_gtf_Mutex=tmpMutex;
tmpMutex->jwl_gtf_Using=jwl_gtf_TaskRun;
tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
jwl_gtf_TaskRun->jwl_gtf_Status=jwl_gtf_Ready|jwl_gtf_Mutex;
return jwl_gtf_Noerror;
}
}
/********************************************************************************************************
* jwl_gtf_MutexUnLock *
* 描述:解锁互斥体 *
* 返回: :参看JWL-GTF_error.h *
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_MutexUnLock()
{
jwl_gtf_Mutex *tmpMutex;
jwl_gtf_TaskCB *tmpTaskCB,*oldTaskCB;
if(jwl_gtf_TaskRun->jwl_gtf_Mutex==jwl_gtf_NULL)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -