📄 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 + -