原创 基于Mega48时间调度器(多任务处理)一例

2008-8-29 14:48 2694 9 9 分类: MCU/ 嵌入式

无意中看到"时间调度器"这个概念,并对此作了一点了解,下了一个网友(忘记了网友的姓名了 -----)的程序,稍作改动,放上来共享,更多资料请到OURAVR上去搜,上面有N多好东东......


个人意见:


 1)完全的合作式调度器应该不怎么实用(至少对现在的我来说),每隔一段时间做某一件事,当要求对单片机时刻保持对外部数据的接收时用此调度器就免为其难了.个人觉得用在显示(LED,LCD)上还是挺方面的.另外,用捕捉中断来接收外部数据,显示部分用lcd来做应该可以做到,因为可能只是延时一点点时间刷新显示,不会像led那样对扫描时间要求比较严格;


2)采用时间调度器为核的程序移植和修改非常方便,给人看着比较舒服;


关于应用场合方面本人没有作很多的思考,如各位能指点一二那是最好不过的事了,呵呵......


;-----------------------------------------------------------------------------


完整的程序:点击下载


编译器:IAR 4.30


本程序的三个任务时标:10ms)


 SCH_Add_Task(Ring_Flash, 10, 500);     //蜂鸣器天关  500ms换一次
 SCH_Add_Task(Check_Key,5,10);          //按键检测    10ms一次
 SCH_Add_Task(Led_Display_Flash, 0, 3);//数码管刷新显示 3ms一次


程序实现的功能:蜂鸣器每隔0.5S响一次+按键扫描(有长按功能)控制key_counter+数据管显示key_counter的值(两位)


 


;---------------------------------------------------------------------------------------


PS:"状态机"是个非常好用的东东,我非常喜欢,上面程序按键扫描程序:


void Check_Key(void)
{
     static unsigned char steps="0";
     if(Key1==1 && Key2==1)
    {
          steps="0";
          return;
    }
    if(steps==1 || (steps%20==0 && steps>1))
   {
        if(Key1==0)
        Disp_dat++;
        if(Key2==0)
        Disp_dat--;
    }
     steps++;
    return;
}


短短几行就实现了带长按的按键扫描;(上面程序如果前10ms按KEY1而后10ms按的是KEY2则软件会判KEY2,可以作些修改.......)


 


;-----------------End-------------------------------------------------------------------

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条