0
点赞
收藏
分享

微信扫一扫

思想闭环框架

你带来了我的快乐 2022-01-06 阅读 54

第一种写法:状态机写法

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;
		}
	}
}

请添加图片描述

举报

相关推荐

0 条评论