hongkong 发表于 2013-8-15 14:27:14

看到的一种合作式内核,感觉挺好的,和大家分享!

本帖最后由 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:55

这么做有什么好处呢

hongkong 发表于 2013-8-16 10:05:20

james_138139 发表于 2013-8-16 09:51 static/image/common/back.gif
这么做有什么好处呢

简单的说就是可以精确的控制每个任务的执行周期,但是这个调度器是有缺陷的

261854681 发表于 2015-4-4 17:44:58

没有任何注释,是想显示你的技术强大么?

SmileBest 发表于 2015-4-8 14:02:26

简单任务调度器?
页: [1]
查看完整版本: 看到的一种合作式内核,感觉挺好的,和大家分享!