51系列小型操作系统精髓 简单实现10 C语言版优化后发布(有图)

4个任务

 

/*
使用keil4 
可运行8个任务
任务从rtos_wait()处切换,在定时时间到后从定时中断中切换回来。
*/
#include "STC12C5A.H"

#define TIMER_RELOAD()  {TL0=0x00;TH0=0xC4;}//使能T/C	  初始10ms
#define MAX_TASKS 8 //任务槽最大个数.
unsigned char idata task_stack[MAX_TASKS][2];//任务堆栈.  PC指针为16位,需2个字节task_stack[][0]L  task_stack[][1]H。
unsigned char idata task_time[MAX_TASKS];	//定时时间
unsigned char task_id=0; //当前活动任务号
void Timer0Init()		//@18.432MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x00;		//设置定时初值
	TH0 =0xC4;		//设置定时初值 10ms
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时

	ET0=1;
	EA=1;
}
void rtos_wait(unsigned char time)
{
	static unsigned char i;
	task_time[task_id]=time;   	//保存当前任务时间
	task_stack[task_id][1] =*((unsigned char data* )(SP));	  	//保存当前断点 并把SP=SP-2,任务切换到下一任务;
	SP--;
	task_stack[task_id][0] =*((unsigned char data*)(SP));
	SP--;
	
	
//	if(++task_id == MAX_TASKS)		 //任务号
//		task_id = 0;
 
	//任务号设为最大,越过最大则回到0
	for(i=0;i<MAX_TASKS;i++)
	{
		if(task_time[i]==0)		//根据定时时间判断
		{
			task_id=i;
			break;
		}
	}
//	if(i==MAX_TASKS) //任务满 超出则回到0
//	{
//		task_id=0;
//	}
	
}
void rwcl()		 //任务时间是否到,任务时间到 实时切换回
{	
	//从把定时时间减1 ,找看哪个任务到	,任务时间到 实时切换回
	static unsigned char i;
	for(i=0;i<MAX_TASKS;i++)
	{
		if(task_time[i])
		{
			task_time[i]--;
			if(task_time[i]==0)		//多个定时时间同时到,任务越靠后,越优先执行。
			{
				task_id=i;			//当前任务号
				//保存的PC指针调出来
				SP++;
				(*((unsigned char data*)(SP)))=task_stack[i][0];
				SP++;
				(*((unsigned char data*)(SP)))=task_stack[i][1] ;
			}
		}
	}
}
void tm0_isr() interrupt 1 //using 1
{
  	//定时时间重载
	TIMER_RELOAD();

	rwcl();			//任务时间是否到,任务时间到 实时切换回
}




//****************************************************************示例
unsigned char a=0;
unsigned char b=0;
unsigned char c=0;
unsigned char d=0;

void task_test()
{
	while(1)
	{
		a++;
		rtos_wait(1);		 //执行完后,记录下一步地址,返回
		a++;
	}
}
void task_test2()
{
	while(1)
	{
		b++;
		rtos_wait(2);		//执行完后,记录下一步地址,返回
		b++;
	}
}
void task_test3()
{
	while(1)
	{
		c++;
		rtos_wait(3);		//执行完后,记录下一步地址,返回
		c++;
	}
}
void task_test4()
{
	while(1)
	{
		d++;
		rtos_wait(4);		//执行完后,记录下一步地址,返回
		d++;
	}
}
void main()
{
	Timer0Init();
	task_test();
	task_test2();
	task_test3();
	task_test4();
	while(1);
}


 

51系列小型操作系统精髓 简单实现10 C语言版优化后发布(有图),古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。