定时器事件中断其他功能

时间:2015-09-02 09:06:26

标签: matlab callback queue interrupt

我对Matlab所描述的行为感到有些困惑。 我正在做的是使用"车辆通信工具箱"从CAN总线读取数据。并在我的GUI中实时绘制数据。

为了读取CAN数据,工具箱调用回调函数。它读取并过滤CAN数据,并将时间戳和数据存储在我自己的数据结构中。

为了更新GUI,我定义了一个每0.1秒调用一次的定时器事件。它从我的数据结构中读取数据并将其分配给' XData'和' YData'某些地块的属性。

经过一段随机的时间后,我收到XData和YData长度不一的警告。

调试显示我的计时器对象的回调函数中断了回调函数,该回调函数在时间戳(XData)和信号(YData)分配到我的数据结构之间读取CAN数据。

没有调用drawow函数或某事。或者,它允许事件队列处理下一个事件。

以下是新CAN消息的回调函数片段

% save timestamps
% this line my be interrupted:
this.canData.(msgInfo.Name).Timestamps = ...
   [this.canData.(msgInfo.Name).Timestamps ...
   [messages.Timestamp]];

%save all Signals in a Message, they all have the same timestamp
% this line my be interrupted:
signals = [messages.Signals];   
for s = 1:length(msgInfo.Signals)
    this.canData.(msgInfo.Name).Signals.(msgInfo.Signals{s}).Data = ...
    [this.canData.(msgInfo.Name).Signals.(msgInfo.Signals{s}).Data ...
    signals.(msgInfo.Signals{s}) ];
end

在调试中,执行在两行中的一行停止并继续在timercb.m中调用我的计时器函数,然后尝试更新绘图并生成警告。

此行为是否记录在案?文档sais,只调用drawow,waitfor等允许中断函数。

我正在使用Matlab 2015a

更新

Matlab分析器向我展示了定时器功能" timercb"被叫。 我真的很想知道为什么Matlab会在某处停止所有这些功能。他们都没有打电话,等待或等等。其他。 Profile

我知道,Matlab是单线程的,但这是如何组合在一起的?

1 个答案:

答案 0 :(得分:0)

我假设您正在使用MessageReceivedFcn作为here所述的CAN通道。您是否可以使用receive()函数在计时器回调期间显式轮询CAN通道?这样就不会出现中断和数据在错误时间发生变化的可能性。

receive()函数返回收到的消息数量的指示,因此您只需要检查它是否为非零。