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