CAPL是类似于C语言的面向过程语言,这是众所周知的。C或C++代码在执行前需要编译成机器语言,也就是二进制语言,如此能够更快速运行。CAPL程序也是一样的,需要编译后执行
在CAPL Browser编辑器下,Home -> Compile/Compile All,Compile编译当前打开的CAPL文件,Compile All编译CAPL Browser下所有的CAPL文件
编译后无论成功还是失败,信息都会显示在Output窗口内。有时候我们会误关Output窗口,导致编译时无法显示编译信息,怎么办呢?
编译时会自动保存CAPL文件,这是在Options界面设置的
Options界面还可以设置很多CAPL程序的功能,感兴趣的自己摸索!!!
成功编译后,会自动创建CAPL程序的二进制格式文件CBF文件,文件扩展名*.cbf
了解CAPL程序需要编译后,我们思考一个需求:如果我想让CAPL程序在CANoe环境下编译某些代码,在非CANoe环境下编译另外的代码。这样就可以用一个CAPL程序运行于两种不同的环境
本质上,就是在CAPL程序编译时添加判断条件,官方称为“有条件编译”
函数、include部分或variables部分中的某些行只有在满足某些条件时才能编译。为此,在相关行之前写#if
,然后在它们之后写#endif
例如:
on message *
{
#if MEASUREMENT_SETUP
output(this);
#endif
}
#if 后面是预定义条件。“有条件编译”里的判断条件是预定义的,而不是自定义的。什么是预定义条件,其实就是CAPL语言预先定义好的,不可更改的
“有条件编译”里的所有预定义条件:
预定义条件 | 描述 |
---|---|
MEASUREMENT_SETUP | 如果CAPL程序是CANoe Measurement Setup的一部分,则为true,值为1 |
SIMULATION | 如果CAPL程序是CANoe的Simulation Setup或Test Setup的一部分,则为true,值为1 |
ANALYSIS | 如果CAPL程序是CANoe Measurement Setup的一部分,则为true,值为1 |
TEST_NODE | 如果程序是CAPL测试节点或测试库,则为true,值为1 |
CANOE | 如果程序是为CANoe编译的,则为true,值为1 |
CANOE_LT | 如果程序是为CANoe LT编译的,则为true,值为1 |
CAPL_ON_BOARD | 如果CAPL程序是为在硬件接口上执行而编译的,则为true,值为1 |
EXTENDED_REAL_TIME | 如果CAPL程序是为在扩展实时部分中执行而编译的,则为true,值为1 |
TOOL_MAJOR_VERSION | CANoe的主要版本,比如,7表示CANoe 7.5 SP3 |
TOOL_MINOR_VERSION | CANoe的子版本,比如,5表示CANoe 7.5 SP3 |
TOOL_SERVICE_PACK | CANoe的服务包,比如3表示CANoe 7.5 SP3 |
DEBUG | 如果CAPL调试被激活,则为true,值为1 |
X64 | 如果CAPL程序位于Simulation Setup或Test Setup中,并且使用了RT内核(Linux或Windows64)的64位变体,则为true,值为1 |
LINUX | 如果CAPL程序是CANoe的Simulation Setup或Test Setup的一部分,并且使用了RT内核的Linux变体,则为true,值为1 |
这些预定义条件,可以根据需要使用括号和逻辑运算符链接到整体条件中,如 || 和 &&。还可以在条件中使用数字和关系运算符,例如 < 和 ==
#if (TOOL_MAJOR_VERSION == 7 && TOOL_MINOR_VERSION == 5 && TOOL_SERVICE_PACK < 2) || CANALYZER
#pragma message("This program needs at least CANoe 7.5 SP 3")
#endif
可以使用#elif
#if TOOL_MAJOR_VERSION == 7
#if TOOL_MINOR_VERSION == 5
write("CANoe 7.5");
#else
write("Unknown CANoe 7.x");
#endif
#elif TOOL_MAJOR_VERSION == 8
write("Unknown CANoe 8.x");
#else
write("Unknown CANoe version");
#endif
在CANoe vTESTstudio12.0 SP3中,可以使用#define
variables
{
#define DEBUG_OUTPUTS
}
on message EngineState
{
#if DEBUG_OUTPUTS
if (this.State == 3)
{
write(“State 3 reached”);
}
#endif
}
说的再多,不如自己动手写一个程序感受下:
on key 'a'
{
#if CANOE
write("CANoe");
#else
write("not CANoe");
#endif
}
你们觉得如果在CANoe下编译后执行这个CAPL程序,会输出什么?
这说明在CANoe环境下编译上面的CAPL程序时,对于“有条件编译”的部分,编译时会根据预定义条件,判断是否编译相关代码。所以上述代码中实际编译成功的代码是
实际上执行的程序应该是这样的:
on key 'a'
{
write("CANoe");
}
切记:千万千万不要认为#if
“有条件编译”是从CANoe 7.5版本开始的!!!
除了在CAPL程序中添加预定义条件外,还可以添加编译器控制指令
这些命令怎么用呢?用#pragma message举个简单的例子:
#pragma message指令允许用户在编译过程中输出自己的消息,例如当前正在编译的CAPL程序的版本号。它与编译器的其他消息、警告、错误和一般消息一起出现
其他控制指令请自行尝试