EPICS--Sequencer第二部分--编译SNL程序

SNL到C的编译器

SNL到C的编译器snc编译状态标记语言到C代码。产生的文件可以接着被一个C编译器编译。

编译器选项

SNC选项一一个加号或减号起始,后跟一个字符。加号启用这个选项,而减号关闭这个选项,除非选项接收一个参数(当前仅-o)。

选项       描述
+a异步pvGet:程序继续不等待这个pvGet操作结束。
-a同步pvGet:程序等待结束。如果没有指定一个选项,这是默认的。
+c在允许这个程序开始执行前,等待过程变量连接。这是默认的。
-c在建立对所有通道连接前,允许这个程序开始执行。
+d开启运行时调试消息。
-d关闭运行时调式消息。这是默认。
+e使用新的事件标记模式。这是默认。
-e使用老的事件标记模式(在执行一个when语句后清除标记)。
+i生成向一个IOC shell注册shell命令和程序的注册过程。这是默认。
-i不产生注册过程。
+l添加行记号到产生的代码,因而C编译器指向这个SNL源文件。这是默认。
-l不产生注册过程。
+m包含mian过程(seqMain.c)用于一个单独程序
-m不包含seqMain.c。这是默认。
+r使得生成的代码可重入,因而允许在一个IOC上运行这个程序的多个实例。
-r生成的代码不可重入。这是默认。
+s安全模式:变量对于状态集是本地的并且必须是显式地通信。隐含+r。
-s传统(非安全)模式。出于兼容性,这是默认。
+w显示警告信息。这是默认。
-w关闭警告。
-o要更改生成C文件地名称。需要一个参数

在版本2.2中新特性

选项描述
+W显示未定义对象的额外警告
-W关闭额外警告。这是默认

注意:对于在第二个参数中显式地指定SYNC或ASYNC的pvGet调用,忽略+a和-a。

也可以从在这个程序内设置选项(在程序名/参数和状态集定义之间的某个地方),见SNL Reference for Version 2.2中的Option。

在1.8版本的sequencer前,在执行一个when语句后清除事件标记。当前,必须用efTestAndClear或efClear显式地清除事件标记。-e编译器选项可以用于恢复老的行为。

输出文件

输出文件名的文件名同输入文件名,其后缀被替换成了.c。-o选项可以用于指定重写这个输出文件名。

规则实际上比以上叙述的稍微复杂:.st以及单字符扩展名被.c替代;否则,.c被加到完整文件名的末尾。在所有情况中,-o编译器选项进行重写。

错误

如果snc探测到一个错误,它显示一条描述这个错误以及在源文件中位置的消息并且取消进一步编译。注意:snc不包含一个类型检测器:它知道所有C的是语法。这意味着很多错误只在C编译阶段才被发现。C编译器将认为这些属于在SNL源代码中对应位置,由于snc默认在输出中产生行标记,它们指回原先的源。可以用-l("ell")编译器开关关闭这个功能。

警告

在特定情况中,snc不能最终决定代码是否错误。在这样的情况中,它将发出一条警告消息并且继续。

最显著的示例是一个变量或CPP宏的使用,它还未在SNL代码中被声明,但编译产生的C代码时,可能很好地被定义(例如,如果声明已经在被嵌入的代码中,snc完全不解析)。可以用-w编译器选项关闭警告。

C预编译器

取决于这个应用程序,用一个C预编译器(cpp)预编译SNL源可能是有用的。使用C预编译器使你能包含其它SNL文件,定义宏以及执行条件编译。snc通过解析cpp-生成的行标记支持这种行为,因而错误和警告消息指向在未预处理的SNL源中的行号。

sequencer添加到EPICS构建系统的构建规则是具有扩展名.st的文件被预处理,而具有扩展名.stt的文件不被预处理。

完全构建

默认,由snc从一个SNL程序生成的C代码不是一个完整的程序,而仅仅是一个过程,数据类型以及变量的集合。生成的过程应该sequencer库调用,该库必须被连接到这个程序。进一步,产生的代码包含了很多头文件,都来自sequencer和来自EPICS base。因而,编译器需要在器include路径中有EPICS base和sequencer的include目录,并且当链接时,它需要链接sequencer和某些EPICS base库。

构建程序的最简单和最可靠方式是通过使用EPICS构建系统。所有你需要做的是:

1) 通过添加.st或.stt到<prod or lib>_SRCS变量声明你的.st或.stt文件最为你程序或IOC的源,此处<prod or lib>是PROD或LIB或你产品或库的具体名称。

2) 通过添加二者到<prod or lib>_LIBS变量,声明你需要链接seq和pv库。

如果你都不明白,则你可能需要学习EPICS Application Developer's Guide的第四章"Build Faciltiy

构建一个独立程序

+m编译器标记可以用于创建一个独立程序,否则需要一个IOC去启动sequencer程序。从版本2.1开始,main过程不再被硬编码。而是,代码生成器在生成的C文件末尾添加一个define和一个include语句。

#define PROG_NAME name_of_your_snl_program
#include "seqMain.c"

此处,name_of_your_snl_program是名称(标识符),其地址要被传递给seq函数。这意味着你只要在你的源目录中放置一个名为seqMain.c的文件提供你自己版本的main(EPICS构建系统通常管理源目录是在C编译器的include路径前)。

提供了一个简单的默认seqMain.c并且被安装到了这个sequencer的include目录。注意:从2.1版本起,默认的main启动一个IOC shell(iocsh);通过提供一个-S(大写s)参数能够禁止这个。为了后向兼容性接受老的-s开关,但什么也不做。

使用makeBaseApp

设置一个使用sequencer的EPICS应用程序是使用makeBaseApp.pl,你EPICS base携带的一个perl脚本。假设你在PATH中有了它,创建一个空目录,进入这个目录,并且发出这个命令:
 

ben@sarun[1]: .../tmp/test > makeBaseApp.pl -t example
Name the application(s) to be created.
Names given will have "App" appended to them.
Application names? test
ben@sarun[1]: .../tmp/test > ls -l
total 12
-rw-rw-r-- 1 ben ben  467 May 14 22:25 Makefile
drwxrwxr-x 2 ben ben 4096 May 14 22:25 configure
drwxrwxr-x 4 ben ben 4096 May 14 22:25 testApp

在testApp/src中,你将找到示例.st和.stt文件以及一个Makefile,它展示如何定义make变量,因而编译和链接所有东西正常。

剩下要做的是在configure/RELEASE(在刚才makeBaseApp.pl创建的configure目录中那个)中添加以下一行:

SNCSEQ=/path/to/your/seq/installation
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值