CANalyzer中CAPL脚本createGlobalMarker()函数可用场景及配置影响咨询
关于CAPL中createGlobalMarker()函数的可用场景说明
一、合法使用场景
- 按键触发事件(
on key):官方示例里的标准场景,用户主动按键触发,属于同步交互上下文 - 测量生命周期事件(
on start/on stop):测量启动或停止时调用,属于测量流程的核心同步节点 - 预初始化事件(
on preStart):测量启动前的初始化阶段,仅执行一次 - 自定义菜单事件(
on menu):通过CANalyzer自定义菜单触发的操作,属于用户主动发起的同步操作
二、为什么定时器/switch/信号事件里不能用
createGlobalMarker()是需要直接和CANalyzer主界面、测量上下文交互的函数,这类函数必须运行在同步的主线程上下文中。而定时器(on timer)、信号接收(on signal)、switch分支属于异步或周期性的执行上下文,CAPL引擎为了避免线程冲突、保证测量数据一致性,限制了这类上下文调用界面交互类函数。
三、和配置的关系
这个限制和你的发送分支配置无关,是CAPL语言本身的上下文权限规则。如果需要在信号切换时记录标记,可以用以下变通方案:
- 定义一个全局变量标记是否需要创建Marker
- 在信号切换、定时器触发的逻辑里设置这个变量
- 用一个低周期的定时器轮询该变量,满足条件时调用
createGlobalMarker()
示例代码:
variables { int g_needMarker = 0; timer t_pollMarker; } on start { setTimer(t_pollMarker, 10); // 10ms轮询一次 } on timer t_pollMarker { if(g_needMarker == 1) { createGlobalMarker("信号切换标记", 0); g_needMarker = 0; } setTimer(t_pollMarker, 10); } // 你的信号切换逻辑示例 on signal TargetSignal { switch(this.value) { case 0x01: // 更新帧内信号值 g_needMarker = 1; break; case 0x02: // 更新帧内信号值 g_needMarker = 1; break; } }
内容的提问来源于stack exchange,提问作者Daemon Painter
相关产品推荐
相关产品推荐

