?? jwl-gtf_core.c
字號:
if(strlen(TaskName)>jwl_gtf_NameMaxLen) /*判斷文件名是否過長*/
return jwl_gtf_NameLen;
if(*TaskPro==jwl_gtf_MaxTask) /*判斷線程是否為Idle線程*/
{
if(jwl_gtf_TaskRDFirst!=jwl_gtf_NULL)
return jwl_gtf_Idelexist;
}
if(jwl_gtf_FindProi(TaskPro,tmpTaskCB)==jwl_gtf_Noerror) /*判斷此優先級是否存在*/
{
#if jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable
jwl_gtf_ProStatus=jwl_gtf_True;
tmpTaskCB->jwl_gtf_MulTaskC=jwl_gtf_TaskTiks;
iRet=jwl_gtf_True;
#else
return jwl_gtf_NoSamePro; /*不允許有多個相同優先級的進程存在*/
#endif
}
if(jwl_gtf_Taskfree==jwl_gtf_NULL) /*是否還有空的任務塊*/
return jwl_gtf_NoFreeOCB;
tmpTaskCB=jwl_gtf_Taskfree; /*獲得線程控制塊*/
jwl_gtf_Taskfree=tmpTaskCB->jwl_gtf_Link->Next; /*把所得控制塊從jwl_gtf_Taskfree塊中斷開*/
tmpTaskCB->jwl_gtf_Link->Next->jwl_gtf_Link->pre=jwl_gtf_Taskfree;
tmpTaskCB->jwl_gtf_Link->Next=tmpTaskCB->jwl_gtf_Link->Pre=jwl_gtf_NULL;
tmpTaskCB->jwl_gtf_TaskPro=TaskPr; /*任務控制塊優先級設置*/
jwl_gtf_InsertReadyTask(tmpTaskCB); /*把任務插入到就緒態鏈表中*/
strcpy(tmpTaskCB->jwl_gtf_TaskName,TaskName,strlen(TaskName));
tmpTaskCB->jwl_gtf_TaskID=jwl_gtf_IDNext++;
*TaskID=tmpTaskCB->jwl_gtf_TaskID;
tmpTaskCB->jwl_gtf_TaskPro=TaskPro;
tmpTaskCB->jwl_gtf_RetCode=jwl_gtf_NOerror;
tmpTaskCB->jwl_gtf_TaskStatus=jwl_gtf_Creat;
tmpTaskCB->jwl_gtf_TimeOut=0;
jwl_gtf_WaitTLink=jwl_gtf_NULL;
#if jwl_gtf_ResumeAllTask==jwl_gtf_True
tmpTaskCB->jwl_gtf_HupUpLink={jwl_gtf_NULL,jwl_gtf_NULL};
#endif
#if jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable
if(iRet==jwl_gtf_True)
tmpTaskCB->jwl_gtf_MulTaskC=jwl_gtf_TaskTiks;
else
tmpTaskCB->jwl_gtf_MulTaskC=0;
tmpTaskCB->jwl_gtf_SameProiLink={jwl_gtf_NULL,jwl_gtf_NULL};
#endif
#if Mutex||ConVar
jwl_gtf_EvenLink=jwl_gtf_NULL;
#endif
#if Mutex
jwl_gtf_Mutex=jwl_gtf_NULL;
#endif
#if ConVar
jwl_gtf_ConVar=jwl_gtf_NULL;
#endif
tmpTaskCB->jwl_gtf_task=jwl_gtf_void (*task)(jwl_gtf_void *);
tmpTaskCB->jwl_gtf_param=param;
jwl_gtf_InitStack /*堆棧指針初始化*/
tmpTaskCB->jwl_gtf_PrivateDate=jwl_gtf_NULL;
TaskCB=tmpTaskCB;
jwl_gtf_EnInrupt /*開中斷*/
return jwl_gtf_Noerror; /*成功返回*/
}
/********************************************************************************************************
* jwl_gtf_get_curr *
* 描述:該線程返回當前線程的線程控制塊指針 *
* 參數: TaskCB :線程控制塊指針 *
TaskID :線程ID *
TaskProi : 任務優先級 *
*返回: :參看JWL-GTF_error.h *
*********************************************************************************************************/
jwl_gtf_TaskCB *jwl_gtf_gtf_Curr(jwl_gtf_void)
{
return jwl_gtf_TaskRun;
}
/********************************************************************************************************
* jwl_gtf_get_idle *
* 描述:該線程返回當前線程的線程控制塊指針 *
* 參數: TaskCB :線程控制塊指針 *
TaskID :線程ID *
*返回: :參看JWL-GTF_error.h *
*********************************************************************************************************/
jwl_gtf_TaskCB *jwl_gtf_get_idle(jwl_gtf_void)
{
if(jwl_gtf_TaskRDFirst==jwl_gtf_NULL) /*Idle進程是否存在*/
return jwl_gtf_TaskRDFirst;
else
{
if(jwl_gtf_TaskRDLast!=jwl_gtf_NULL)
return jwl_gtf_TaskRDLast;
else if(jwl_gtf_TaskRDMiddle!=jwl_gtf_NULL)
return jwl_gtf_TaskMiddle;
else
return jwl_gtf_RDLast; /*獲得線程指針*/
}
}
/********************************************************************************************************
* jwl_gtf_FindByID *
* 描述:用TaskID查找任務控制塊 *
* 參數: TaskID :線程任務 ID *
* TaskCB : 線程控制塊指針 *
* *返回: :參看JWL-GTF_error.h *
*********************************************************************************************************/
jwl_gtf_TaskCB *jwl_gtf_FundByID(jwl_gtf_u8 TaskID)
{
jwl_gtf_TaskCB *tmpOCB;
tmpOCB=jwl_gtf_RDFirst;
for(;tmpOCB->jwl_gtf_TaskID!=TaskID&&tmpOCB!=jwl_gtf_NULL;tmpOCB=tmpOCB->jwl_gtf_Link->Next)
return tmpOCB;
}
/********************************************************************************************************
* jwl_gtf_StartRun *
* 描述:是創建態任務進入就緒態 *
* 參數: TaskCB :線程控制塊指針 *
TaskID :線程ID *
*返回: :參看JWL-GTF_error.h *
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_startrun(jwl_gtf_TaskCB *TaskCB,jwl_gtf_u8 TaskID)
{
if(TaskCB==jwl_gtf_NULL) /*所給的任務控制塊是否為NULL*/
{
if(TaskID>jwl_gtf_IDNext) /*ID號是否為合法*/
return jwl_gtf_NoTaskID; /*任務ID號非法*/
else
{
if(TaskCB=jwl_gtf_FundByID(TaskID)!=jwl_gtf_NULL)
return jwl_gtf_NoRunCB;
}
}
if(TaskCB->jwl_gtf_TaskStatus!=jwl_gtf_Creat) /*任務是否在創建態*/
return jwl_gtf_TaskNotCreat; /*任務已經運行了*/
TaskCB->jwl_gtf_TaskStatus=jwl_gtf_Ready;
if(jwl_gtf_TaskRun==jwl_gtf_NULL||TaskCB->jwl_gtf_TaskPro<\ /*當前進程是否為NULL或優先級比運行進程高*/
jwl_gtf_TaskRun->jwl_gtf_TaskPro)
{
tmpExchOCB=TaskCB;
jwl_gtf_Switch
}
return jwl_gtf_Noerror;
}
#if jwl_gtf_SchPolicy==jwl_gtf_MulSchEnable
/********************************************************************************************************
* jwl_gtf_threadyied() *
* 描述:使當前進程放棄對MCU的控制,讓位于相同等級的優先級進程,否則此處理無效 *
* 參數: *
*返回: :參看JWL-GTF_error.h *
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_threadyied()
{
if(jwl_gtf_TaskRun->jwl_gtf_SameProiLink->Next==jwl_gtf_NULL)
return jwl_gtf_NoSameProi; /*運行中的進程沒有相同優先級存在*/
tmpExchOCB=jwl_gtf_TaskRun->jwl_gtf_SameProiLink->Next;
jwl_gtf_Switch
return ;
}
#endif
/********************************************************************************************************
* jwl_gtf_void jwl_gtf_InsertWaitTLinkHead * *
* 描述:插入超時鏈表頭 *
* 參數: a :表頭 *
* b :要插入的指針 *
* *返回: :無 *
*********************************************************************************************************/
_jwl_gtf_BuildInsertLinkHead(WaitTLink,jwl_gtf_TaskCB)
/********************************************************************************************************
* jwl_gtf_void jwl_gtf_InsertWaitTLinkTaskTail *
* 描述:插入超時鏈表頭尾 *
* 參數:a :任務指針指針 *
* b :b插入到a后面 *
* 返回: :jwl_gtf_void *
*********************************************************************************************************/
_jwl_gtf_BuildInsertTail(WaitTLink,jwl_gtf_TaskCB)
/********************************************************************************************************
* jwl_gtf_void jwl_gtf_FindNextReady *
* 描述:確定下一個運行任務指針 *
* 返回: :jwl_gtf_void *
*********************************************************************************************************/
wl_gtf_void jwl_gtf_FindNextRun()
{
jwl_gtf_TaskCB *tmpTaskCB;
tmpTaskCB=jwl_gtf_TaskRun->jwl_gtf_Link->Next;
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_delayTime() *
* 描述:使線程超時處理 *
* 參數: Timeout :超時間 *
* *返回: :無 *
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_delayTime(jwl_gtf_u16 TimeOut)
{
jwl_gtf_TaskCB *tmpTaskCB;
jwl_gtf_TaskRun->jwl_gtf_TaskStatus=jwl_gtf_Dormant;
jwl_gtf_TaskRun->jwl_gtf_TimeOut=TimeOut;
if(jwl_gtf_TOutLink==jwl_gtf_NULL) /*冥睡指針是否NULL*/
{
jwl_gtf_TOutLink=jwl_gtf_TaskRun;
jwl_gtf_TaskRun->jwl_gtf_WaitTLink->Next=jwl_gtf_NULL;
jwl_gtf_TaskRun->jwl_gtf_WaitTLink->pre=jwl_gtf_TOutLink;
}
else /*冥睡指針不是NULL*/
{
tmpTaskCB=jwl_gtf_WaitTLink;
if(jwl_gtf_TaskWaitMethod==jwl_gtf_TaskWaitFIFO) /*先進先出*/
{
for(;tmpTaskCB->jwl_gtf_TimeOut<TimeOut&&tmpTaskCB!=jwl_gtf_NULL;\
tmpTaskCB=tmpTaskCB->jwl_gtf_WaitTLink->Next)
}
else /*后進先出*/
{
for(;tmpTaskCB->jwl_gtf_TimeOut<=TimeOut&&tmpTaskCB!=jwl_gtf_NULL;\
tmpTaskCB=tmpTaskCB->jwl_gtf_WaitTLink->Next)
}
if(tmpTaskCB->jwl_gtf_WaitTLink->pre=tmpTaskCB)
jwl_gtf_InsertWaitTLinkHead(jwl_gtf_TOutLink,tmpTaskCB);
else
jwl_gtf_InsertWaitTLinkTaskTail(tmpTaskCB->jwl_gtf_WaitTLink->Pre,tmpTaskCB);
}
jwl_gtf_FindNextRun();
jwl_gtf_Switch
return;
}
/********************************************************************************************************
* jwl_gtf_DeleteTOutLinkHead *
* 描述:從超時鏈表頭斷開 *
*參數 a :從要斷開的鏈表頭 *
* *返回: :jwl_gtf_void *
*********************************************************************************************************/
_jwl_gtf_BuildDeleteLinkHead(TOutLink,jwl_gtf_TaskCB)
/********************************************************************************************************
* jwl_gtf_DeleteTOutLinkTail *
* 描述:從超時鏈尾斷開 *
*參數 a :從要斷開的鏈表頭 *
* *返回: :jwl_gtf_void *
*********************************************************************************************************/
_jwl_gtf_BuildDeleteLinkTail(TOutLink,jwl_gtf_TaskCB)
/********************************************************************************************************
* jwl_gtf_CancelDelayTask() *
* 描述:取消定超時線程 *
* 參數: TaskID :要取消的指定線程ID *
* TaskCB :要取消指定的線程指針 *
* *返回: :參看JWL-GTF_error.h *
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_CancelDelayTask(jwl_gtf_u8 TaskID,jwl_gtf_TaskCB *TaskCB)
{
jwl_gtf_TaskCB *tmpTaskCB;
if(TaskCB==jwl_gtf_NULL) /*任務指針參數是否為NULL*/
{
if(tmpTaskCB=jwl_gtf_FundByID(TaskID)!=jwl_gtf_NULL)
return jwl_gtf_NoRunCB;
}
else
tmpTaskCB=TaskCB;
if(tmpTaskCB->jwl_gtf_TaskStaus!=jwl_gtf_Dormant)
return jwl_gtf_NotDorStatus; /*線程不在冥睡狀態*/
if(tmpTaskCB->jwl_gtf_TOutLink->Pre==jwl_gtf_TOutLink)
jwl_gtf_DeleteTOutLinkHead(jwl_gtf_TOutLink);
else
jwl_gtf_DeleteTOutLinkTail(tmpTaskCB);
if(tmpTaskCB->jwl_gtf_TaskPro<jwl_gtf_TaskRun->jwl_gtf_TaskPro) /*判斷喚醒的任務優先級是否比運行的高*/
{
tmpExchOCB=tmpTaskCB;
jwl_gtf_Switch
}
return jwl_gtf_Noerror;
}
/********************************************************************************************************
* jwl_gtf_CancelAllDelayTask() *
* 描述:取消定超時線程 *
* *返回: :jwl_gtf_void *
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_CancelAllDelayTask()
{
jwl_gtf_TaskCB *tmpTaskCB,oldTaskCB;
if(jwl_gtf_TOutLink==jwl_gtf_NULL
return;
else
{
oldTaskCB=jwl_gtf_get_idle();
tmpTaskCB=jwl_gtf_TOutLink;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -