?? jwl-gtf_core.c
字號:
/********************************************************************************************************
* JWL-GTF *
* 實時多任務操作系統(tǒng) *
* *
* 作者: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]; /*本系統(tǒng)中總的可用任務數(shù)*/
jwl_gtf_bool jwl_gtf_ProStatus; /*當前插入的優(yōu)先級是否存在,True存在,False不存在*/
#else
static jwl_gtf_TaskCB jwl_gtf_Task[jwl_gtf_MaxTask]; /*本系統(tǒng)中總的可用任務數(shù)*/
#endif
jwl_gtf_TaskCB *tmpExchOCB;
/********************************************************************************************************
* jwl_gtf_TaskFreeInit *
* 描述:系統(tǒng)初始化全局任務OCB *
* 參數(shù): 無 *
* 返回: 無 *
*********************************************************************************************************/
_jwl_gtf_BuildFreeLinkInit(Task,jwl_gtf_MaxTask+jwl_gtf_FreeTask)
/********************************************************************************************************
* jwl_gtf_TaskVarInit *
* 描述:系統(tǒng)初始化及對一些定義進行檢測 *
* 參數(shù): 無 *
* 返回: 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; /*就緒態(tài)線程計數(shù)初始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 *
* 描述:查看是否有相同的優(yōu)先級 *
* 參數(shù): TaskProi :待查的優(yōu)先級 *
* 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 *
* 描述:查看系統(tǒng)中的線程的名字是否存在 *
* 參數(shù): 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 *
* 描述:插入優(yōu)先級相同就緒任務鏈表頭 *
* 參數(shù):a :任務指針指針 *
* b :b插入到a后面 *
* 返回: :jwl_gtf_void *
*********************************************************************************************************/
_jwl_gtf_BuildInsertTail(SameProiLink,jwl_gtf_TaskCB)
/********************************************************************************************************
* jwl_gtf_InsertReadyTask *
* 描述:插入就優(yōu)先級相等緒任務鏈尾 *
* 參數(shù):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) /*系統(tǒng)中目前只有一個進程*/
{
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) /*系統(tǒng)中只有2個任務,即First==Middle=同一ID*/
{
jwl_gtf_TaskRDLast=jwl_gtf_TaskRDMiddle;
if(TaskCB->jwl_gtf_TaskPro<jwl_gtf_RDFirst->jwl_gtf_TaskPro) /*TaskCB的優(yōu)先級小于First*/
{
jwl_gtf_TaskRDMiddle=jwl_gtf_TaskRDFirst;
jwl_gtf_TaskRDFirst=TaskCB;
}
else if(Task->jwl_gtf_TaskPro>jwl_gtf_TaskRDFirst->jwl_gtf_TaskPro) /*TaskCB的優(yōu)先級大于First*/
jwl_gtf_TaskRDMiddle=TaskCB;
#if jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable
else /*TaskCB的優(yōu)先級等于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) /*存在相同優(yōu)先級的任務*/
{
#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 /*存存在相同優(yōu)先級的任務存在*/
{
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) /*待插入的優(yōu)先級是否在系統(tǒng)中最大*/
{
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) /*存在相同優(yōu)先級的任務*/
{
#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 /*存存在相同優(yōu)先級的任務存在*/
{
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) /*把相同優(yōu)先級的線程控制塊連接起來*/
{
if(jwl_gtf_MulSchMethod==jwl_gtf_TaskFIFO) /*先進先出*/
{
if(TaskCB->jwl_gtf_Link->Pre->jwl_gtf_SameProLink->Next==jwl_gtf_NULL) /*是否第二個相同的優(yōu)先級*/
{
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) /*是否第二個相同的優(yōu)先級*/
{
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; /*恢復優(yōu)先級狀態(tài)標志*/
}
#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 *
* 描述:系統(tǒng)創(chuàng)建線程并初始化一些變量 *
* 參數(shù): TaskName :線程名 *
TaskPro :線程優(yōu)先級 *
(*task)(void *pd) :線程函數(shù)入口 *
param :線程函數(shù)參數(shù) *
* TaskIDk :任務ID *
* TaskCB :創(chuàng)建任務指針 *
*返回: :參看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 + -