技术博客

01/09/2015 作者 Magnus Carlsson

环境变量简介(1/3)

这是关于t程序环境变量3篇系列文章的第1篇:

  1. 环境变量简介
  2. 从CANlib访问环境变量
  3. Kvaser TRX和环境变量

第一篇文章介绍环境变量,以及如何在t程序中应用环境变量。

环境变量用于在不同的t程序之间通信,或者使用CANlib与PC通信。 图表1展示了Kvaser设备上正在运行的三个脚本。当脚本1设置一个环境变量,其它脚本或使用了CANlib的电脑也可以读取新数值。除此以外,脚本可以设定一个钩子(hook),达到特定环境变量值时触发。

图表1:有关环境变量值的信息如何分布的概述。

术语“envvar”通常用作较长环境变量的简写。有关完整的文档,请阅读Kvaser t编程语言文档 1

环境变量只能在t程序的envvar段中定义。就像在variables部分中定义的变量一样,环境变量在全局是可见的。这相当于在C程序中定义全局范围内的事项,即变量在声明和编译结束之间是可见的。

环境变量的类型可以是intfloatchar数组。

envvar {
  char Message[128];
  int Severity;
  int HostIdRequest;
  int HostIdConnected;
}

环境变量的大小限制于ENVVAR_MAX_SIZEt编译程序3.2版本中为4096字节),你最多可以定义32个环境变量。

与普通变量不同,环境变量不能在t程序中初始化或直接访问。相反,它们是使用envvarSetValue()envvarGetValue()来访问的。

void setHostIdConnected (int value)
{
  hostIdConnected = value;
  envvarSetValue(HostIdConnected, value);
}

函数envvarSetValue()可以设置环境变量的值。实际的更新将需要排队,因此会被延迟,直到当前钩子的执行完成。环境变量已更新的通知随后将传播到已声明相同环境变量并具有相应的 on envvar钩子的所有程序。在此上下文中,更新包括与之前相同的值的设置。

由于环境变量的实际更新被延迟,因此可以在该延迟期间启动相同环境变量的新的更新。在这种情况下,较旧的值会丢失。所以每次你读取环境变量,你得到的都是它的最新值,如果你想确保能看到每次变化,你需要使用至少两个环境变量实施握手方案。

// Print incoming messages
on envvar Message {
  char msg[128];
  int severity;
  envvarGetValue(Message, msg);
  envvarGetValue(Severity, &severity);
  printf("Severity: %d - %s\n", severity, msg);
}

函数envvarGetValue()检索环境变量的最后一个已知值。如果环境变量未初始化,结果为未定义。完整的程序列表见http://github.com/Kvaser/developer-blog

本系列的下一篇文章将阐述如何访问CANlib中的环境变量。

脚注:

1 Kvaser t编程语言文档见http://www.kvaser.cn/downloads/#?filter=t%20programming.

Author Image

Magnus Carlsson

Margus Carlsson是Kvaser AB公司的软件开发人员,从2007年以来深度参与了Kvaser固件和软件的开发。他还为Kvaser的技术博客撰写了许多用流行的Python语言编写应用程序的文章。