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

📄 os_core.c

📁 一个用在51单片机上的调度器 后续版本将出现可占先式调度
💻 C
字号:
/*--------------------------------------------------------------------------------*-
 *						           ck/OS
 *						        调度器内核文件
 *						-------------------------------	
 *
 *文件名称:OS_core.c
 *
 *作    者:冯耿超
 *版    本:V1.1.2					
 *创建日期:2008年01月31日
 *
 *文件描述:OS_core.c文件主要包括三个内核函数:OS_Add_Task()、OS_Assign_Task()、
 *			OS_Delete_Tasks()、分别为添加任务,任务分配,删除任务。本文件与MCU
 *			的硬件无关。
-*--------------------------------------------------------------------------------*/
#include "..\INC\OS_cfg.h"
#include "..\string.h"
#include "..\INC\OS_core.h"

//static void *SetMem(void *cPtr,tByte const Contant,int sLen);

sTask OS_TCB[OS_MAX_TASK];//定义任务结构数组
/*--------------------------------------------------------------------------------*-
 *函数原型:OS_Add_Task(void (*pTask)(void),tByte const ID,
 *								tWord const tDelay, tPeriod)
 *输入参数:*pTask--->任务的入口地址
 *			ID    --->任务控制块地址,在以后版本中会做为任务的优先级
 *			tDelay--->任务延迟时间
 *			tPeriod-->任务周期
 *输出参数:无
 *返 回 值:ID--->任务添加成功放回任务ID
 *			Error->任务添加不成功返回错误信号
 *
 *描    述:本程序用于向内核添加用户任务,需要主意任务ID不得大于最大系统任务量
 *			即ID必须小于OS_MAX_TASK。函数调用库函数memset(),来初始化任务控制
 *			块OS_TCB。
-*--------------------------------------------------------------------------------*/
//添加任务
tByte OS_Add_Task(void (code *pTask)(void),const tByte ID,
								const tWord tDelay,const tWord tPeriod)
{
	if(ID < OS_MAX_TASK)//判断任务ID是否超出最大任务数	
	{
	//	memset( &OS_TCB[ID],0,sizeof(sTask));//清零任务指定区域
		OS_TCB[ID].aTask   = pTask;//存放任务首地址

		OS_TCB[ID].TaskID  = ID;//任务位置,任务优先级

		OS_TCB[ID].Period  = tPeriod;//任务周期

		OS_TCB[ID].Delay   = tDelay;//任务有效延迟时间初值

		OS_TCB[ID].RunMe   = 0;

		return ID;//任务添加成功返回任务优先级
	}
	else
	{
		return Error;//任务添加出错
	}	
}

/*--------------------------------------------------------------------------------*-
 *函数原型:OS_Assign_Task(void)
 *
 *输入参数:无
 *
 *输出参数:无
 *
 *返 回 值:无
 *
 *描    述:本程序为内核添规划分配任务,必须放在超级循环体中,及必须放在while(1){}
 *			语句中。当任务标志位RUNME有效时执行任务。
-*--------------------------------------------------------------------------------*/
//系统规划分配任务
void OS_Assign_Task(void)
{
	tByte Index;
	for(Index = 0;Index < OS_MAX_TASK;Index++)
	{
		if(OS_TCB[Index].RunMe > 0)//运行标志是否有效
		{
			(*OS_TCB[Index].aTask)();//运行任务

			OS_TCB[Index].RunMe -= 1;//任务复位
		}

		if(OS_TCB[Index].Period == 0)
		{
			OS_Delete_Tasks(Index);//周期为0时删除任务,任务只被运行一次	
		}
	}		
}

/*--------------------------------------------------------------------------------*-
 *函数原型:OS_Delete_Tasks(tByte tID)
 *
 *输入参数:tID--->需要被删除的任务ID
 *
 *输出参数:无
 *
 *返 回 值:无
 *
 *描    述:删除任务,将原来任务数据结构内存块清零。
-*--------------------------------------------------------------------------------*/
//删除任务,将原来任务数据结构内存块清零
void OS_Delete_Tasks(const tByte tID)
{
	memset(&OS_TCB[tID],0,sizeof(sTask));//将任务数据块清零,删除内存中的任务
}

/*--------------------------------------------------------------------------------*-
 *函数原型:OS_Init(void)
 *
 *输入参数:无
 *
 *输出参数:无
 *
 *返 回 值:无
 *
 *描    述:初始化系统程序,清理系统所有的任务控制块。
-*--------------------------------------------------------------------------------*/
//初始化系统程序
void OS_Init(void)
{
	memset(&OS_TCB[0],0,(sizeof(sTask)*OS_MAX_TASK));//清零所有任务块

}

/*--------------------------------------------------------------------------------*-
 *函数原型:*SetMem(void *cPtr,char const Contant,int sLen)
 *
 *输入参数:*cPtr--->需要设置的内存区首地址
 *			Contant->需要设置的内容
 *			sLen---->需要设置的内存区长度
 *
 *输出参数:无
 *
 *返 回 值:无
 *
 *描    述:设置内存区域,首地址为cPtr,长度sLen,内容Contant
-*--------------------------------------------------------------------------------*/
/*
//设置内存区域
void *SetMem(void *cPtr,char const Contant,int sLen)
{
	tByte *addPtr;
	addPtr = (tByte *)cPtr;
	if(cPtr != NULL)
	{
		while(sLen > 0)
		{
			*addPtr++ = Contant;
			--sLen;
		}
		return cPtr;//返回首地址
	}
	else
	{
		return NULL;
	}
}*/

/*--------------------------------------------------------------------------------*-
-*-------------------------------End of file--------------------------------------*-
-*--------------------------------------------------------------------------------*/

⌨️ 快捷键说明

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