首页 > 代码库 > 51系列小型操作系统精髓 简单实现9 C语言版优化后发布(有图)

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


Program Size: data=http://www.mamicode.com/20.0 xdata=0 code=360
creating hex file from "WK1C_T"...
"WK1C_T" - 0 Error(s), 0 Warning(s).


/*使用keil4 可运行8个任务任务从rtos_wait()处切换,在定时时间到后从定时中断中切换回来。*/#include "STC12C5A.H"#define TIMER_RELOAD()  {TL0=0x00;TH0=0xC4;}//使能T/C	  初始10ms#define MAX_TASKS 2 //任务槽最大个数.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;void task_test(){	while(1)	{		a++;		rtos_wait(10);		 //执行完后,记录下一步地址,返回		a++;	}}void task_test2(){	while(1)	{		b++;		rtos_wait(10);		//执行完后,记录下一步地址,返回		b++;	}}void main(){	Timer0Init();	task_test();	task_test2();	while(1);}