时间片轮转法。
#include”reg52.h” sbit Led1=P0^0; sbit Led2=P0^1; sbit Led3=P0^2; void Led1_Display() { Led1=~Led1; } void Led2_Display() { Led2=~Led2; } void Led3_Display() { Led3=~Led3; } struct TASK { unsigned int Run; //运行标记 0-不运行 1-运行 unsigned int Timer; //计时器 unsigned int SetTime; //运行时间间隔 void (*TaskHook)(); //要运行函数指针 }; static struct TASK Tasks[]= { {0,1000,1000,Led1_Display}, {0,2000,2000,Led2_Display}, {0,3000,3000,Led3_Display} }; void TasksCount() { unsigned int i; for(i=0;i<3;i++) { if(Tasks[i].Timer) { Tasks[i].Timer–; if(Tasks[i].Timer==0) { Tasks[i].Timer=Tasks[i].SetTime; Tasks[i].Run=1; } } } } void TasksProcess() { unsigned int i; for(i=0;i<3;i++) { if(Tasks[i].Run==1) { Tasks[i].TaskHook(); Tasks[i].Run=0; } } } void main() { TMOD=0x01; //定时器工作模式1 TH0=(65536-1000)/256; //定时器初始值晶振12MHz TL0=(65536-1000)%256; //定时1ms EA=1; //开总中断 ET0=1; //定时中断开 TR0=1; //定时器开 while(1) { TasksProcess(); } } void T0_time() interrupt 1 { TH0=(65536-1000)/256; //定时器初始值,决定波特率,晶振12MHz TL0=(65536-1000)%256; //定时1ms TasksCount(); } |
上面就是一个操作系统的雏形了,对我们理解操作系统有很大帮助。