嵌入式接口通讯软件代码自动生成技术
2022-02-15赵昶宇
赵昶宇,胡 平
(1.天津津航计算技术研究所,天津300308;2.海军工程大学舰船与海洋学院,湖北 武汉430033)
随着计算机技术的飞速发展,如今的嵌入式系统的复杂程度也变得越来越高,嵌入式系统的内部接口和外部接口类型和种类也越来越丰富,对嵌入式系统的软件设计和编码人员也提出了较高的挑战。目前嵌入式系统常见的接口类型有以太网接口、RS422A接口、RS485接口、CAN总线接口、1553B接口、模拟量信号和离散量信号等。接口通讯代码程序的开发已经成为嵌入式系统软件开发中的重要方面,它所占的开发比例也越来越大。一般来讲,嵌入式系统软件中接口通讯代码是根据具体的接口通讯协议设计编制的,也就是说接口通信代码和通讯协议之间的耦合度非常高。通讯协议有细微改动,都有可能需要修改接口通讯软件代码。软件设计和编码人员需要花费相当大的精力用于维护该部分代码,这样做不仅导致嵌入式接口通讯代码的开发效率低下,也使得接口通讯代码的可靠性和可维护性大大降低。
在嵌入式系统接口通讯软件中,通常使用接口控制文档(InterfaceControlDocuments,以下简称“ICD”)来描述和维护各个接口之间的关系,ICD的最大优点是通用性强,并且独立于开发平台和任务[1]。为了解决现有接口通讯软件代码开发效率低、可靠性不高的问题,本文基于ICD特点提出一种软件代码的自动生成方法。该方法通过对ICD配置文件的读取和分析,能够自动实现并生成接口通讯软件代码的功能。后续接口通讯协议发生变化了,无需改动接口通讯代码,只需要修改ICD配置文件即可自动生成新的接口通讯软件代码,极大地提高了软件开发效率和可靠性。
1 ICD技术简介
ICD通常是一种以数据库方式的结构化树形图来进行描述,由于不同类型总线采用的通讯协议不同,或是同一种类型总线的数据帧格式不同,因此在进行ICD数据库设计时,需要根据不同的总线类型进行分别分析,包括数据帧头、数据字段、数据校验位和数据帧尾。总线类型首先应该作为ICD结构树中的单独一层节点,总线类型相同但是数据帧格式不同的也应该单独作为ICD结构树中的一层节点。
为了提高后期自动生成代码的效率,将每一个ICD结构树都保存在一个对应的数据库中[2]。每个数据库中建立一张表,表中包括建库时间、信号类型、备注信息等内容,将这张表取名为ICD_Explain。如果总线类型相同,则需要建立一张信号类型表,表中包括数据帧标识号、数据帧名称、数据频率、数据块数量、数据块内容、板卡号、通道号、接收/发送状态等,将这张表取名为ICD_BusType_Explain。对于相同总线类型中具有相同数据帧格式的报文建立一张对应的数据表,表中包括该数据帧的参数标识号、参数名称、数据帧起始位置、数据帧长度、数据帧类型、LSB、状态信息、参数最小值、参数最大值以及数据帧的步长等,将这张表取名为ICD_BusType_FrameName。
上述定义的ICD库文件包含了接口通讯软件中所有的总线接口数据规范[3],涵盖各个子系统之间、子系统内部各个设备之间以及设备内部各个模块之间的数据接口格式定义。有了这些ICD数据库文件,代码的自动生成技术可以很方便地通过对通讯协议的自动分析,实现对每个通讯接口数据的自动打包和解包处理。一旦通讯协议发生变化,无需修改软件代码,只需替换相应的ICD数据库文件即可。接口通讯软件的ICD配置文件结构如图1所示。
图1 接口通讯软件ICD配置文件结构图
2 XML模板生成、验证和解析
XML(可扩展标记语言)被设计用来传输和存储数据,它具有很强的跨平台可移植性,且存储数据基于文本不需要转换。XML模板生成格式主要采用以下规则。
XML节点具有层次化的特点。利用XML的子节点创建一颗树型结构,子节点的输出内容通常比父节点要多缩进一个Tab。
节点名称具有层次化的特点。同一父节点下的子节点之间如果名称相同,则在输出内容时的缩进是相同的;如果名称不相同,则同一父节点下名称编号大的比名称编号小的子节点在输出内容时要多缩进一个Tab。
节点内容具有层次化的特点。在节点内容中加入一个“ ”表示一个缩进,加入多少个“ ”表示输出内容时缩进多少个Tab。一个节点内容对应一行目标代码,若输出新的节点内容时需增加回车换行。
XML模板验证包括DTD(文档类型定义)和XML Schema,前者用于定义XML文档的合法构建模块,后者除了具备前者功能外,还具有良好的可扩展性。
XML解析是XML模板生成的逆向过程,它通过XML模板生成格式读取XML模板信息并生成标准格式的目标代码。
图2为ICD配置文件自动生成代码的原理图。在图2中,ICD库需要对RS-422A串口、GJB289A总线、高速总线、开关量和以太网数据进行归纳总结,找出各种信号帧数据段的规律,作为生成代码的依据;知识库和类型库提供生成不同模块代码的规则和算法以及生成代码需要的数据类型;词法分析器用于将XML模板在更新时确保数据一致性;XML模板生成、XML结构定义(XSD)模板验证和XML模板解析用于将ICD库中的信息配合知识库自动生成XML模板,并采用XSD模板对XML模板进行验证,再通过解析XML模板得到目标代码。
图2 ICD配置文件自动生成代码的原理图
驱动模型。驱动模型根据ICD库的接口描述关系,对输入ICD信息进行建模,输出代码生成机理的描述。驱动模型是平台无关模型,描述了ICD配置文件自动生成代码的机制,驱动模型的组成和原理如图3所示。
图3 驱动模型的组成和原理图
知识库和类型库。知识库用来存放代码生成的语法规则和代码映射规则,类型库用来描述代码生成过程中所有可能用到的数据类型。
词法分析器。知识库中可变代码段的XML模板设计需要用到词法分析器。可变代码段的XML模板的生成是一个动态建立的过程,XML模板所需要的部分信息由ICD配置文件确定。XML模板中会存在多个变量关联到ICD配置文件的同一个参数数据结构。在ICD配置文件更新后,利用此法分析器在XML模板所需要的内存缓冲区中搜索所有关联到该参数数据结构并全部更新,这样就可以保证XML模板的数据一致性。
XML模板生成、验证和解析。XXXX软件根据ICD配置文件、知识库、类型库和词法分析结果,并采用XmlWriter设计和生成XML模板;采用XMLSchema模板对生成的XML模板进行验证,保证XML模板的语法正确;最后,通过对XML模板进行解析,生成标准格式的目标代码。
3 接口通讯软件代码自动生成模型
接口通讯软件代码的自动生成技术包含以下几个关键技术:ICD数据库设计、驱动模型建立、知识库设计、类型库设计以及代码生成单元设计。其中,ICD数据库设计是代码自动生成的基础和依据,它将系统中的各种类型总线数据进行分析汇总,并找寻出各个数据帧的规律;驱动模型基于ICD数据库中描述的数据接口关系,对每种输入数据元素进行建模,并将ICD参数和数据块输出给代码生成单元;知识库中用于存放生成目标代码的映射规则、语法规则和算法等;类型库用于存放自动生成目标代码过程中所使用的各种数据类型;代码生成单元是自动生成代码技术的核心,它根据ICD数据库、知识库和类型库中的信息,并基于代码自动生成机理产生最终的目标代码。接口通讯软件自动生成模型如图4所示。
接口通讯软件通常由以下几部分组成:①通用代码。一般为固定代码,以基本函数的形式存在,它不会随着ICD数据库的变化而改变。②专用代码。需要根据每种数据帧进行结构体定义、打包和解包处理。③发送代码。定义执行发送数据帧相关操作的函数。④接收代码。定义执行接收数据帧相关操作的函数。
通过读取ICD数据库配置文件,并基于上述驱动模型生成各种ICD数据帧和ICD参数,提取不同总线类型的数据帧结构体,并生成相应的打包和解包函数,从而构建接口通讯软件的专用代码。在生成专用代码的同时,可以分析并构建接收代码和发送代码,通用代码可以通过知识库中的规格和算法生成,这样就输出了接口通讯软件的所有类型代码。
4 接口通讯软件代码自动生成流程
为了实现接口通讯软件代码自动生成技术的通用化,在软件设计时会为任何一个数据帧保存一个对应的配置文件。在自动生成接口通讯软件代码前,先将所有的配置文件加载到程序中,分析提取其中的数据帧到相应的结构体内,并基于知识库中的语法规格和代码映射规则生成通用代码。这样做的好处是一旦通讯协议发生变化,在修改完相应配置文件内容后,重新加载一遍配置文件即可。然后通过对不同数据帧的解析,根据该数据帧的ICD数据块和参数内容,针对每种数据帧生成相应的打包和解包函数;同时,通过对类型库中总线类型和数据类型的解析,生成不同数据帧的接收代码和发送代码。接口通讯软件代码自动生成的流程如图5所示。
图5 接口通讯软件代码自动生成流程图
针对不同总线类型的报文或是同一种总线类型但数据帧格式不同的报文,虽然它们各自有各自的通讯协议和处理函数,但是这些代码自动生成的流程是相同的。为了提高接口通讯软件的通用性和可靠性,对相同总线类型不同数据帧格式的报文采用通用的自动生成流程和处理方法,将它们各自的数据处理函数当作一个总线处理函数库,通过设计并不断优化该总线处理函数库,使得该总线类型下的所有数据帧格式的报文均能够采用上述的总线处理函数库进行数据处理,最终使得接口通讯软件的代码自动生成技术具有更广泛的适用性。
5 结束语
本文提出了一种嵌入式接口通讯软件代码的自动生成方法,进行了ICD数据库设计、驱动模型建立、知识库设计、类型库设计以及代码生成单元设计。该方法已经在某航空监控设备系统中得到了应用,大大提高了软件代码的开发效率和软件可靠性。