MATLAB计时器对象陷阱和使用不佳

时间:2014-02-04 19:47:45

标签: matlab timer

我创建了一个每0.1秒执行一次的计时器。它调用一个读取数据然后更新对象属性的函数。当我启动定时器时,MATLAB在命令窗口的底部显示“Busy”信号。 MATLAB变得没有响应,我无法使用stop()函数暂停计时器。我唯一的办法是使用Ctrl-C。

我确定问题是定时器回调函数的处理时间比调用周期长,我认为没有其他MATLAB代码可以吱吱声进入堆栈/队列。这让我有点担心依赖计时器。我的目标是不断地从多个设备进行测量,将它们存储在一个对象中,并且需要MATLAB在这些测量之间做其他事情。此外,我不能错过测量。

我正在创建一个响应用户输入并为用户提供实时信息的应用程序,因此我选择了一个快速的时期,认为它会产生一个抢购用户体验。由于我致力于使用MATLAB,我想不出比使用计时器对象更好的实现此功能的方法。所以第一个问题是,定时器对象是否适合我上面描述的工作?

其次,如果我要使用计时器对象,有人请分享他们使用计时器常见错误或陷阱的经验吗?或者有人就如何最好地实现计时器对象提出任何建议?可以同时使用的计时器对象的数量是否有实际限制?确定计时器对象的最佳频率的最佳方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:4)

我认为0.1秒会推动它的可靠性,特别是如果你有多个计时器同时进行,特别是如果你想要一个用户界面同时响应。

MATLAB基本上是单线程的。有一些例外,例如较低级别的数学例程以多线程方式调用BLAS,这会加速它们的速度。您也可以用多线程的C编写MEX代码,并从MATLAB调用它。但是基本上有一个真正的线程可以运行所有代码。

计时器对象在某种程度上也是一个例外。当你创建一个计时器对象时,在它下面有一个java计时器对象,它在一个单独的java线程上运行。但是当它的任何回调触发时,它会回调到MATLAB来执行它们,这发生在一个真正的线程上。

如果您不能错过衡量标准,则需要将定时器的BusyMode属性设置为queue而不是默认drop,这意味着如果有的话回调的执行时间超过0.1秒,它们将备份 - 您还必须适应任何用户界面操作。

此外,MATLAB不会(并​​且不能)对计时器回调的执行速度或定期精度做出任何真正的保证。如果Windows突然决定运行病毒扫描或更新自身等,MATLAB将失去优先权,这将搞砸。如果你每10秒钟,甚至每1秒钟发射一次计时器,那么它很可能大致准确。但是如果你每毫秒都要开它们,你就不能指望它是可靠的 - 你需要一个适当的实时环境。 0.1秒对我来说似乎是边缘的,我希望它的可靠性取决于你在0.1秒内完成了什么,以及还有什么(以及你正在运行的计算机)。

要回答你的上一个问题(最大计时器数量,最佳计时器频率等) - 没有一般性答案,只需尝试一下,找出在特定情况下一系列值会发生什么。

如果事实证明它不够可靠,你可以试试:

  1. 以另一种更快的方式(例如在C中)进行数据采集,可能是在一个单独的过程中,然后通过MEX从MATLAB调用,也许通过某种缓冲来平滑事物。
  2. 转向其他一些MathWorks产品(例如Simulink,Simulink Coder,一些系统工具箱),这些产品专为开发适当的实时系统而设计。
  3. 希望有所帮助!