单片机程序架构(一)时间片轮询

时间:2021-04-25 19:26:19

时间片轮询方法


方法一:

void TimerX_handler(void)
{
    ms_cnt++;
}
初始化设置该定时器x毫秒中断一次,即ms_cnt作为一个毫秒计时器。

main(void)
{
    while(1)
    {
         if(ms_cnt%x==0)
         {
             task1();
         }
         if(ms_cnt%y==0)
         {
             task2();
         }
    }
}
主循环中,每隔x毫秒执行一次task1,每隔y毫秒执行一次task2。




方法二:


typedef _TASK_STRUCT
{
<span style="white-space:pre">	</span>u32 time_cnt;
<span style="white-space:pre">	</span>u8 run_flag;
}TASK;


TASK task1 = {x,0};
TASK task2 = {y,0};
定义任务结构体,每隔x时间置位task1执行标志位task1.run_flag,在main loop中扫描并执行;同理task2。

void TimerX_handler(void)
{
	if(task1.run_flag == 0)
		{
			task1.time_cnt--;
		}
	if(task1.time_cnt == 0)
		{
			task1.run_flag = 1;
			task1.time_cnt = x;
		}

	if(task2.run_flag == 0)
		{
			task2.time_cnt--;
		}
	if(task2.time_cnt == 0)
		{
			task2.run_flag = 1;
			task2.time_cnt = y;
		}	
}

void main(void)
{
	while(1)
		{
			if(task1.run_flag == 1)
				{
					task1();
					task1.run_flag = 0;
				}
		
			if(task2.run_flag == 1)
				{
					task2();
					task2.run_flag = 0;
				}
		}
}


(附:待完善)