第三章 编译MMS-EASE 精简版

      许多嵌入式环境都需要使用一个运行在主机上的交叉编译器然后转移到目标系统执行程序。在本文章中,主机指的是应用程序编译和连接的环境,目标机指的是程序被执行的环境。

     下面的步骤都需要在主机上完成,会生成一组能够直接在目标机上执行的库文件。

      1. 编辑 glbtypes.h,把SISCO数据文件与目标机本地C数据类型对应。这个文件包含了很多例子环境的类型定义。

     2. 编辑 sysincs.h 文件,选择合适的开发环境的头文件

     3. 预览系统特殊代码,例如数据对齐,浮点格式,高分辨率定时器。

     4. 预览和跟踪堆栈组件,看后续以获得更详细的信息

    5. 修改MMS-EASE精简版生成文件以确定是能够允许在主机上执行的文件。

    6. 编译MMS-EASE 精简版,使其能够在目标机上创建程序

   7. 编辑align.cfg 以能够确认满足目标环境的要求。QNXwin32位级的例子在\mmslite\mvl\util\foundry下。如果目标系统需求不确定,编译和执行可执行文件findalgn.exe在目标环境下。

全球变量初始化

        MMS-EASE 精简版有许多全球版本,有些是在编译时初始化并可能在执行期间改变。在某些初始化的全局变量放置在代码段的环境下,可能会导致拒绝校验和验证的问题。于是,我们定义,NO_GLB_VAR_INIT,可以用在代码段里避免全局变量被初始化的问题。囚这个功能被应用,用户应用必须使用mvl_init_glb_vars在任何MVLMMS-EASE精简版的活动之前。

       Mvl_init_glb_vars

      用法:此功能用于初始化所有不能被编译器初始化的全局变量

  

     函数属性: ST_VOID Mvl_init_glb_vars(ST_VOID)

     参数: NONE

 

     返回值:ST_VOID

开发系统准备

     在MMS-EASE精简版创建之前,需要考虑以下条目

条件编译定义

     MMS-EASE 精简版是一个灵活的代码库能够创建丰富的通信模块。都是通过很多指定的特殊指令来完成。能够完成此功能的定义都在下面。特别指出,这个列表不包括用来建立特殊功能的功能。

初级一般定义

功能描述

MMS_LITE

这个定义是为了编译MMS-EASE精简版代码

这个定义通常用在标准产品生成文件

DEBUG_SISCO 

这个定义用在大部分SISCO软件编译组件的两个目的是:

1. 编译的日志报表。这显著的增加了静态字符串空间的大小,并且仅会微弱的减慢速度。SISCO建议使用此定义。

2. 实现在一定程度上的编译错误级别检查。是用DEBUG_SISCO定义的第二影响

3. 内存分配调试调用编译。用于跟踪所有分配的文件/行数

这个命令用在标准输出文件中以创作调试文件夹

NO_GLB_VAR_INIT 

这个命令使用在当目标环境不支持便是时间数据初始化的情况,在MMS-EASE出现了很多情况。这并不是定义在标准生成文件中。

S_MT_SUPPORT

这个定义是为了在多种MMS-EASE 库中支持多线程。并不定义在除windows之外的标准输出文件中。

SD_BYTE_ORDER 

这必须定义在glbtypes.h中,为每个平台来表示存储数据的字节顺序(大端或小端)。大端必须使用SD_BIG_ENDIAN。小端必须使用SD_LITTLE_ENDIAN

UNICODE_LOCAL_FORMAT

此定义选择本地格式存储UNICODE字符串。在MMS标准规范中,UNICODE字符串必须被编码成UTF8格式。这也是大多数UNIX操作系统中存储的格式。当然,一些系统中比如(windows)使用UTF16存储UNICODE字符串。ASN.1编码把unicode字符串从本地字符转化成UTF8ASN.1解码把UTF8转化成本地格式。这个转化是被这个定义所控制。一定要被定义成UNICODE_UTF8UNICODE_UTF16。目前被定义成UNICODE_UTF8除了windwos系统环境下。

高级框架初级定义

MVL_UCA 

这部分定义允许在高级框架中使用UCA.用于编译MVLU库文件使用。

MVL_AA_SUPP 

此定义允许MVL支持作为一个变量服务器的备用访问。通常被定义在mvl_defs.h中,如果用户程序不需要备用访问支持和内存规定了最小可能数据空间。

MVL_DYN_MEM 

这个定义是用来让MVL根据需要使用动态分配内存。另一种方法是,MVL将分配一组缓冲在初始化时,在程序生命周期中一直存在。一般定义在mvl_defs.h中,而且必须在使用MVL 异步响应机制的服务器端程序运行。

MVL_DYN_ASN1_TYPES

这个定义是用来让MVL从运行时类型,生成ASN.1类型。(通常作为获取值的服务器端属性)另一种方法是让ASN.1编码类型适应MVL类型控制,这可能需要更大的内存消耗,尤其对于大量数据。这通常被定义在mvl_defs.h中。

ICCP_LITE_SUPP 

这个定义通常在mvl_defs.h中通常被作为MMS-EASE 精简版的TASE.2MVL结构体的扩展。测评标示,这个定义是不利于建立一个符合ICCP标准的精简的MVL库。通常不被默认定义。

注:因类型定义数量较多,不适用于了解阶段,故暂时跳过。后续补充。

glbtypes.h 

   为了充分增加可移植性和减少命名空间的配置,SISCO使用了c数据类型的一组定义模式。例如,SISCO代码中使用ST_INT代替标准的“int”。许多的定义都是用已知的标准来选择数据类型。这些定义都可以在glbtypes.h中被找到。这个文件包含了许多操作系统和编译器的定义,但是仍然有必要添加为目标开发环境的部分,

   这个文件定义了一些基本的被MMS-EASE应用到系统中的类型,包括基本定义操作系统和硬件选择定义。一个新的portation的出发点是NEW_SYSTEM的值 SYSTEM_SEL 

   可以在两种方法选择其一。

   1. 如果代码是用来为一个小型系统生成库,仅仅编辑NEW_SYSTEM部分并 修改NEW_SYSTEM_DETECT 定义使其能够唯一标识编译器,然后审查两个定义的用法。NEW_SYSTEM定义通常被用在需要的地方,所以仅仅是需要的存在。

   2. 如果代码是用来生成多个系统库,添加这些系统到 屏蔽bit SYSTEM_SEL的区域是必须的。要做这些,只需要简单的使用下一个不用的bit位,然后分配个名字给其值,然后复制NEW_SYSTEM 部分然后修改器其满足要求。可能的修改定义如下。

SYSTEM_SEL

这是一个屏蔽bit位以配合本地使用或者选择合适的系统特定代码。特别之处在于,在ASN.1中是与浮点数转化相关的工具。

通常情况,这个可以去掉,并选择通用NEW_SYSTEM系统作为目标,除非代码用来支持多个目标,否则是不需要添加另外一个。

END_STRUCT 

这个定义通常是在所有的MMS-EASE可以潜入或附加的其他MMS-EASE数据结构后面。这通常被定义为无任何意义,但对于一些硬件和编译器组合(尤其对于64RISC系统)需要被定义为ULONG end_of 四字边界的强制对其。

UNICODE 字符移植问题

   如果默认的本地格式并不适用于你的平台,UNICODE_LOCAL_FORMAT定义需要被改变。在这种情况下,应该在包含asn1r.1定义之前,最好在glbopt.h中。在一个本地格式是UNICODE_UTF16的系统中,下面描述的功能必须被移植,已经为windows移植。

 asn1r_utf8_to_local 

 用法:在本地格式为UTF16的系统中,此功能将UTF8的字符转化成UTF16字符。目标字符串不需要以NULL字符串结束。(调用函数需要)

  

函数属性: ST_INT asn1r_utf8_to_local (ST_CHAR *dst_ptr, ST_INT dst_len, ST_CHAR *src_ptr,  ST_INT src_len); 

参数: dst_ptr, 目标UNICODE16字符串

       dst_len,目标UNICODE16字符串大小 

       src_ptr,,原UNICODE8指针

       src_len,原UNICODE8字符串的大小

 

返回值:返回目标UNICODE16字符串大小的byte数(可能包含空的终结符)

asn1r_local_to_utf8 

 用法:如果本地系统格式是UTF16,这个函数能将UTF16转化成UTF8。原字符串(src_ptr)必须为空终结符

  

函数属性:ST_INT asn1r_local_to_utf8 (ST_CHAR *dst_ptr, ST_INT dst_len,                                                                    ST_CHAR *src_ptr); 

参数: dst_ptr, 目标UNICODE8字符串

       dst_len,目标UNICODE8有意义的位数

       src_ptr,,指向UNICODE16字符串

   

返回值:返回目标UTF8字符串的byte位数(不包括空终结符)

sysincs.h 

这个文件在MMS-EASE中用来选择系统包含文件。查看 SYSTEM_SEL==NEW_SYSTEM部分确定目标编译器支持这些特殊包含的文档,按需修改。

浮点标示

ASN.1浮点处理程序需要被审查。这些功能存储在ae_float.cad_float.c中。在此指出,用户例子程序,var.c文件中,可以用来确认浮点转换是否正确——在很多情况下没有系统的具体工作需要在此处完成。IEEE 754格式的支持没有改变过。

数据对齐

MMS-EASE 设计之初就是为了能够让任何用户程序使用本地C的数据类型。因为不同的编译器平台在数据结构中有不同的填充,所以重审或者创建一个合适的数据对齐表格是很必要的。数据对其表格会在align.cfg文件中被使用,同时在代码模块mms_tdef.c中。

高解析度计时器

有些UCA组件使用高解析度计时器功能。所需的分辨率取决于用户的程序,同样的也能达到<10msde 分辨率。代码存在stime.c文件中。

内存分配

   MMS-EASE按需分配内存,使用一个叫做mem_chk的中间层。这个库使用标准malloc 调用方法执行内存分配和释放同时可以提供有效的调试帮助,如无效释放,缓存重新,使用情况跟踪。这些用法可以根据目标系统的需求按需配置。初级的分配功能是chk_malloc, chk_calloc, chk_realloc,  chk_strdup, and chk_freeMMS-EASE精简版包含了完整的和将剑的mem_chk库文件。

   MMS_EASE 把错误的内存分配看做是致命的,用户可以通过返回函数指针来判断是否成功。简单的例子程序里面演示如何使用这些功能。

日志机制

   如果可能的话,所以的开发者都会在目标程序中开发日志系统。所有SISCO组件都可以记录位变量的执行错误和调试日志。日志代码都可以被编译器使用,通过使用定义DEBUG_SISCO。被MMS-EASE精简版使用的日志记录系统被叫做“slog”,同时有两个版本被提供。完整功能的SLOG系统已经提供。这个库包含可以选择的文件、内润、用户定义的日志流。一个精简的“slog”也被包含在此。这个库的源代码以存根的形式,通过目标环境进行定制。例如,可以通过修改登录端口和一些其他机制来修改具体实施。

MVL实例应用程序演示如何使用记录子系统。请注意,这些例子使用应用程序级别的日志记录同时包含内部MMS-EASE 日志系统。

SLOG 功能汇总

   下面是S_LOG系统能够提供的功能。 

   一般记录功能

l  Printf 数据格式被接受

l  6角缓冲区被记录

l  多行信息的支持

l  信息时间戳记。选项是按日期和时间(例如,2011613日星期二15:57:32

 1995)或经过(毫秒级的分辨率)的时间可以使用。

l  S_LOG具有在一个记录文件中每个控制元素使用过多个记录控制元素。

l  包括源文件和行号调试信息

l  内存记录日志能够用于分析和高性能应用。

文件记录

l 循环文件的记录

l 动态启用和禁用文件记录系统的附带功能

l 一些能够控制的选项如下

文件名      日志文件的名称可以被指定

文件大小    文件大小可以被改变,文件的默认大小是1M

擦拭条      一组注释行表示新的记录已经开始

文件套      记录文件的数据能够被包裹是文件循环

消息标题    消息标题能够被打印出来

内存记录

    S_LOG能够实时的记录内存缓冲区以为了收集记录信息。缓冲区都可以被内存访问并能够在程序的控制下写入文件。

      

全局变量

   下面这些全局变量被MMS-EASE所使用。

      MVL_CFG_INFO *mvl_cfg_info;     关键配置参数

      ST _UCHAR *mmsl_enc_buf;        编码缓冲区

      MVL_NET_INFO mvl_calling_conn_ctrl; 正在调用的数组连接  控制结构

      MVL_NET_INFO *mvl_called_conn_ctrl; 已连接的数组  控制结构

创建MMS-EASE LITE 

由于MMS-EASE 精简版是以代码形式提供,所以第一步是创建需要的目标库。当执行正确时,这个过程会生成下列库。指出,有四种配置提供可以生成大多数库。调试版本包含额外的代码,用于记录和错误检查。此外,请注意并不是所有的都是为了支持环境所创建。

对于每个工程都有四种配置“发布没有日志” “发布有日志” “调试没有日志” “调试有日志”。这些配置都会在所有的工程配置中存在:库,例子和工具以及用来区分配置的后缀标识。

配置

调试

日志

后缀  _x 

诠释

Release/Logging 

NO

YES

“_L” mmsl_l.lib

这种配置一般支持开发程序或者部署程序。支持SISCO 日志,但是没有调试信息。

Release/No Logging 

NO

NO

“_n” mmsl_n.lib

当应用程序不需要使用SISCO记录时候,可以使用此配置。可能对PharLap开发者有用

Debug Logging 

C7 兼容

YES

“_ld” mmsl_ld.lib

MMS-EASE组件调试的情况下可以使用。同时也有用于现场诊断

Debug No Logging 

C7 兼容

NO

“_nd”  mmsl_nd.lib

在调试MMS-EASE组件不需要SISCO日志的情况下使用,可能对PharLap开发者有用。


WINDOWS 批处理生成

MMS-EASE 分布和window系统工作区有三个驱动项目。分别是 MakeLibs MakeUtils MakeSamples。这些项目创造一个空的应用程序,但是能让所有的库 工具和简单例子都被容易的创建,用于建立所有配置中的所有元素如下

  1.   Set the MakeLibs as active project 

               1.1. Select and build the Release No Logging’ configuration 

               1.2. Select and build the Release’ configuration 

               1.3. Select and build the Debug No Logging’ configuration 

               1.4. Select and build the Debug’ configuration 

         2.    Set the MakeUtils as active project 

              2.1. Select and build the Release No Logging’ configuration 

              2.2. Select and build the Release’ configuration 

              2.3. Select and build the Debug No Logging’ configuration 

              2.4. Select and build the Debug’ configuration 

          3.   Set the MakeSamples as active project 

               3.1. Select and build the Release No Logging’ configuration 

               3.2. Select and build the Release’ configuration 

               3.3. Select and build the Debug No Logging ’ configuration 

               3.4. Select and build the Debug’ configuration 

用户迁移问题

用户不得不选择不同的SISCO库用于个人的工程,由于老的名字不再使用。在widnwos下,工程已被修改成使用“dependecies” 所以库名字已经可以不再被包含在连接命令里面,用户使用此功能得到很好的评价。

WIN32 开发环境

   MMS-EASE 包含了可适用于VC6.0的工作空间和项目文件,这些文件在\mmslite\cmd\win32里面。下面的WIN32工程被包含在注要的微软开发空间中,就是mmslite.dsw。这个工程可以批处理模式或者单独,但是应该按照以下顺序。

1.    Libraries 

          2.    Utility applications 

          3.    Sample applications 

           makelibs.dsp              Makes all the libraries 

           makesamples.dsp           Makes all the samples 

           makeutils.dsp             Makes all the utilities 

           asn1.dsp                  ASN.1 encode/decode library 

           mem.dsp                   Memory allocation library - full featured version 

           meml.dsp                  Memory allocation library - Lite version 

           mlog.dsp                  MMS operation specific logging library 

           mmsl.dsp                  Main MMS encode/decode library 

           mmsle.dsp                 Extended MMS encode/decode library 

           mmslog.dsp                MMS logging library 

           mvl.dsp                   MVL library 

           mvlu.dsp                  MVL UCA library 

           ositcpe.dsp               TCP/IP (via RFC1006) stack library 

           ositcps.dsp               TCP/IP (via RFC1006) stack library using   non-blocking sockets 

           ositp4e.dsp               7 Layer OSI over Ethernet library 

           ositpxe.dsp               Library that includes TCP/IP (via RFC1006) and 7 Layer OSI over Ethernet 

           ositpxs.dsp               Library that includes TCP/IP (via RFC1006) using non-blocking sockets and 

                                     7 Layer OSI over Ethernet 

           ssec0.dsp                 Required library for compatibility with future enhancements. 

           slog.dsp                   SISCO logging library - full featured version 

           slogl.dsp                  SISCO logging library - Lite version 

GNU 开发环境

MMS-EASE 包含能够在大多数平台上都被使用的与GNU工具配套的生成文件工具。这些文件都在\mmslite\cmd\gnu。这些makefiles通常与没有任何修改的GNU MAKE或者类似的UNIK MAKE配套。一个shell脚本在mkall.sh,能够执行所有的命令以下面的顺序。

   1.    Libraries 

               2.    Utility applications 

               3.    Sample applications 

           asn1.mak                  ASN.1 encode/decode library 

client.mak               Client sample application for TCP/IP using ositcpe stack library 

cositcps0.mak            Client sample application for TCP/IP using ositcps stack library 

findalgn.mak             findalgn.exe utility application 

foundry.mak              foundry.exe utility application 

mbufcalc.mak             mbufcalc.exe utility application (obsolete) 

mem.mak                  Memory allocation library - full featured version 

meml.mak                 Memory allocation library - Lite version 

mlogl.mak                MMS operation specific logging library - Lite version 

mmsl.mak                 Main MMS encode/decode library 

mmsle.mak                Extended MMS encode/decode library 

mmslog.mak               MMS logging library 

mvl.mak                  MVL library 

mvlu.mak                 MVL UCA library 

ositcpe.mak              TCP/IP (via RFC1006) stack library 

ositcpe.mak              TCP/IP (via RFC1006) stack library 

ositcps.mak              TCP/IP (via RFC1006) stack library using non-blocking sockets 

scl_srvr.mak             IEC-61850 Server sample application using SCL 

server.mak               Sample Server application for TCP/UP using ositcpe library 

slistend.mak             TCP/IP socket listen task 

slog.mak                 SISCO logging library - full featured version 

smem.mak                 Memory allocation library using pools

sositcp0.mak             Server sample application for TCP/IP using ositcps library 

sreadd.mak               TCP/IP socket read task 

ssec0.mak                Required library for compatibility with future enhancements. 

uca_srvr.mak             IEC-61850/UCA Server sample application for TCP/IP using ositcpe lib 

uositcps0.mak            IEC-61850/UCA Server sample application for TCP/IP using ositcps lib 

util.mak                 SISCO utility library 

你可能感兴趣的:(翻译)