Wait 与 Wait Until Next ms Multiple

https://labview.qizhen.xyz/

LabVIEW程序中需要定时的时候,常常会用到这两个函数。前几天,跟同事详细解释了一下这两个函数的区别。现在把总结的内容发布上来。

image

Wait 函数比较好理解:给它个输入参数n,每次程序执行到它的时候,它就停下来,等待n毫秒,再继续运行后续程序。

Wait Until Next 函数稍微复杂一点:给它个输入参数n,每次程序执行到它的时候,会暂停在这里,Wait Until Next 函数每隔n毫秒醒来一次,醒来后再继续运行后续程序。

单纯解释概念比较抽象,还是用程序来演示一下。下图左右两个程序的功能相同吗?

image

一般情况下,程序并不要求非常精确的计时,这时 Wait 与 Wait Until Next 区别不大,程序员选用哪个函数都可以。

只有在要求很高的时候,才需要考虑他们之间的细微差别。

我们假设上图程序中 Read Data 和 Write Data 函数的运行时间都是n毫秒。若 n<50,在默认情况下,上图的两个程序,循环每迭代一次,所需时间都大约为100毫秒。

精度

但是,两个程序的计时精度是不同的。使用Wait Until Next 函数的程序的精度远高于使用Wait的程序。

在Windows这样的非实时操作系统中,定时函数是非常不精确的,每次执行,误差几毫秒是也是正常的现象。

Wait 函数,每次运行到它才开始计时,因此单次的误差会被累积。假如每次误差四五毫秒,迭代五次误差可能就达到十几毫秒了。

Wait Until Next 并不需要在每次调用的时候计算延时。假设Wait Until Next 函数从0时间开始计时,那么程序一开始运行,它就可以知道自己每一次醒来的时间分别应当是:100ms, 200ms, 300ms……。假如误差是±4毫秒,那么它实际每次醒来的时间就是100±4ms, 200±4ms, 300±4ms……,这个误差不会被累积。

image

第一次迭代的时间

运行下面两段程序,x-y分别是多少呢?

image

使用Wait函数那个程序,x-y等于500(忽略误差):延时了五次,每次100毫秒,那么总和就是500毫秒。

而使用Wait Until Next 函数那个程序,x-y的值则每次都不确定,但是值的变化范围是确定的,在 400+2n 与 500 之间。这是因为Wait Until Next 开始计时的时间并不是根据程序何时运行来确定的,对于程序来说,这个时间是不确定的。虽然 Wait Until Next 函数保证每次醒来的间隔是100ms,但它却不能确定第一次醒来的时间。第一次醒来可能是0~100ms之间任何一个时间。

如果循环第一次迭代就必须是精确的100毫秒,那么该怎么办呢?办法很简单,让Wait Until Next 第一次睡眠时不做任何事情,从第二次才开始使用它就行了。如下图的程序,每次运行,x-y的结果就会是确定的500

image

并行与串行

在前面看到的程序里,延时函数与循环中其它的代码是并行的,这样,只要其它代码耗时不长,循环每次迭代的时间就是有延时函数的输入参数来决定的。但有时候,延时函数需要与其它代码串行,比如必须在某两个节点之间延时。

image

当串行的时候,再使用Wait函数计时就不那么准确了。比如上图左面那个程序,它的循环没迭代一次的时间变成了2n+100。n这个时间是不确定的,它会受到电脑的配置,CPU负荷等的影响。因此用这种方式计时非常不准确。

而Wait Until Next 只考虑每次醒来的间隔,至于什么时候进入休眠的,并不影响醒来的时间。因此,对于它来说,并行与串行的效果是完全相同的(2n<100时)。

《我和LabVIEW》售出九千多册了

我常常会去售书的网站看看读者对自己这本书的评论,最近发现京东,卓越两个网站长期缺货,也不知道为啥。于是想起来去跟编辑打听一下这本书的销售情况。胡主任告诉我,书已经卖出了九千多册了,前两次印刷的一万册很快就会售罄。今天正好是这本书发行两周年的纪念日。

我最初还真没想到一本LabVIEW书会有这么多读者。开始写这本书的时候,我以为中国LabVIEW用户数量不多,这本书能卖出去三四千本我就满足了。现在看来,中国LabVIEW用户还真不少,LabVIEW影响力蛮大呢。

谷歌拼音输入法的语音输入

今天 偶然看到谷歌拼音输入又更新了,新版本的谷歌输入法带有语音输入功能。这个功能还是非常有用的,毕竟说话的速度远高于打字。我赶紧下载下来试使用了一下,这篇博客就是我说出来的。试用之后的第一感觉是速度太慢,说一句话要等半天才能够翻译成文字,尤其是在网络不好的情况下。目前使用语音输入的速度还不如我打字快。

豆豆九个月

豆豆上星期满九个月,当时我正在出差,所以现在才写博客记录。

豆豆是老太太杀手。豆豆出去晒太阳的时候常常会引来老头老太逗他玩,尤其是那些还没孙子的老人们。豆豆比较穿得比较有特点,一般只穿一个小背心,是小宝里穿得最少的。尤其是他不穿袜子,似乎上海人认定小宝是必须穿袜子的,所以他光着脚丫特别显眼。现在,小区周围几个街区的老太太没有不认识豆豆的。

周末我抱着豆豆去菜场,后面一位大婶凑过来逗他玩,然后说小家伙看起来坏坏的。豆豆的坏小子本性早就暴露无疑了。他大约一两个月前学会了借助大人的手去够东西,比如说他想要桌子上的玩具,但够不到,就会抓起我的手,往玩具那里伸。再后来他就学会有别人的手来鉴别危险啦。比如去超市,他看见货架上的商品,他想去抓,又不确定那些东西是否会伤害到他。这时候他就会抓起我的手去碰那些商品,如果我碰一下就缩回来,那他也不会去碰。否则,看我可以安全的触摸某样东西,他就放心了,上去一把就把东西抓过来。

昨晚,我抱着他在屋里溜达,走到电风扇前面。他已经知道电风扇是很危险,不能碰的。但是他盯着电风扇看了一会突然就嘿嘿嘿坏笑起来了,然后就抓起我的手去够电风扇。我知道他在打什么鬼主意,于是轻轻碰了一下电风扇,然后假装被打到了,迅速缩回手,哎呦哎呦叫了几声。豆豆自以为得计,哈哈哈得笑的前仰后合。

豆豆已经学会真正的爬行了,现在在床上够东西再也不用匍匐前进了,而是直接就会用膝盖双手交错爬行前进了,行进效率提高了不少。

豆豆是个火气比较旺的小宝,最近居然有点大便干燥。前几天拉屎的时候大概很疼,还哇哇的哭了一通。这两天改善了豆豆的伙食,吃的全是火龙果,鸭梨这些去火通便的食物,他才终于恢复正常了:)