📄 main.c
字号:
prints("Hour:",0);
hour--;
if(hour>24)hour=23;
send_a_byte('0'+hour/10);
send_a_byte('0'+hour%10);
prints("",1);
give_up_printer();
break;
case 'S': //收到大写的S,秒值增加1
get_printer();
prints("Second:",0);
second++;
if(second>=60)second-=60;
send_a_byte('0'+second/10);
send_a_byte('0'+second%10);
prints("",1);
give_up_printer();
break;
case 'M': //收到大写的M,分值增加1
get_printer();
prints("Minute:",0);
minute++;
if(minute>=60)minute-=60;
send_a_byte('0'+minute/10);
send_a_byte('0'+minute%10);
prints("",1);
give_up_printer();
break;
case 'H': //收到大写的H,小时值增加1
get_printer();
prints("Hour:",0);
hour++;
if(hour>=24)hour-=24;
send_a_byte('0'+hour/10);
send_a_byte('0'+hour%10);
prints("",1);
give_up_printer();
break;
case '+': //收到"+",加快转动速度
case '=': //因为主键盘上"="跟"+"在同一个键
if(refresh_time>1)refresh_time/=2; //缩短刷新时间
get_printer();
prints("refresh_time=",0);
send_a_byte('0'+refresh_time/10);
send_a_byte('0'+refresh_time%10);
prints("",1);
give_up_printer();
break;
case '-': //收到"-",减慢转动速度
if(refresh_time<30)refresh_time*=2; //增加刷新时间
get_printer();
prints("",1);
prints("refresh_time=",0);
send_a_byte('0'+refresh_time/10);
send_a_byte('0'+refresh_time%10);
prints("",1);
give_up_printer();
break;
case 'k':
case 'K': //要删除一个任务时,先按下K键。然后再输入要删除的任务号
//注意:这个任务号是在创建任务时由OS自动分配的,请在创建任务时记下
prints("",1); //换行
prints("",1);
prints("Ready for kill.....",1);
prints("Please input number of task:",1); //显示一些提示信息
prints("",1);
buf=get_a_byte(); //从串口接收一字节数据
if((buf>='0')&&(buf<'9')) //如果在数字范围内
{
temp=OS_Task_Kill(buf-'0'); //根据接收到数据删除一个任务
if((temp&0xff00)==OS_Successful) //如果成功删除
{
get_printer(); //则显示信息
prints("",1);
prints("",1);
prints("Task ",0);
send_a_byte((temp&0xff)+'0'); //显示被删除的任务ID
prints(" has been killed!",1);
prints("Task kill successful!",1);
prints("",1);
give_up_printer();
}
else //如果删除不成功
{
get_printer();
prints("",1);
prints("",1);
if((temp&0xff00)==OS_Task_Not_Exist) //如果是因为任务不存在
{
prints("Task not exist!",1); //返回信息
}
if((temp&0xff00)==OS_Task_Cannot_Be_Killed) //如果是因为任务不允许删除
{
prints("Task cannot be killed!",1); //返回信息
}
prints("Task kill failed!",1); //返回删除失败的信息
prints("",1);
give_up_printer();
}
}
else //如果没有输入合适的数字
{
get_printer();
prints("",1);
prints("",1);
prints("Input error!",1); //返回错误信息
prints("",1);
give_up_printer();
}
break;
case 'c':
case 'C':
//创建任务时,先按下C键
//输入要创建的任务号。注意:这个号相当于函数名
//任务创建时,其分配到的ID,跟这个号并不一定一致,
//而是由OS自动分配的一个ID号
prints("",1);
prints("",1);
prints("Ready for create.....",1);
prints("Please input number of task:",1);
prints("",1);
buf=get_a_byte();
if((buf>='1')&&(buf<='4')) //本演示程序只能创建1-4号任务
{
if(buf=='1')
{
temp=OS_Task_Create(3,(unsigned int)(&task_1),0);
//优先级为3,任务为task_1,无消息
}
if(buf=='2')
{
temp=OS_Task_Create(2,(unsigned int)(&task_2),0);
//优先级为2,任务为task_2,无消息
}
if(buf=='3')
{
temp=OS_Task_Create(1,(unsigned int)(&task_3),0);
//优先级为1,任务为task_3,无消息
}
if(buf=='4')
{
temp=OS_Task_Create(0,(unsigned int)(&task_4),(unsigned char)&msg);
//优先级为0(即最高),任务为task_4,消息指针指向msg
}
if((temp&0xFF00)==OS_Successful) //如果创建成功
{
get_printer();
prints("",1);
prints("",1);
prints("Task ",0);
send_a_byte((temp&0xff)+'0');
prints(" has been created!",1);
prints("Task create successful!",1); //显示信息
prints("",1);
give_up_printer();
}
else //如果创建失败
{
get_printer();
prints("",1);
prints("",1);
if((temp&0xff00)==OS_Resource_Lack) //资源不足,无法创建
{
prints("Resource lack!",1); //返回错误信息
}
prints("Task create failed!",1);
prints("",1);
give_up_printer();
}
}
else //如果输入数据不合适
{
get_printer();
prints("",1);
prints("",1);
prints("Input error!",1);
prints("",1);
give_up_printer();
}
break;
default: break;
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char msg; //保存消息用的一个变量,也可以使用一个结构体来处理更多的信息
///////////////////////////////////// 任务4 //////////////////////////////////////////////////
void task_4(void)
{
static unsigned char temp; //使用static申明局部变量,避免变量被分配到相同的地址
OS_Enter_Critical();
Msg_1_Receiver=OS_Current_ID; //表示本任务需要接收消息1
OS_Exit_Critical();
get_printer();
prints("CPU used ratio: 99%",1); //显示信息
give_up_printer();
while(1)
{
LED3=~LED3; //LED3闪烁
if(OS_Wait_Msg(120)) //等待消息,超时时间设置为1.2秒
{
temp=*(unsigned char idata*)(OS_pcb[OS_Current_ID].MSG); //将消息取出
if(temp>=100)temp=99; //为了简化程序,限定最大显示99
}
else //如果任务等待超时,即等了1.2秒还没收到统计任务发回的CPU使用率
{
temp=99; //则CPU太繁忙,使用率强制设置为99%
}
get_printer();
prints("CPU used ratio: ",0);
send_a_byte('0'+temp/10); //显示高位
send_a_byte('0'+temp%10); //显示低位
send_a_byte('%'); //显示%
prints("",1);
give_up_printer();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////主函数//////////////////////////////////////////////////////
void main(void)
{
EA=0; //关中
ET2=1; //定时器2开中断
T2CON=0x00; //定时器自动重装模式
T2MOD=0x00; //如果提示这里编译通不过,可将本行删除;或自己将定义添上
//因为keil自带的at89x52.h中没有T2MOD的定义
RCAP2H=0xB1;
RCAP2L=0xE0; //定时时间为10ms
UART_init(); //初始化串口为9600波特率
send_a_byte(0x0c);
send_a_byte(0x0c); //如果使用wiindows的超级终端,发这两个可以可靠清屏
OS_Init(); //OS初始化
//参数意义 优先级 任务入口地址 消息指针
OS_Task_Create(255,(unsigned int)(&task_idle),0); //任务0初始化
OS_Task_Create(3,(unsigned int)(&task_1),0); //任务1初始化
OS_Task_Create(2,(unsigned int)(&task_2),0); //任务2初始化
OS_Task_Create(1,(unsigned int)(&task_3),0); //任务3初始化
OS_Task_Create(0,(unsigned int)(&task_4),(unsigned char)&msg); //任务4初始化
OS_Start(); //OS开始调度
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -