看到的一种合作式内核,感觉挺好的,和大家分享!
本帖最后由 hongkong 于 2013-8-15 14:32 编辑typedef struct {
void (* pTask)(void);
uint Delay;
uint Period;
uchar RunMe;
}sTask;
#define OS_MAX_TASKS (14)
#define ERROR_OS_MANY_TASKS 1
#define ERROR_OS_DELETE_TASK 2
#define RETURN_ERROR 1
#define RETURN_OK 0
sTask OS_tasks_G;
uchar Error_code_G=0;
uchar old_Error_code_G=0;
/*********************************************************/
void OS_Dispatch_Tasks(void)
{
uchar Index;
for (Index=0;Index<OS_MAX_TASKS;Index++)
{
if(OS_tasks_G.RunMe>0)
{
(*OS_tasks_G.pTask)();
OS_tasks_G.RunMe-=1;
if(OS_tasks_G.Period==0)
{
OS_Delete_Task(Index);
}
}
}
}
unsigned char OS_ADD_Task(void (*pFunction)(),const uint DELAY,const uint PERIOD)
{
uchar Index=0;
while ((OS_tasks_G.pTask!=0)&&(Index<OS_MAX_TASKS))
{
Index++;
}
if(Index==OS_MAX_TASKS)
{
Error_code_G=ERROR_OS_MANY_TASKS;
return OS_MAX_TASKS;
}
OS_tasks_G.pTask=pFunction;
OS_tasks_G.Delay=DELAY;
OS_tasks_G.Period=PERIOD;
OS_tasks_G.RunMe=0;
return Index;
}
uchar OS_Delete_Task(const uchar TASK_INDEX)
{
uchar Return_code;
if(OS_tasks_G.pTask==0)
{
Error_code_G=ERROR_OS_DELETE_TASK;
Return_code=RETURN_ERROR;
}
else
{
Return_code=RETURN_OK;
}
OS_tasks_G.pTask=0x0000;
OS_tasks_G.Delay=0;
OS_tasks_G.Period=0;
OS_tasks_G.RunMe=0;
return Return_code;
}
void Sch(void)
{
uchar Index;
for(Index=0;Index<OS_MAX_TASKS;Index++)
{
if(OS_tasks_G.pTask)
{
if(OS_tasks_G.Delay==0)
{
OS_tasks_G.RunMe+=1;
if(OS_tasks_G.Period)
{
OS_tasks_G.Delay=OS_tasks_G.Period;
}
}
else
{
OS_tasks_G.Delay-=1;
}
}
}
} 这么做有什么好处呢 james_138139 发表于 2013-8-16 09:51 static/image/common/back.gif
这么做有什么好处呢
简单的说就是可以精确的控制每个任务的执行周期,但是这个调度器是有缺陷的 没有任何注释,是想显示你的技术强大么? 简单任务调度器?
页:
[1]