翻译一片来自 http://www.robotc.net/forums/viewtopic.php?f=1&t=3342 的文章
多任务(并行程序) — 何时需要多任务程序
多任务是指同时执行不同的任务。让我门来看一下例子,判断是否需要多任务执行。
机器人向前行驶,知道声纳探测到距离障碍物小于30cm,机器人向右转弯、停止。
这个程序的流程如下:
|
|
|
|
代码 开始程序, 马达转动,向前行驶, 向右转弯,右马达副职,左马达正值, 停止行驶, 结束程序。 |
|
|
|
|
可以看到,这个例子的程序按顺序执行,无需多同时执行多任务。
机器人巡线行走,直到距离篮筐小于20厘米时,讲求放入篮筐。
这个程序的流程如下:
|
|
|
|
代码: 开始程序 光感值为亮值: |
|
|
|
|
这个例子中,声纳探测距离和光感读取光值同时进行,我们是否需要同时执行多任务?答案是否定的,因为可以把同时发生的任务整合成一个单一的任务。代码如下:
|
|
|
|
Code: task main() |
|
|
|
|
当同时发生的任务可以整合成一个单一的任务时,我们永远都不选择同时执行多任务!
什么时候同时执行多任务呢?想象一下有个机器人在房间吸尘,遇到人时要选择避让,当避让失败时,按下紧急按钮,迅速停止机器人的运行。这个流程应该什么样呢?很难设计出一步一步线性的执行步骤,因为当其他任务在执行时,需要判断紧急按钮是否被按下,从而保证一旦按下,就可以结束程序。这时候就需要设计同时执行多任务的程序。
行走流程图:
|
|
|
|
代码: 开始程序, |
|
|
|
|
停止流程图:
|
|
|
|
代码: 开始循环: |
|
|
|
|
真实的程序代码如下:
|
|
|
|
Code: task e_stop() |
|
|
|
|
尽管避让人的行为和捡起物品的行为同时发生,但他们可以整合到一个单一的任务中。而制动紧急按钮是一个单独的任务,和主要任务并行。另外要注意到‘wait1Msec’命令,如果没有这个命令,其中的一个任务有可能会独占CPU,阻止另一个任务的执行。
要记住main task()执行的是主要任务,主要任务停止时,其他任务也必须停止。在吸尘这个例子中,主要任务永远不会停止,除非制动了紧急按钮。
这是一个很好的关于多任务的例子,当然还有很多关于的多任务的重要和危险的概念在这里没有介绍。希望有人更深入的去研究这方面的知识.
记住:
99%的程序不要执行多任务!
并且
99.9% 多任务程序错误是因为错误的使用了多任务程序!!
|手机版|中文乐高 ( 桂ICP备13001575号-7 )
GMT+8, 2024-5-14 01:58 , Processed in 0.054834 second(s), 17 queries .
Powered by Discuz! X3.5
Copyright © 2001-2020, Tencent Cloud.