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

📄 os_core.c

📁 ckos 移植到ARMTDMI7核的ADuC7026上
💻 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];//定义任务结构数组

#ifdef ckOS_V_2_0

tWord OSRdyTable;
					//   0    1    2    3
tWord const PrioMap[] = {0x01,0x02,0x04,0x08,
					//   4    5    6    7
						0x10,0x20,0x40,0x100,
					//   8    9     10    11
						0x200,0x400,0x800,0x1000,
					//   12    13
						0x2000,0x4000};
					//     1     2
tWord const PrioGrpMap[] = {0x80,0x8000};

#endif

/*--------------------------------------------------------------------------------*-
 *函数原型: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。
-*--------------------------------------------------------------------------------*/
//添加任务
tWord OS_Add_Task(void (*pTask)(void),const tByte prio,
								const tWord tDelay,const tWord tPeriod)
{
	static tWord TaskCnt;
	if(TaskCnt < OS_MAX_TASK)//判断任务ID是否超出最大任务数	
	{

		OS_TCB[TaskCnt].aTask   = pTask;//存放任务首地址

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

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

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

		OS_TCB[TaskCnt].RunMe   = 0;

		TaskCnt++;

#ifdef ckOS_V_2_0

		OSRdyTable              |= PrioMap[prio]|PrioGrpMap[prio/7];
#endif

		return prio;//任务添加成功返回任务优先级
	}
	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 Prio)
{
	tWord TaskIndex;

	for(TaskIndex=0;TaskIndex<OS_MAX_TASK;TaskIndex++)
	{
		if(OS_TCB[TaskIndex].TaskID==Prio)
		{
			memset(&OS_TCB[TaskIndex],0,sizeof(sTask));//将任务数据块清零,删除内存中的任务

		#ifdef ckOS_V_2_0

			OSRdyTable &= ~PrioMap[Prio];         //delete the task from the Rdytbl;

		#endif

		}
	}
}

/*--------------------------------------------------------------------------------*-
 *函数原型: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 + -