⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 systask.c

📁 名厂车载GPS通信终端
💻 C
字号:
#define SYSTASK_GLOBAL
#include "includes.h"

struct TASKSSTRUCT *Usertasklist;
struct TASKSSTRUCT *Freetasklist;

//------------------------------------------------------
//initialize systask.c
void Init_Systask(void)
{
	uchar i;
	
	Usertasklist = NULL;
	Freetasklist = NULL;
	
	for(i=0; i<MAX_TASK_NUM; i++)
	{
		task[i].initproc  = NULL;
		task[i].entryproc = NULL;
		task[i].taskid    = 0;
		task[i].status    = TASK_REMOVED;
	}
	for(i=0; i<MAX_TASK_TCB; i++)
	{
		task_tcb[i].msgid  = 0;
		task_tcb[i].msgptr = NULL;
		task_tcb[i].taskid = 0xff;
		task_tcb[i].next   = Freetasklist;
		Freetasklist       = &task_tcb[i];
	}
}
//find a task
uchar Find_Task(void)
{
	uchar i;
	
	for(i=0; i<MAX_TASK_NUM; i++)
	{
		if(task[i].status==TASK_REMOVED)
		{
			return i;
		}
	}
	return 0xff;
}
//build a task
uchar Create_Task(void far (*initproc)(),void far (*entryproc)())
{
	uchar taskid;
	
	taskid = Find_Task();
	if(taskid==0xff) return 0xff;
	
	task[taskid].initproc  = initproc;
	task[taskid].entryproc = entryproc;
	task[taskid].taskid    = taskid;
	task[taskid].status    = TASK_CREATE;
	
	if(initproc!=NULL)initproc();
	return taskid;
}
//delete a task
void Remove_Task(uchar taskid)
{
	if(taskid >= MAX_TASK_NUM) return;
	
	task[taskid].initproc  = NULL;            
	task[taskid].entryproc = NULL;           
	task[taskid].taskid    = 0xff;              
	task[taskid].status    = TASK_REMOVED;
	
}

// send a task msg
uchar Send_Taskmsg(uchar taskid,uchar msgid,uchar *msgptr)
{
	TASK_STRUCT *task_ptr,*free_ptr;
	
	OS_ENTER_CRITICAL();
	if(Freetasklist==NULL)
	{
		OS_EXIT_CRITICAL();
		return TASK_FAIL;
	}
	free_ptr     = Freetasklist;
	Freetasklist = Freetasklist->next;
	
	free_ptr->msgid  = msgid;
	free_ptr->msgptr = msgptr;
	free_ptr->taskid = taskid;
#ifdef DEBUG_SYS
	u1tb             = msgid;
#endif
	free_ptr->next   = NULL;
	
	task_ptr = Usertasklist;
	if(task_ptr == NULL)
	{
		Usertasklist     = free_ptr;
	}
	else
	{
		while(task_ptr->next!=NULL)
		{
			task_ptr = task_ptr->next;
		}
		task_ptr->next  = free_ptr;
	}
	OS_EXIT_CRITICAL();
	
	return TASK_SUCCESS;
}

// delete a task
void Remove_Taskmsg(void)
{
	TASK_STRUCT *task_ptr;
	
	OS_ENTER_CRITICAL();
	task_ptr         = Usertasklist;
	if(task_ptr==NULL)
	{
		OS_EXIT_CRITICAL();
		return ;
	}
	Usertasklist     = Usertasklist->next;
	//u1tb =           task_ptr->msgid;
	//task_ptr->msgid  = 0;
	//task_ptr->msgptr = NULL;
	//task_ptr->taskid = 0xff;
	task_ptr->next   = Freetasklist;
	Freetasklist     = task_ptr;
	OS_EXIT_CRITICAL();
}


void Task_Schedule(void)
{
	TASK_STRUCT *task_ptr;
	
	while(1)
	{
		//OS_ENTER_CRITICAL();
		task_ptr         = Usertasklist;
		OS_EXIT_CRITICAL();
		//      if(Usertasklist!=NULL)
		//      {
		//         //u1tb = 0xff;
		//      }
		//      clr_watchdog();
		if(task_ptr!=NULL)
		{
			Current_Tskmsg = task_ptr;
			if(task[Current_Tskmsg->taskid].status==TASK_CREATE)
			{
				if(task[Current_Tskmsg->taskid].entryproc!=NULL)
				{
					task[Current_Tskmsg->taskid].entryproc();
					clr_watchdog();
				}
			}
			Remove_Taskmsg();
		}
		Timer_Entry();
	}
}  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -