rtx51tiny操作系统随记

    博主昨天才注册,特此写上一篇介绍rtx51tiny操作系统的基本知识,希望广大的电子爱好者指正!

      一直以来听人家说,在51系列单片机上移植一个操作系统,可以使复杂的任务简单化!于是这几天就恶补了下rtx51tiny(对于rtx51full就不做研究,毕竟51内存太小)的知识。

      特点:它是一个实时多任务操作系统。何谓同时实施多任务操作,其实在该系统中,它会为每个任务分配一个时间片,某个任务就在特定的时间片内执行,切换到另外的任务也需要在规定的时间片内完成,由于时间片是很短的,所以看起来就像是多任务同时进行。

    下面我们就可以从一个简单的程序来分析:

                                                         #include<rtx51tny.h>             

                                                         int counter0;

                                                         void jobo(void) _task_ 0

                                                                 {

                                                                  os_create_task(1);

                                                                  while(1)

                                                                          counter0++;

                                                                    }  

     在上面的程序中,os_create_task()这个函数就属于rtx51tiny系统的库函数,它是用来启动任务的,在该系统的有很多类似于这样的函数,下面来简单的介绍一下:

     os_create_task();           //任务启动函数

     os_delete_task();           //任务终止函数

     os_wait (K_TM0,n);         //延时函数,n表示延时的时钟节拍

     os_send_signal(n);         //发送信号函数,可以用于启动其他的任务

     上面几个函数就是我们常用库函数,通过上面的几个函数我们可以完成任务的启动,终止与下个一任务的启动。

      使用该系统需要注意的地方:

                                           1.默认情况下,系统的任务都是从0开始执行,没有所谓的优先级,但是我们可以通过关键字来设置优先级,如:job1(void) _task_ 1 _priority_ 1,这样可以设置任务1为1的优先级,比0高,所以先执行,在该系统中分0-3这4个优先级;

                                           2.软件要求:我们平常用的keil c51就符合,它的编译环境里集成了我们需要的软件;

                                           3.无需再在程序编写主函数,在操作系统中已经存在main()函数了;

                                           4.定时器0已经被使用,故不允许在程序中禁止定时器0中断;

                                           5.rtx51tiny是并行地执行多任务操作,这些任务都是无穷循环。

 

 

 

    下面就简单的贴一段交通信号灯程序:

#include<rtx51tny.h>
#include<reg52.h>


#define init 0      //任务0为初始化
#define state 1     //任务1进行按键检测
#define sn_normal 2 //正常模式下南北向灯的状况
#define ew_normal 3 //正常情况下东西向灯的状况

#define blinking 4  //夜间模式
#define throu 5     //意外情况



void init()_task_ init
       {
          //关闭所有的灯
          os_create_task (state);  //启动任务一
          os_delete_task (init);   //关闭任务0
        }

void state()_task_ state   //进行按键检测,得出交通状况
      {
          while(!button1)
                {
                   os_create_task (sn_normal);
                   os_create_task (ew_normal);
                   os_delete_task (blinking);
                   os_delete_task (throu);
                  }
           while(!button2)
                {
                   os_create_task (blinking);
                   os_delete_task (sn_normal);
                   os_delete_task (ew_normal);
                   os_delete_task (throu);
                    }
           while(!button3)
                {
                   os_create_task(throu);
                   os_delete_task(sn_normal);
                   os_delete_task(ew_normal);
                    os_delete_task(blinking);
                    }
      }

void sn()_task_sn_normal   //南北方向交通灯控制
{
  while(1)
  {
   sn_blue=1;sn_yellow=0;sn_red=0; //先是绿灯亮,其余灯灭
   DelayX10ms(500);    //延时5s,查看
  
   for(i=0;i<5;i++)    //黄灯闪烁5次
      {
       sn_yellow=1;sn_red=0;sn_blue=0;
       DelayX10ms(10); //亮1s
      
       sn_yellow=0;sn_red=0;sn_blue=0;
       DelayX10ms(10); //灭1s     
       }

   if(i>=5)
      {
       i=0;
       }

    sn_blue=0;sn_yellow=0;sn_red=1;//红灯亮
    DelayX10ms(1000); //延时10秒 
   } 
}

void ew()_task_ew_normal   //东西方向交通灯控制
{
  while(1)
  {
   ew_blue=1;ew_yellow=0;ew_red=0; //先是绿灯亮,其余灯灭
   DelayX10ms(500);    //延时5s,查看
  
   for(i=0;i<5;i++)    //黄灯闪烁5次
      {
       ew_yellow=1;ew_red=0;ew_blue=0;
       DelayX10ms(10); //亮1s
      
       ew_yellow=0;ew_red=0;ew_blue=0;
       DelayX10ms(10); //灭1s     
       }

   if(i>=5)
      {
       i=0;
       }

    ew_blue=0;ew_yellow=0;ew_red=1;//红灯亮
    DelayX10ms(1000); //延时10秒 
   } 

}

void bl()_task_blinking   //夜间黄灯无限的闪烁
{
  while(1)
       {
         sn_yellow=1;sn_blue=0;sn_red=0;
         ew_yellow=1;ew_blue=0;ew_red=0;
         DelayX10ms(10);  //黄灯闪一秒

         sn_yellow=0;sn_blue=0;sn_red=0;
         ew_yellow=0;ew_blue=0;ew_red=0;
         DelayX10ms(10);  //黄灯灭一秒
       }
}

void th()_task_throu  //意外情况
{
  while(1)
       {
        sn_red=1;sn_yellow=0;sn_blue=0;
        ew_red=1;ew_yellow=0;ew_blue=0;
        }
}
   

posted @ 2013-07-25 09:58  智者顺势而为  阅读(342)  评论(0)    收藏  举报