⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 网上收集的嵌入式操作系统后在51上写的一个简单的操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
               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 + -