APP下载

FlexRay-CAN网关在火控系统中的应用

2021-03-25吕孟恩韩晓明张鹏军

自动化与仪表 2021年3期
关键词:子网缓冲区字节

吕孟恩,韩晓明,张鹏军

(中北大学 机电工程学院,太原030051)

目前武器系统通讯仍然多采用CAN 总线,随着对武器系统控制速率及精度要求的不断提高,CAN总线逐渐显现出不足,如:总线通信速率在系统中某些关键部位无法达到预期要求;传输模式过于简单等。FlexRay 总线具有高传输效率、故障可容错等特点,弥补了CAN 总线的不足,于是FlexRay 总线技术在火炮系统中得到应用。FlexRay 总线协议中数据段的长度为254 字节,而CAN 总线的数据段长度为13 字节,因此当火控系统中同时存在CAN 协议与FlexRay 协议时,若要实现两种总线的通信,首先要解决数据帧格式不统一的问题。

1 CAN 与FlexRay 帧结构介绍

CAN 总线使用串行通讯方式,支持分布式实时控制,工作方法有多主工作方式、非破坏仲裁技术和接收滤波3 种。它的数据帧分为标准帧和扩展帧,均由7 个位场组成,如图1所示[1]。

图1 CAN 2.0B 标准数据帧格式Fig.1 CAN 2.0B standard data frame format

帧起始是数据帧的起始标志,是一个显性位;仲裁场包含了11 位的识别符和远程发送请求位(RTR),节点根据标识符的值判断是否接收该报文;控制场由一个4 位的数据长度代码和2 个显性保留位组成,DLC 长度可以作为判断数据是否全部接收的依据;数据场中存放的是将要发送的数据,数据长度最高为8 个字节,最低可以为0 字节,由高位到低位依次发送;CRC 场包含CRC 序列和CRC界定符;应答场由应答间隙和应答界定符组成,应答间隙中的ACK 信号可以作为判断接收器接收到的报文是否有效的依据,若接收到的报告为 “显性”,则报文接收成功,若接收到的报告为“隐性”,则报文接收失败[2]。

FlexRay 总线作为近年发展迅速的一种事件触发类型的新型现场总线技术,其所具有的高实时性、高确定性、拥有容错性等优点使FlexRay 得到广泛应用。FlexRay 的一个通信周期由4 个部分组成,包含了静态段、动态段、特征符号窗和网络空闲时间[3],其中静态段采用时分多路的信息传输方式,动态段采用柔性时分多路复用访问方式。静态段可以划分成多个长度相同的静态时隙分配给网络中各节点,当所分配的时隙到来时该节点才能对数据进行收发。动态段则更加灵活的支持事件触发。

FlexRay 的数据帧由3 个部分组成,即帧头部分、有效数据段和帧尾部分,数据帧格式如图2所示。其中,有效数据部分最高由254 个字节组成。在CRC 校验中,有效数据部分的前6 个字节设为码距,当数据长度超过248 字节时,码距长度减小为4个字节。

图2 FlexRay 数据帧格式Fig.2 FlexRay data frame format

2 FlexRay-CAN 网关设计

FlexRay 总线协议与CAN 总线协议为两种不同的总线协议,无法直接进行数据传输。为了解决FlexRay 与CAN 的通信问题,本文设计了一种基于CAN 协议和FlexRay 协议的网关,通过转换数据结构实现信息交互调度。两种协议的对比关系如表1所示。

表1 FlexRay 协议与CAN 协议对比关系表Tab.1 Comparison of FlexRay protocol and CAN protocol

本网关通过对FlexRay 总线和CAN 总线中的数据帧进行拆分,然后再将拆分后的数据在网关中进行重组,按需求发送至FlexRay 目标节点或者CAN 目标节点,达到数据在两种总线之间传输的目的,实现总线之间的互相通信。网关系统结构框图如图3所示。

图3 网关系统结构框图Fig.3 Gateway system structure diagram

网关核心单元采用16 位微控制器MC9S12XF512,该控制器同时集成了CAN 总线单元和FlexRay 总线单元,其中FlexRay 总线驱动器选用TJA1080 芯片,该通讯控制器可以实现物理总线与FlexRay 总线之间的通讯。同时,该芯片可以让FlexRay 网络具有差分发送和差分接收的功能,单通道通讯速率可达到10 Mbps,极大地提高了系统的数据传输速率。CAN 信号收发器选用TJA1050 芯片,该芯片实现了物理总线与CAN 总线之间的通信,使CAN 总线具备了差动接收和差动发送的功能。TJA1050 将输出信号的CAN_H 与CAN_L 进行耦合,增强了信号的抗电磁干扰能力,即使周围存在较大的电磁辐射,网关仍具有优秀的差动接收能力[4]。

3 FlexRay-CAN 网关消息转发原理

CAN 总线与FlexRay 总线属于两种不同的总线协议,所以在设计两种总线子网时存在一定差别。当信号在两种网络之间的相互传输时,网关首先接收来自目标节点上的数据,然后对数据进行拆分、缓存和重装,实现格式的转换。最后,将重装之后的报文放在另一个总线网络中,面向目标节点进行传输。FlexRay-CAN 网关的软件结构主要由FlexRay信号接收中断、FlexRay 信号接收循环队列、FlexRay信号接收处理任务、CAN 信号发送循环队列、CAN信号发送任务和中断处理任务等功能组成,实现消息在不同总线协议之间的转换和传输。网关软件结构如图4所示。

图4 FlexRay-CAN 网关软件架构Fig.4 FlexRay-CAN gateway software architecture

当需要在FlexRay 子网中路由消息时,FlexRay-CAN 网关生成一个中断,中断处理子程序接收要转发的消息,并将该消息从接收缓冲区发送到FlexRay 子网的报文接收队列中,然后网关通过在FRtoCAN 网关路由表中查找需要发送的FlexRay 报文所映射的信息,将FlexRay 报文接收队列中的消息发送至CAN 子网的发送缓冲区中。由于FlexRay数据段的长度约为CAN 的19 倍,所以在将数据从FlexRay 子网传输到CAN 子网时,需要对FlexRay报文进行拆分,将其分割成CAN 子网的目标节点能够接收的报文格式,该过程采用双缓冲区结构以保证数据的完整性[5]。

当火炮系统接收FlexRay 报文时,依据FRtoCAN路由表将报文的数据复制到目标节点,流程如图5所示。

在一个通信周期的静态段发送报文时,一般用槽标号表示FlexRay 报文标号。当FlexRay 执行数据接收处理任务时,为防止信息缓存器中的内容在数据接收处理的过程中改变,首先需要将信息缓存器进行锁存,等待接收处理任务完成之后再将其释放。由于FlexRay 报文中数据量大于CAN 报文的数据量,所以将FlexRay 报文存储在双缓冲区结构中,优化CAN 报文的发送处理任务[6]。

在双缓冲区结构中,主缓冲区和从缓冲区状态的切换与所有与双缓冲区相关的CAN 报文发送都基于2 个条件:一是读操作在CAN 报文数据缓冲区的状态标志位信息,二是状态切换使能标志位在主从缓冲区的状态信息。缓冲区中的属性描述表以及索引号决定了CAN 报文的发送任务是否顺利完成。CAN 报文发送任务流程如图6所示。

图5 FlexRay 报文接收任务流程Fig.5 FlexRay message receiving task flow chart

在双缓冲区结构中,从缓冲区的写操作和主缓冲区的读操作分别只能发生在FRtoCAN 网关处于报文接收处理任务阶段和CAN 报文发送任务阶段,通过交换主从缓冲区的基地址可以实现主从缓冲区状态切换。FlexRay-CAN 网关中存在的制约条件避免了抢占式调度现象的发生。该性质避免了主从缓冲区的状态切换动作发生在资源临界区或者中断临界区中,从而极大地提高了主从缓冲区的基地址交换效率[7]。

4 FlexRay-CAN 网关数据帧调度

对于在FlexRay-CAN 网关中转发的报文主要分为2 种:一种是“上行数据”,指的是将CAN 网络中的报文发送到FlexRay 网络中;另一种是“下行数据”,指的是将FlexRay 网络中报文发送到CAN 网络中。上行数据和下行数据的转换方法基本一致,本文主要解决数据在发送时存在的数据帧不兼容和消息调度的问题。

图6 CAN 报文发送流程Fig.6 Flow chart of CAN message sending

通过对CAN 数据帧和FlexRay 数据帧的分析,决定在进行数据转换时采用多消息帧打包的方法。在数据发送之前,将CAN 网关的数据发送队列的前M 个有效数据帧进行整合,存储在FlexRay 帧的有效数据段内,使其转换成符合FlexRay 数据帧的格式。CAN 总线的消息帧包括仲裁域、控制域和数据域,数据长度最大为13 个字节,而FlexRay 的有效数据段为0~254 个字节,所以M 的取值范围应该为1≤M≤19。

对于消息调度的转发,本文采用了多队列混合优先级调度方式,如图7所示。在数据队列内部采用最早截止期优先(earliest deadline first,EDF)算法,每两个队列之间采用改进加权轮转调度(weighted roundRobin,WRR)算法。

图7 消息调度示意图Fig.7 Message scheduling diagram

CAN 子网所传输的消息中,从实时角度考虑可以分为三类:软实时消息、硬实时消息和非实时消息,依据这三类分别设置三个独立队列。对三个队列内的CAN 消息采用EDF 算法进行优先级调度排序,以满足网络中消息传输的实时性要求[8]。对于三个队列之间的调度采用WRR 算法,该算法首先给三个队列分别赋予不同的权值,然后再轮巡处理各队列之间的数据。所赋予的权值大小决定了队列消息的发送顺序。高权值会优先处理,一般将对实时性要求较高的信息存储在高权值的队列中,因此会导致高权值队列一直占用CPU,存储在低权值队列中的非实时性数据短时间内不能及时发送,增加了系统的负担,影响数据的实时性。为解决系统的实时性和公平性问题,在各队列之间采用基于阈值的动态权值改进加权轮转调度(WRR)算法。

在一个循环周期内,动态权值对队列服务的次数与权值相对应。Z1、Z2、Z3分别为硬实时队列权值、软实时队列权值和非实时队列权值,且Z1>Z2>Z3,轮转次数为i,在非实时队列的缓冲区中,非实时数据所占的比例为K,阈值M 为一个固定百分数,其值小于1。具体算法过程如下:

步骤1初始化赋予Z1=a;Z2=b,Z3=c;a>b,a、b、c 均为整数;轮转次数i=1;

步骤2按数据队列的优先级对CAN 报文进行分类,然后送入不同的队列,在队列内部按照最早截止期优先算法进行排序;

步骤3在轮巡过程中有如下规定:若i≤a,对硬实时队列的数据组包发送;若i≤b,对软实时队列的数据组包发送;若i≤c,对非实时队列的数据包发送。如果此时K≥M,则c=c+1,则返回步骤2,且i=i+1,直到i>a 时,一个完整的轮巡周期结束,此时返回步骤1。

在初始化时,从硬实时队列消息的发送优先级方面考虑,令硬实时队列的权值大于非实时队列权值和软实时队列权值,保证了硬实时队列的消息优先发送,但由此会导致某一时刻实时队列发送的消息较多,非实时队列中的消息不能及时发送,数据大量聚集,造成消息的阻塞延迟。为了改善这一状况,将非实时队列的权值设为动态权值,根据当前队列中非实时消息所占的比例,当非实时队列权值超过设定值大小时,动态权值权值大小加1。这样在保证硬实时消息的发送优先级的同时可以改善实时队列中的消息长时间占用CPU 的情况[9]。

如果三个队列中同时存在需要被处理的数据帧时,在每个队列中选取前X 个数据帧打包发送;如果数据帧数量小于X,则可以直接发送;如果某一队列中没有数据帧,则不对该队列进行任何处理,直接开始对下一个队列进行操作。

5 结语

FlexRay 总线具有数据量大、通信速率快等优点,在未来应用于火炮系统是大势所趋。本文通过分析CAN 总线与FlexRay 总线的数据帧结构,对数据帧进行拆分重组,设计了一种可以实现两者数据转换的网关,解决了两种总线的通信问题,各队列之间采用基于阈值的动态权值改进加权轮转调度算法提高了火炮系统的信号传输速率和稳定性,对提高火控系统的响应速度有着深刻意义。

猜你喜欢

子网缓冲区字节
一种简单子网划分方法及教学案例*
No.8 字节跳动将推出独立出口电商APP
No.10 “字节跳动手机”要来了?
子网划分问题研究及应用
基于网络聚类与自适应概率的数据库缓冲区替换*
简谈MC7字节码
子网划分的简易方法
关键链技术缓冲区的确定方法研究
初涉缓冲区
AVS标准中的视频码流缓冲区校验模型分析