多任务(并行程序) — 何时需要多任务程序C++语言测试



翻译一片来自 http://www.robotc.net/forums/viewtopic.php?f=1&t=3342 的文章
多任务(并行程序) — 何时需要多任务程序
多任务是指同时执行不同的任务。让我门来看一下例子,判断是否需要多任务执行。
机器人向前行驶,知道声纳探测到距离障碍物小于30cm,机器人向右转弯、停止。
这个程序的流程如下:

    

        

        

     
  

  

  

      

代码

  

开始程序,

  

马达转动,向前行驶,
(译)直到声纳探测距离小于30厘米,

  

向右转弯,右马达副职,左马达正值,

  

停止行驶,

  

结束程序。

     

  

  

   
    

        

        

     

可以看到,这个例子的程序按顺序执行,无需多同时执行多任务。

机器人巡线行走,直到距离篮筐小于20厘米时,讲求放入篮筐。
这个程序的流程如下:

    

        

        

     
  

  

  

      

代码:

  

开始程序
声纳检测距离篮筐是否小于20厘米,
光感值为暗值:
马达转向一个方向,

  

光感值为亮值:
马达转向另一个方向,
声纳探测到距离篮筐小于20厘米
停止马达,
控制手臂的马达启动,讲求放入篮筐,
结束程序。

     

  

  

   
    

        

        

     

这个例子中,声纳探测距离和光感读取光值同时进行,我们是否需要同时执行多任务?答案是否定的,因为可以把同时发生的任务整合成一个单一的任务。代码如下:

    

        

        

     
  

  

  

      

Code:

  

task main()
{
// do the things in this loop while the sonar sensor is > 30  cm
while(SensorValue(sonar) > 30)
{
// follow line:
if(SensorValue(lineFollower) < threshold)
{
// turn sligtly one direction
motor[rightMotor] = 50;
motor[leftMotor] = 0;
}
else
{
// turn slightly in the other  direction
motor[rightMotor] = 0;
motor[leftMotor] = 50;
}
}

// stop motors and dump ball into basket:
motor[rightMotor] = 0;
motor[leftMotor] = 0;
motor[armMotor] = 25
wait1Msec(1000);
motor[armMotor] = 0;
}

     

  

  

   
    

        

        

     

当同时发生的任务可以整合成一个单一的任务时,我们永远都不选择同时执行多任务!

什么时候同时执行多任务呢?想象一下有个机器人在房间吸尘,遇到人时要选择避让,当避让失败时,按下紧急按钮,迅速停止机器人的运行。这个流程应该什么样呢?很难设计出一步一步线性的执行步骤,因为当其他任务在执行时,需要判断紧急按钮是否被按下,从而保证一旦按下,就可以结束程序。这时候就需要设计同时执行多任务的程序。

行走流程图:

    

        


        

     
  

  

  

      

代码:

  

开始程序,
打开吸尘器,
四周行走,
如果声纳发现了人:
停止马达,
关闭吸尘器,
人离开后:
打开吸尘器,
四周行走,
循环上述流程

     

  

  

   
    

        

        

     

停止流程图:

    

        

        

     
  

  

  

      

代码:

  

开始循环:
如果紧急按钮被按下:
结束程序.
如果紧急按钮没有被按下:
继续循环,

     

  

  

   
    

        

        

     

真实的程序代码如下:

    

        

        

     
  

  

  

      

Code:

  

task e_stop()
{
while(true)
{
if(SensorValue(e_stopBtn) == 1)
{
StopAllTasks(); // this ends the program
}
wait1Msec(10);  // this prevents the current  task from hogging the CPU
}
}

task main()
{
StartTask(e_stop);
while(true)
{
if(SensorValue(sonar) <= 10)
{
motor[rightMotor] = 0;
motor[leftMotor] = 0;
motor[vacuumMotor] = 0;
}
else
{
// code for driving around room here
}
wait1Msec(10);  // this prevents the current  task from hogging the CPU
}
}

     

  

  

   
    

        

        

     

尽管避让人的行为和捡起物品的行为同时发生,但他们可以整合到一个单一的任务中。而制动紧急按钮是一个单独的任务,和主要任务并行。另外要注意到‘wait1Msec’命令,如果没有这个命令,其中的一个任务有可能会独占CPU,阻止另一个任务的执行。

要记住main task()执行的是主要任务,主要任务停止时,其他任务也必须停止。在吸尘这个例子中,主要任务永远不会停止,除非制动了紧急按钮。

这是一个很好的关于多任务的例子,当然还有很多关于的多任务的重要和危险的概念在这里没有介绍。希望有人更深入的去研究这方面的知识.

记住:
99%的程序不要执行多任务!
并且
99.9% 多任务程序错误是因为错误的使用了多任务程序!!

_________________
Bence Feher

Undergraduate Intern – NREC, Robotics Academy
ROBOTC – Testing/Documentation/Developer

Computer Science, Japanese, East Asian Studies
University of Pittsburgh, Konan University 甲南大学

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

收藏收藏1 转播转播 分享分享 分享淘帖 赞赞 踩

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复使用道具 举报

scaeac
2楼

 发表于 2014-1-21 21:30:00 | 只看该作者
进程调度是一门很高深的技巧。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复 支持 反对使用道具 举报

zhlego
3楼

 发表于 2014-1-24 16:50:06 | 只看该作者
文中错字太多,如“副职”、“讲求”等。望改正。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复 支持 反对使用道具 举报

kuuxi
4楼

  楼主| 发表于 2014-1-25 08:33:20 | 只看该作者

zhlego 发表于 2014-1-24 16:50
文中错字太多,如“副职”、“讲求”等。望改正。

帖子中为什么会有大段的空白,望告知,谢谢!

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复 支持 反对使用道具 举报

kuuxi
5楼

  楼主| 发表于 2014-1-25 08:33:39 | 只看该作者

zhlego 发表于 2014-1-24 16:50
文中错字太多,如“副职”、“讲求”等。望改正。

帖子中为什么会有大段的空白,望告知,谢谢!

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复 支持 反对使用道具 举报

6楼

 发表于 2014-1-25 12:35:03 | 只看该作者

kuuxi 发表于 2014-1-25 08:33
帖子中为什么会有大段的空白,望告知,谢谢!

你指那儿?

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!