中文代码内核文件---时间管理

//版权声明:
//  本代码为开源代码,作者拥有代码版权,但你可以在任何非商业用途程序中引用,但请标注出处,你
// 也可以对代码进行更改。作者对代码中所包括的错误以及所造成的一切后果将不负任何责任。如果你发
// 现代码中有任何问题或错误,请与我联系。
//  联系方法:QQ 2367051920,Email:nvwa-xt@qq.com
//                                                     -----作者:朱晓辉 2013年11月11日
//=======================================
//函名    :       T0定时器设置
//传入参数:       无
//返回值  :       无
//=======================================
//-----------开始-----------------

无返回值    定时器设置(无参数)
{
  开定时器位=0;                             //TR0=1
  高八位的时间初值=高_10s;        //TH0=(65536-45872)/256;
  低八位的时间初值=低_10s;         //TL0=(65536-45872)%256;
  开定时器位=1;                          //TR0=1
}
无返回值    定时器启动 (无参数)
{
    定时器工作方式|= 0x01;  //TMOD
    定时器设置();
    允许T0中断;          //ET0=1
}
//=======================================
//函名    :       进入中断
//传入参数:       无
//返回值  :       无
//=======================================
无返回值  进入中断(无参数)
{
  中断=禁止中断;
  如果(系统管理块.中断嵌套<8)
    {系统管理块.中断嵌套 ++ ;}
  中断=允许中断;
}
//=======================================
//函名    :       退出中断
//传入参数:       无
//返回值  :       无
//=======================================
无返回值  退出中断(无参数)
{
  中断=禁止中断;
  如果(系统管理块.中断嵌套>0)
    {系统管理块.中断嵌套 -- ;}
  中断=允许中断;
}
//==========================================
//函名    :       查询延时任务
//传入参数:       无
//返回值  :       无
//==========================================
无返回值  任务延时查询(无参数)
{
  整数8   i;
     
  循环(i=1;i<任务总数;i++)
   {
     如果((系统任务块[i].任务延时 > 0)&&( 系统任务块[i].任务状态 != 停止))  
       {
          系统任务块[i].任务延时 -=1;
          如果(系统任务块[i].任务延时 ==0)
           {
              如果(系统任务块[i].任务状态 ==延时)
                {
#如果 实时任务==0                
                 运行表登记( i );                     //运行登记;
#如果结束
#如果 实时任务==1
          如果(系统任务块[i].任务类型==实时任务)
          {就绪表登记(i);}                           //就绪表登记;
          否则
          {运行表登记(i);}                           //运行登记;   
#如果结束          
                 }                                
             }
         } 
     }
}
//==========================================
//函名    :       T0中断服务 
//传入参数:       无
//返回值  :       无
//==========================================
无返回值   定时器0(无参数) 中断  1           // 断点数据自动进栈
{                          
#如果   任务调度_形式 == 1
整数8   地址;
整数8   任务栈位置;
整数8   公共栈位置;
整数8   i;
#如果结束 
  进入中断();                             // 进入中断计数
  中断=禁止中断;
  定时器设置 ();                                 // T0数据重装,
  任务延时查询();                                //检查任务延时器 ,
#如果 实时任务==0
  如果((系统管理块.时间片 > 0)&&(系统管理块.调度锁==0))
   {  系统管理块.时间片 --;                                     //时间片减 1 ,
     如果(系统管理块.时间片 == 0)
      {
        如果(系统管理块.运行号 != 0)      
         {运行表登记(系统管理块.运行号);}                     //时间片用完,重新在运行队列中登记,
       }
    }
#如果结束
#如果 实时任务==1
 如果((运行表!=0)&&(系统管理块.调度锁==0))
   { 系统管理块.时间片=0;
    如果(系统任务块[系统管理块.运行号].任务类型==普通任务)
      {优先运行表登记(系统管理块.运行号);}
   }
   否则
  {
       如果((系统管理块.时间片 > 0)&&(系统管理块.调度锁==0))
     {  系统管理块.时间片 --;                                        //时间片减 1 ,
     如果(系统管理块.时间片 == 0)
        {
        如果(系统管理块.运行号 != 0)      
            {运行表登记(系统管理块.运行号);}                          //时间片用完,重新在运行队列中登记,
        }
     }
   }
#如果结束
  退出中断();  // 退出中断计数
  中断=禁止中断;
  如果((系统管理块.运行号==0)&&
     (系统管理块.时间片!=0))                                   
   {  系统管理块.时间片=0;  }           
  如果((系统管理块.中断嵌套  ==0)  &&
     (系统管理块.调度锁 ==0)  &&
     (系统管理块.时间片==0)  &&
     (系统管理块.系统状态  !=服务模式))
    {
       如果(系统管理块.新运行号==0)
           { 如果( 优先运行==有优先任务)
                  { 系统管理块.新运行号=优先_任务号();}       
             否则
                  {  系统管理块.新运行号=任务号(); }          
            }
          系统管理块.时间片 = 时间片_长度;  
#如果   任务调度_形式 == 0         
        如果(系统管理块.运行号!=系统管理块.新运行号)
            {
             系统任务块[系统管理块.运行号].任务栈顶=堆栈指针;                        //保存栈顶地址
             系统管理块.运行号=系统管理块.新运行号;                            //切换任务
             系统管理块.新运行号=0;
             堆栈指针=系统任务块[系统管理块.运行号].任务栈顶;                         //取得栈顶地址
             }       
#如果结束
#如果   任务调度_形式 == 1
        如果(系统管理块.运行号!=系统管理块.新运行号)
         {
           地址=运行栈;
           系统任务块[系统管理块.运行号].任务栈顶=堆栈指针 - 地址;
           任务栈位置=0;
           公共栈位置=0;          
           循环(i=系统任务块[系统管理块.运行号].任务栈顶; i>0 ; i--)
            {
              公共栈位置 ++;
              任务栈位置 ++;
              任务栈[系统管理块.运行号][任务栈位置] = 运行栈[公共栈位置];
             }
           系统管理块.运行号=系统管理块.新运行号;                               //切换任务
           系统管理块.新运行号=0;
           任务栈位置=0;
           公共栈位置=0;          
           循环(i=系统任务块[系统管理块.运行号].任务栈顶; i>0 ; i--)
            {
              公共栈位置 ++;
              任务栈位置 ++;
              运行栈[ 公共栈位置 ] =  任务栈[系统管理块.运行号][任务栈位置] ;
             }
           堆栈指针=运行栈 + 系统任务块[系统管理块.运行号].任务栈顶 ;
          }
#如果结束    
      }
  中断=允许中断;
}                                                                                     // 断点数据自动出栈
//=======================================
//函名    :       延时节拍数
//传入参数:       1~65535
//返回值  :       无
//=======================================
无返回值  延时数(整数16  延时总数)
{
  中断=禁止中断;
  如果(延时总数 >0)                  //YSZS不可为0,
   {
#如果 实时任务==1
     如果(系统任务块[系统管理块.运行号].任务类型==实时任务)
         {就绪表清除(系统管理块.运行号);}
#如果结束        
  如果(系统管理块.时间片>0)                    //清0时间片,
         { 系统管理块.时间片=0;}
     系统任务块[系统管理块.运行号].任务状态 = 延时;       //状态=延时,
     系统任务块[系统管理块.运行号].任务延时 = 延时总数;       //延时器赋予数值,
     中断=允许中断;
     任务调度();     //任务调度,
   }
  中断=允许中断; 
}
//=======================================
//函名    :       延时时间数100ms
//传入参数:       1~255
//返回值  :       无
//=======================================
无返回值  任务延时100ms(整数8  延时数)
{
  整数16  延时总数;
  如果(0< 延时数 <255)
   {
     延时总数=((整数16)延时数*100)/时间粒度;
     延时数( 延时总数 );
    }
}
//=======================================
//函名    :       延时时间数1 s
//传入参数:       1~600
//返回值  :       无
//=======================================
无返回值  任务延时1s(整数8  延时数)
{
  整数16  延时总数1;
  整数16  延时总数2;
  整数8   循环数;
如果(0< 延时数 <255)
  {
    延时总数1=((整数16)延时数*1000)/时间粒度;
    循环数=延时总数1/1000;
    延时总数2=延时总数1%1000;
    当(循环数)
     {
       延时数(1000);
       循环数--;
      }
   延时数(延时总数2);
  }
}
//=======================================
//函名    :       恢复正在延时时的任务
//传入参数:       任务号
//返回值  :       无
//=======================================
无返回值  恢复延时任务( 整数8  任务号 )
{
  中断=禁止中断;
 
  如果( 0<任务号<任务总数 )
   {
     如果( 系统任务块[任务号].任务状态==延时 )
       {
        系统任务块[任务号].任务状态=运行;
        系统任务块[任务号].任务延时= 0;
     如果(系统任务块[任务号].任务类型==普通任务)
           {优先运行表登记(任务号);}
#如果 实时任务==1
    如果(系统任务块[任务号].任务类型==实时任务)
         {就绪表登记(任务号);
    如果(系统任务块[系统管理块.运行号].任务类型==普通任务)
           {优先运行表登记(系统管理块.任务号);}
        系统管理块.时间片=0;
        任务调度();
    }  
#如果结束               
        }
    }
  中断=允许中断;
}
//=======================================
//-------结束-----------
//=======================================              

转载于:https://my.oschina.net/896822132/blog/175420

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值