📄 jwl-gtf_core.c
字号:
/********************************************************************************************************
* JWL-GTF *
* 实时多任务操作系统 *
* *
* 作者:JWL-GTF *
* 日期:2004/04/24 *
* 修改日期:2004/04/24 *
* *
* 功能说明:线程的基本管理 *
*********************************************************************************************************/
#include "JWL-GTF.H"
/*定义全局变量*/
#if (jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable)
static jwl_gtf_TaskCB jwl_gtf_Task[jwl_gtf_MaxTask+jwl_gtf_FreeTask]; /*本系统中总的可用任务数*/
jwl_gtf_bool jwl_gtf_ProStatus; /*当前插入的优先级是否存在,True存在,False不存在*/
#else
static jwl_gtf_TaskCB jwl_gtf_Task[jwl_gtf_MaxTask]; /*本系统中总的可用任务数*/
#endif
jwl_gtf_TaskCB *tmpExchOCB;
/********************************************************************************************************
* jwl_gtf_TaskFreeInit *
* 描述:系统初始化全局任务OCB *
* 参数: 无 *
* 返回: 无 *
*********************************************************************************************************/
_jwl_gtf_BuildFreeLinkInit(Task,jwl_gtf_MaxTask+jwl_gtf_FreeTask)
/********************************************************************************************************
* jwl_gtf_TaskVarInit *
* 描述:系统初始化及对一些定义进行检测 *
* 参数: 无 *
* 返回: jwl_gtf_MaxTask :参看JWL-GTF_error.h *
* jwl_gtf_EqProPoli *
* jwl_gtf_Noerror *
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_TaskVarInit()
{
jwl_gtf_IDNext=0; /*初始化任务ID号,从0开始,新建一个则应jwl_gtf_INNext++*/
jwl_gtf_ReadyCounter=0; /*就绪态线程计数初始0*/
jwl_gtf_TaskFree=jwl_gtf_NULL;
jwl_gtf_TaskRun=jwl_gtf_NULL;
jwl_gtf_TaskRDFirst=jwl_gtf_NULL;
jwl_gtf_TaskRDMiddle=jwl_gtf_NULL;
jwl_gtf_TaskRDLast=jwl_gtf_NULL;
jwl_gtf_TOutLink=jwl_gtf_NULL;
#if jwl_gtf_ResumeAllTask==jwl_gtf_True
jwl_gtf_TaskHupup=jwl_gtf_NULL:
#endif
#if jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable
jwl_gtf_MulCLink=jwl_gtf_NULL;
#endif
jwl_gtf_TaskFreeInit(); /*初始化任务OCB*/
return jwl_gtf_Noerror;
}
/********************************************************************************************************
* jwl_gtf_FindProi *
* 描述:查看是否有相同的优先级 *
* 参数: TaskProi :待查的优先级 *
* TaskCB :找到时返回的线程指针 *
* 返回: jwl_gtf_Noerror :成功找到 *
* jwl_gtf_NoFindProi :没有找到 *
*********************************************************************************************************/
jwl_gtf_TaskCB *jwl_gtf_FindProi(jwl_gtf_u8 TaskProi)
{
jwl_gtf_TaskCB *jwl_gtf_OCB;
jwl_gtf_OCB=jwl_gtf_RDFirst;
for(;jwl_gtf_OCB->jwl_gtf_TaskPro!=TaskPro&&jwl_gtf_OCB!=jwl_gtf_NULL;\
jwl_gtf_OCB=jwl_gtf_OCB->jwl_gtf_Link->Next))
return jwl_gtf_OCB;
}
/********************************************************************************************************
* jwl_gtf_FindName *
* 描述:查看系统中的线程的名字是否存在 *
* 参数: TaskName :待查线称的名字 *
* TaskCB :找到时返回的线程指针 *
* 返回: jwl_gtf_Noerror :成功找到 *
* jwl_gtf_NoFindProi :没有找到 *
*********************************************************************************************************/
jwl_gtf_s8 *jwl_gtf_FindName(jwl_gtf_u8 *TaskName,jwl_gtf_TaskCB *TaskCB)
{
if(strlen(TaskName)==0) /*名字是否为空?*/
return jwl_gtf_ParaError;
jwl_gtf_TaskCB *jwl_gtf_OCB;
jwl_gtf_OCB=jwl_gtf_RDFirst;
for(;jwl_gtf_OCB;)
{
if(strlen(jwl_gtf_OCB->jwl_gtf_TaskName)==strlen(TaskName)
{
if(strncmp(jwl_gtf_OCB->jwl_gtf_TaskName,TaskName,strlen(TaskName)==0)
{
TaskCB=jwl_gtf_OCB;
return jwl_gtf_Noerror;
}
}
jwl_gtf_OCB=jwl_gtf_OCB->jwl_gtf_Link->Next;
}
return jwl_gtf_NoFindName; /*没有找到相应的控制块*/
}
/********************************************************************************************************
* jwl_gtf_void jwl_gtf_InsertSameProiLinkTaskTail *
* 描述:插入优先级相同就绪任务链表头 *
* 参数:a :任务指针指针 *
* b :b插入到a后面 *
* 返回: :jwl_gtf_void *
*********************************************************************************************************/
_jwl_gtf_BuildInsertTail(SameProiLink,jwl_gtf_TaskCB)
/********************************************************************************************************
* jwl_gtf_InsertReadyTask *
* 描述:插入就优先级相等绪任务链尾 *
* 参数:TaskCB :待要插入的任务指针 *
* *
* 返回: :jwl_gtf_void *
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_InsertReadyTask(jwl_gtf_TaskCB *TaskCB)
{
jwl_gtf_TaskCB *jwl_gtf_OCB;
if(jwl_gtf_TaskRDFirst==jwl_gtf_NULL) /*是否没有线程:First==Middle==Last==NULL*/
{
jwl_gtf_TaskRDFirst=TaskCB;
jwl_gtf_TaskRDFirst->jwl_gtf_Link->Next=jwl_gtf_NULL;
jwl_gtf_TaskRDFirst->jwl_gtf_Link->Pre=TaskCB;
}
else if(jwl_gtf_TaskRDMiddle==jwl_gtf_NULL) /*系统中目前只有一个进程*/
{
jwl_gtf_TaskRDMiddle=jwl_gtf_TaskRDFirst;
jwl_gtf_TaskRDFirst=TaskCB;
jwl_gtf_TaskRDmiddle->jwl_gtf_Link->Pre=TaskCB;
jwl_gtf_TaskRDFirst->jwl_gtf_Link->Pre=TaskCB;
}
else if(jwl_gtf_TaskRDLast==jwl_gtf_NULL) /*系统中只有2个任务,即First==Middle=同一ID*/
{
jwl_gtf_TaskRDLast=jwl_gtf_TaskRDMiddle;
if(TaskCB->jwl_gtf_TaskPro<jwl_gtf_RDFirst->jwl_gtf_TaskPro) /*TaskCB的优先级小于First*/
{
jwl_gtf_TaskRDMiddle=jwl_gtf_TaskRDFirst;
jwl_gtf_TaskRDFirst=TaskCB;
}
else if(Task->jwl_gtf_TaskPro>jwl_gtf_TaskRDFirst->jwl_gtf_TaskPro) /*TaskCB的优先级大于First*/
jwl_gtf_TaskRDMiddle=TaskCB;
#if jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable
else /*TaskCB的优先级等于First*/
{
if(jwl_gtf_MulSchMethod==jwl_gtf_TaskFIFO) /*先进先出方式排列*/
jwl_gtf_TaskRDMiddle=TaskCB;
else /*后进先出排列*/
{
jwl_gtf_TaskRDMiddle=jwl_gtf_TaskRDFirst;
jwl_gtf_TaskRDFirst=TaskCB;
}
jwl_gtf_TaskRDFirst->jwl_gtf_SameProiLink=jwl_gtf_Link;
jwl_gtf_TaskRDFirst->jwl_gtf_SameProiLink->jwl_gtf_TaskRDMiddle;
jwl_gtf_TaskRDMiddle->jwl_gtf_SameProiLink->Pre=jwl_gtf_NULL;
jwl_gtf_TaskRDMiddle->jwl_gtf_SameProiLink->Next=jwl_gtf_NULL;
}
#endif
jwl_gtf_TaskRDLast->jwl_gtf_Link->Pre=jwl_gtf_TaskRDMiddle;
jwl_gtf_TaskRDMiddle->jwl_gtf_Link->Next=jwl_gtf_TaskRDLast;
jwl_gtf_TaskRDMiddle->jwl_gtf_Link->Pre=jwl_gtf_TaskRDFirst;
jwl_gtf_TaskRDFirst->jwl_gtf_Link->Next=jwl_gtf_TaskRDMiddle;
jwl-gtf_TaskRDFirst->jwl_gtf_Link->Pre=jwl_gtf_TaskRDFirst;
}
else if(jwl_gtf_TaskRDMiddle->jwl_gtf_TaskPro=>TaskCB->jwl_gtf_TaskPro) /*判断Middle->Proi>=TaskCB->jwl_gtf_TaskProi?*/
{
jwl_gtf_OCB=jwl_gtf_TaskRDFirst;
#if jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable
if(jwl_gtf_ProStatus!=jwl_gtf_True) /*存在相同优先级的任务*/
{
#endif
for(;jwl_gtf_OCB->TaskPro<TaskCB->jwl_gtf_TaskPro;jwl_gtf_OCB=\
jwl_gtf_OCB->jwl_gtf_Link->Next)
#if jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable
}
else /*存存在相同优先级的任务存在*/
{
if(jwl_gtf_MulSchMethod==jwl_gtf_TaskFIFO) /*先进先出*/
for(;jwl_gtf_OCB->jwl_gtf_TaskPro<=TaskCB->jwl_gtf_TaskPro;\
jwl_gtf_OCB=jwl_gtf_OCB->jwl_gtf_Link->Next)
else /*后进先出*/
for(;jwl_gtf_OCB->jwl_gtf_TaskPro!=TaskCB->jwl_gtf_TaskPro;\
jwl_gtf_OCB=jwl_gtf_OCB->jwl_gtf_Link->Next)
}
if(jwl_gtf_OCB->jwl_gtf_TaskPro>TaskCB->jwl_gtf_TaskPro) /*待插入的优先级是否在系统中最大*/
{
TaskCB->jwl_gtf_Link->Next=jwl_gtf_TaskRDFirst;
jwl_gtf_TaskRDFirst->jwl_gtf_Link->Pre=TaskCB;
jwl_gtf_TaskRDFirst=TaskCB;
TaskCB->jwl_gtf_Link->Pre=jwl_gtf_TaskRDFirst;
}
else
{
TaskCB->jwl_gtf_Link->Next=jwl_gtf_OCB;
jwl_gtf_OCB->jwl_gtf_Link->Pre->jwl_gtf_Link->Next=TaskCB;
TaskCB->jwl_gtf_Link->Pre=jwl_gtf_OCB->jwl_gtf_Link->Pre;
jwl_gtf_OCB->jwl_gtf_Link->Pre=TaskCB;
}
jwl_gtf_ReadyCounter++;
#endif
}
else /*Middle->Proi<TaskCB->jwl_gtf_TaskProi*/
{
jwl_gtf_OCB=jwl_gtf_TaskRDMiddle->jwl_gtf_Link->Next;
#if jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable
if(jwl_gtf_ProStatus!=jwl_gtf_True) /*存在相同优先级的任务*/
{
#endif
for(;jwl_gtf_OCB->TaskPro<TaskCB->jwl_gtf_TaskPro;jwl_gtf_OCB=\
jwl_gtf_OCB->jwl_gtf_Link->Next)
#if jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable
}
else /*存存在相同优先级的任务存在*/
{
if(jwl_gtf_MulSchMethod==jwl_gtf_TaskFIFO) /*先进先出*/
for(;jwl_gtf_OCB->jwl_gtf_TaskPro<=TaskCB->jwl_gtf_TaskPro;\
jwl_gtf_OCB=jwl_gtf_OCB->jwl_gtf_Link->Next)
else /*后进先出*/
for(;jwl_gtf_OCB->jwl_gtf_TaskPro!=TaskCB->jwl_gtf_TaskPro;\
jwl_gtf_OCB=jwl_gtf_OCB->jwl_gtf_Link->Next)
}
TaskCB->jwl_gtf_Link->Next=jwl_gtf_OCB;
jwl_gtf_OCB->jwl_gtf_Link->Pre->jwl_gtf_Link->Next=TaskCB;
TaskCB->jwl_gtf_Link->Pre=jwl_gtf_OCB->jwl_gtf_Link->Pre;
jwl_gtf_OCB->jwl_gtf_Link->Pre=TaskCB;
jwl_gtf_ReadyCounter--;
}
#if jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable
if(jwl_gtf_ProStatus==jwl_gtf_True) /*把相同优先级的线程控制块连接起来*/
{
if(jwl_gtf_MulSchMethod==jwl_gtf_TaskFIFO) /*先进先出*/
{
if(TaskCB->jwl_gtf_Link->Pre->jwl_gtf_SameProLink->Next==jwl_gtf_NULL) /*是否第二个相同的优先级*/
{
TaskCB->jwl_gtf_Link->Pre->jwl_gtf_SameProiLink->Pre=TaskCB;
TaskCB->jwl_gtf_Link->Pre->jwl_gtf_SameProiLink->Next=TaskCB;
TaskCB->jwl_gtf_SameProiLink->Pre=TaskCB->jwl_gtf_Link->Pre;
TaskCB->jwl_gtf_SameProiLink->Next=TaskCB->jwl_gtf_Link->Pre;
}
else
jwl_gtf_InsertSameProiLinkTaskTail(TaskCB->jwl_gtf_List->Pre,TaskCB);
}
else /*后进先出*/
{
if(TaskCB->jwl_gtf_Link->Next->jwl_gtf_SameProiLink->Next==jwl_gtf_NULL) /*是否第二个相同的优先级*/
{
TaskCB->jwl_gtf_Link->Next->jwl_gtf_SameProiLink->Pre=TaskCB;
TaskCB->jwl_gtf_Link->Next->jwl_gtf_SameProiLink->Next=TaskCB;
TaskCB->jwl_gtf_SameProiLink->Pre=TaskCB->jwl_gtf_Link->Next;
TaskCB->jwl_gtf_SameProiLink->Next=TaskCB->jwl_gtf_Link->Next;
}
else
{
if(jwl_gtf_TaskRun==TaskCB->jwl_gtf_Link->Next) /*进程是否正在运行*/
jwl_gtf_InsertSameProiLinkTaskTail(TaskCB->jwl_gtf_List->Next,TaskCB);
jwl_gtf_InsertSameProiLinkTaskTail(TaskCB->jwl_gtf_List->Next->jwl_gtf_SameProiLink->Pre,TaskCB);
}
}
jwl_gtf_ProStatus=jwl_gtf_False; /*恢复优先级状态标志*/
}
#endif
if(jwl_gtf_ReadyCounter==2)
{
jwl_gtf_TaskRDMiddle=jwl_gtf_TaskRDMiddle->jwl_gtf_Link->Pre;
jwl_gtf_TaskRDMiddle=0;
}
else if(jwl_gtf_ReadyCounter==-2)
{
jwl_gtf_TaskRDMiddle=jwl_gtf_TaskRDMiddle->jwl_gtf_Link-Next;
jwl_gtf_TaskRDMiddle=0;
}
return;
}
/********************************************************************************************************
* TaskCreate *
* 描述:系统创建线程并初始化一些变量 *
* 参数: TaskName :线程名 *
TaskPro :线程优先级 *
(*task)(void *pd) :线程函数入口 *
param :线程函数参数 *
* TaskIDk :任务ID *
* TaskCB :创建任务指针 *
*返回: :参看JWL-GTF_error.h *
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_u8 TaskCreate(jwl_gtf_u8 *TaskName,jwl_gtf_u16 TaskPro,jwl_gtf_void (*task)(jwl_gtf_void *),\
jwl_gtf_void *param,jwl_gtf_u8 *TaskID,jwl_gtf_TaskCB *TaskCB)
{
jwl_gtf_s8 iRet=jwl_gtf_False;
jwl_gtf_TaskCB *tmpTaskCB;
jwl_gtf_ClrInrupt /*关中断*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -