//版权声明:
// 本代码为开源代码,作者拥有代码版权,但你可以在任何非商业用途程序中引用,但请标注出处,你
// 也可以对代码进行更改。作者对代码中所包括的错误以及所造成的一切后果将不负任何责任。如果你发
// 现代码中有任何问题或错误,请与我联系。
// 联系方法: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;
任务调度();
}
#如果结束
}
}
中断=允许中断;
}
//=======================================
//-------结束-----------
//=======================================