• CAPL语言编译的那些事


    CAPL是类似于C语言的面向过程语言,这是众所周知的。C或C++代码在执行前需要编译成机器语言,也就是二进制语言,如此能够更快速运行。CAPL程序也是一样的,需要编译后执行

    CAPL Browser编译

    在CAPL Browser编辑器下,Home -> Compile/Compile All,Compile编译当前打开的CAPL文件,Compile All编译CAPL Browser下所有的CAPL文件

    编译后无论成功还是失败,信息都会显示在Output窗口内。有时候我们会误关Output窗口,导致编译时无法显示编译信息,怎么办呢?

    显示Output窗口

    编译时会自动保存CAPL文件,这是在Options界面设置的

    Options界面

    Options界面还可以设置很多CAPL程序的功能,感兴趣的自己摸索!!!

    成功编译后,会自动创建CAPL程序的二进制格式文件CBF文件,文件扩展名*.cbf

    cbf文件

    了解CAPL程序需要编译后,我们思考一个需求:如果我想让CAPL程序在CANoe环境下编译某些代码,在非CANoe环境下编译另外的代码。这样就可以用一个CAPL程序运行于两种不同的环境

    本质上,就是在CAPL程序编译时添加判断条件,官方称为“有条件编译”

    函数、include部分或variables部分中的某些行只有在满足某些条件时才能编译。为此,在相关行之前写#if ,然后在它们之后写#endif

    例如:

    on message *
    {
    	#if MEASUREMENT_SETUP
    	  output(this);
    	#endif
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    #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_VERSIONCANoe的主要版本,比如,7表示CANoe 7.5 SP3
    TOOL_MINOR_VERSIONCANoe的子版本,比如,5表示CANoe 7.5 SP3
    TOOL_SERVICE_PACKCANoe的服务包,比如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
    
    • 1
    • 2
    • 3

    可以使用#elif 或#else添加具有其他条件的附加部分。还可以嵌套条件

    #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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在CANoe vTESTstudio12.0 SP3中,可以使用#define 自定义条件

    variables
    {
      #define DEBUG_OUTPUTS
    }
    
    on message EngineState
    {
    	#if DEBUG_OUTPUTS
    	  if (this.State == 3)
    	  {
    	    write(“State 3 reached”);
    	  }
    	#endif
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    说的再多,不如自己动手写一个程序感受下:

    on key 'a'
    {
      #if CANOE  
      write("CANoe");
      
      #else
      write("not CANoe");
      
      #endif
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    你们觉得如果在CANoe下编译后执行这个CAPL程序,会输出什么?

    输出结果

    这说明在CANoe环境下编译上面的CAPL程序时,对于“有条件编译”的部分,编译时会根据预定义条件,判断是否编译相关代码。所以上述代码中实际编译成功的代码是

    有条件编译的代码

    实际上执行的程序应该是这样的:

    on key 'a'
    {
      write("CANoe");
    }
    
    • 1
    • 2
    • 3
    • 4

    切记:千万千万不要认为#if 是在执行CAPL程序时判断的,而是在编译时判断的,满足判断条件即编译,不满足则不编译。程序执行时只执行编译的代码。这个逻辑千万不要搞错了

    “有条件编译”是从CANoe 7.5版本开始的!!!

    除了在CAPL程序中添加预定义条件外,还可以添加编译器控制指令

    控制指令

    这些命令怎么用呢?用#pragma message举个简单的例子:

    #pragma message指令允许用户在编译过程中输出自己的消息,例如当前正在编译的CAPL程序的版本号。它与编译器的其他消息、警告、错误和一般消息一起出现

    示例

    其他控制指令请自行尝试


  • 相关阅读:
    史上最全跨域总结
    黑灰产套现城市消费券大揭秘
    一文看懂Linux 页表、大页与透明大页
    芯片工程师求职题目之CPU篇(4)
    Flink 运行时架构(三)
    mac安装node失败
    数据结构——常见的十种排序算法
    音视频封装demo:将h264数据和aac数据封装(mux)成TS文件(纯手工,不依赖第三方开源库)
    PaddleSeg学习3——使用PP-LiteSeg模型对道路进行分割
    js之使用正则对象对字符串进行处理
  • 原文地址:https://blog.csdn.net/wjz110201/article/details/127887861