【发布时间】:2018-09-08 00:16:47
【问题描述】:
我有一个控制 CAN 信号发送开始的 CAPL 测试代码。我的目标是延迟发送过程的开始。 我的想法是通过 setTimer() 函数与 isTimerActive() 结合使用。
一般来说,我的代码如下所示:
main() {
CANstart();
function_2();
function_3();
}
CANstart() {
SetTimer(Delay, 5000); //Timer initialization, set to be 5000ms
while (isTimerActive()==1) {
// this while loop avoids that the code is proceding while the settimer exception is being called and executed
}
StartCANTransmitting(); // After this function, jump back to main and proceed with function_2
}
on timer Delay {
// Do nothing, just wait
}
上面的程序代码导致卡在那个点,CANoe 没有响应,我可以结束模拟的唯一方法是通过任务管理器。
- 从我这边进一步检查得出的结论是计时器需要更多时间来处理并且根本没有执行。
- 如果没有 isTimerActive() 函数,程序代码不会等待定时器完成,也没有任何延迟。似乎代码在没有等待异常的情况下运行。
- 似乎 CAPL 对循环的处理非常糟糕。
我查看了 stackoverflow,以下论坛帖子讨论了我遇到的非常相似的问题,但没有提供任何可行的解决方案:
CAPL Programming usage of Timer as a delay
【问题讨论】:
-
你在使用main,这意味着你可能正在编写一个CAPL测试节点,对吧?在这种情况下,
TestWaitForTimeout是要走的路。正如您使用的那样,CAPL 计时器更多地用于模拟节点等,其中事物是基于事件的。能否请您说明一下您是如何发送 CAN 消息的,以及它到底是哪里出错了?