鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

编译工具使用

编译工具asn1rs-cli,位于“/usr/local/ksl/bin”下。用户可以使用它来解析ASN.1脚本,并将ASN.1脚本转换为C语言代码的中间文件(包含多个源文件和头文件)。

在本章节的示例中,将展示如何使用编译工具asn1rs-cli将.asn文件转换为C语言源码文件。

获取帮助

执行以下命令获取命令相关帮助。

./asn1rs-cli --help 

输出如下回显信息。

ASN.1 Rust Compiler 1.2.0

USAGE:
    asn1rs-cli [FLAGS] [OPTIONS] --input <ASN.1 文件(列表)> --method <传输语法(aper|uper|eper|ber...)> [SUBCOMMAND]

FLAGS:
    -C, --comments        提取日志信息到抽象语法文件中
    -D, --debug           打印调试信息到文件
    -h, --help            Prints help information
    -r, --intermediate    导出中间结果到文件
    -V, --version         Prints version information

OPTIONS:
        --dump-types <csv文件路径>
            控制台输出编译出的类型列表至csv文件

    -i, --input <ASN.1 文件(列表)>
            选择一个或多个 ASN.1 文本文件,如 -i s1.asn x2.asn; 也可利用通配,如 -i *.asn

        --merge <合并后的目录名,支持指定多级目录,如a/b/c,最终输出目录在exports/a/b/c>
            合并编译,未合并情况下每个ASN.1文件将独立进行编译和输出,存在该选项则将所有输入的ASN.1文件合并生成目标文件

    -m, --method <传输语法(aper|uper|eper|ber...)>
            选择一个编解码规则,选中的编解码规则会应用到当前命令行的所有输入文件中


SUBCOMMANDS:
    cc       [核心] 将 ASN.1 文件编译为 C 代码
    cceos    [扩展] C 后端 LTE EOS 版本
    ccnr     [核心] 将 ASN.1 文件编译为 CPP 代码
    diff     [扩展] 比对ASN.1文件的版本变更是否符合要求
    help     Prints this message or the help of the given subcommand(s)
    xmlc     [核心] 将 ASN.1 文件编译为 XML 文件

子参数

该工具还有一系列子参数,例如cc子参数的帮助信息可执行以下命令查看。

./asn1rs-cli cc --help

输出如下回显信息。

asn1rs-cli-cc 
[核心] 将 ASN.1 文件编译为 C 代码

USAGE:
    asn1rs-cli --input <ASN.1 文件(列表)> --method <传输语法(aper|uper|eper|ber...)> cc [FLAGS] [OPTIONS]

FLAGS:
        --count-like-present    当 SEQUENCE OF 类型作为可选成员时,利用其 count 字段在接口中充当 present 标识
    -h, --help                  Prints help information
        --testcases             围绕已经定义的值,生成 testcase 的C文件和头文件, 依赖 --values
        --values                生成所有值的定义, 依赖 --mode full
    -V, --version               Prints version information

OPTIONS:
    -C, --cinline <需要生成内联C代码的类型列表,使用逗号隔开,由于生成代码可能非常多,不支持直接生成全部类型>
            由于指定类型被直接展开为包含编解码逻辑的C代码,生成代码时编译程序将做一定程度的优化,使用该开关可以优化指定类型的编解码性能

        --enum-as-uint <数据类型的名字(u8|u16|u32)>
            设定ENUMERATED类型的C接口为u8,u16,u32数据类型,不使用C的enum类型

    -e, --extension <扩展(rust)>
            rust-用于生成Native-Rust的头文件

        --limits <规格配置文件,用于指定C数组的规格宏>
            有关规格文件的 SCHEMA, 可以阅读 libcompiler/asn1rs-cli/examples/limits.schema.json

    -A, --long-abbrs <支持全词匹配功能的缩略表文件路径>
            样例文件可以参考 libcompiler/asn1rs-cli/examples/long-abbrs.csv

    -m, --mode <编译模式(full|noinf)>
            full-完整生成接口和表的源码; noinf-仅生成表的源码; 默认-noinf

    -p, --prefix <生成C代码符号的前缀名字>
            大小写不敏感

    -a, --short-abbrs <支持单词匹配功能的缩略表文件路径>
            样例文件可以参考 libcompiler/asn1rs-cli/examples/short-abbrs.csv

    -T, --try-compile <libcodec相对路径, 例如 ../libcodec>
            尝试编译生成代码, 目前只支持目标语言为C/C++的场景, 编译器为GCC

示例

将一个ASN.1脚本test.asn转换成BER模式的C代码文件。

  1. test.asn脚本内容如下:
    MyModule DEFINITIONS AUTOMATIC TAGS ::= BEGIN 
    
    MyType ::= SEQUENCE { 
        boolType BOOLEAN, 
        intType INTEGER(0..128), 
        enumType ENUMERATED { a, b }, 
        bitStrType BIT STRING(SIZE(0..128)), 
        octStrType OCTET STRING(SIZE(0..64)), 
        seqOfType SEQUENCE OF INTEGER, 
        choiceType CHOICE { 
            a INTEGER(0..3), 
            b BOOLEAN 
        } 
    } 
    
    END
  2. 使用asn1rs-cli命令进行转换。
    ./asn1rs-cli -i test.asn -m ber cc -m full 
    生成的代码文件位于“exports”目录。
    exports 
    └── test 
        ├── codec_index.h 
        ├── codec_interfaces.h 
        └── codec_tables.c
    • codec_index.h:定义了各个数据单元的唯一标识,在后续的编解码接口中需要使用到。
    • codec_interfaces.h:提供了抽象语法中数据描述的C程序接口。
    • codec_tables.c:定义了用于描述各个数据类型的静态变量。

    若指定了--values --testcases参数还会生成codec_testcases.h、codec_values.c、codec_values.h三个文件,用于定义和声明脚本中定义的值,并生成测试用例。