第一种写法:状态机写法
typedef enum
{
ThreadReady = 0x0,
ThreadRunning = 0x1,
ThreadSuspended = 0x2,
ThreadError = 0x3,
}ThreadState_e;
typedef int (*pthread) (void);
typedef struct thread_def {
char *name;
pthread pthread;
ThreadState_e ThreadState;
unsigned int Time_thread_gap;
unsigned int Time_thread_begin;
unsigned int Time_thread_end;
unsigned int current_Time;
unsigned int error;
} ThreadDef_t;
void Task_scheduler(ThreadDef_t *task)
{
switch(task->ThreadState)
{
case ThreadReady:{
task->Time_thread_begin = getSysTick();
task->Time_thread_end = task->Time_thread_begin + task->Time_thread_gap;
task->ThreadState = ThreadRunning;
break;
}
case ThreadRunning:{
int ret = task->pthread();
if(ret == 0){
task->ThreadState = ThreadSuspended;
}
break;
}
case ThreadSuspended:{
task->current_Time = getSysTick();
if(task->current_Time >= ( task->Time_thread_end - task->error ) && task->current_Time <= ( task->Time_thread_end+task->error )){
task->ThreadState = ThreadReady;
}
else if( task->current_Time > ( task->Time_thread_end+task->error ) ){
task->ThreadState = ThreadError;
}
break;
}
case ThreadError:{
break;
}
default:break;
}
}
第二种写法:升级简易写法
ThreadDef_t led ={
.name = "led",
.pthread = mytask,
.Time_thread_gap = 100000,
.Time_thread_begin = 0,
.pending = 0,
.running = 0,
};
void Task_scheduler(ThreadDef_t *task)
{
if( getSysTick() >= ( task->Time_thread_begin + task->Time_thread_gap) ){
task->Time_thread_begin = getSysTick();
task->pending += 1;
}
if(task->running == 0)
{
if( task->pending >= 1){
task->pending -= 1;
task->running = 1;
}
}
else if( task->running == 1 )
{
if( task->pthread() == 0){
task->running = 0;
}
}
}