APP下载

基于消息分割的FlexRay应用层设计

2019-10-25

测控技术 2019年10期
关键词:时隙串口静态

(电子科技大学 电子科学技术研究院,四川 成都 611731)

FlexRay总线是为满足日益增长的车载网络通信需求而制定的下一代车载总线标准,与现行的CAN总线相比,其优势主要体现在通信速率、可靠性、安全性和灵活性4个方面。

FlexRay节点的结构符合ISO/OSI分层模型,包括第1层(物理层)、第2层(数据链路层)和第7层(应用层)[1]。其中,FlexRay标准定义了物理层和数据链路层的相关内容,物理层规定了FlexRay总线机械、电气等要求,链路层规定了帧结构、帧传输方式、时钟同步等问题[2]。对于应用层协议并没有做详细规定,只规定了通信循环的最长持续时间、每个时隙的最大有效负载等限制参数。因此,网络设计者需要根据FlexRay网络中传输的消息,配置合适的协议参数,以优化网络通信性能。

FlexRay静态时隙长度是影响FlexRay网络静态段通信性能的重要参数。目前,对静态段时隙长度配置的研究主要从消息封装优化算法的角度入手,旨在提高网络带宽利用率[3-7]。文献[3]基于消息优先级将多个消息封装进同一个静态帧中并进一步引入时隙复用机制,同一静态时隙在不同的通信周期内所传输的消息是可变的;文献[4]和文献[5]分别从不同的角度设计消息封装策略,其中,文献[4]将具有相同周期和来自相同节点的信号优先封装进同一静态帧,文献[5]则将同一个节点内编号成整数倍关系的消息封装到一个帧中。消息分割法是一种通过将负载较大的消息分割为多个子消息以优化静态段参数的FlexRay静态段消息封装策略,文献[6]将长消息分割,并将子消息填充到被分配短消息的时隙内;文献[7]将长消息分割为多个子消息在静态段传输,并进一步对消息分割的标准进行分析,得出总线负载率随消息分割大小的变化曲线。

上述研究均在理论上对FlexRay消息封装策略进行设计优化,对于算法在应用上的实现方法则鲜有论述。因此,从应用层的角度,设计了一种基于消息分割策略的FlexRay总线静态段传输实现方法,保证发送端不同长度消息的准确传输以及接收端数据的顺序性和完整性,并搭建实验平台验证设计的可行性。

1 FlexRay总线技术

FlexRay的通信是基于“通信循环”实现的。通信循环是周期性的,且持续时间相等,因此也称为通信周期。一个通信循环被依次分为静态段、动态段、符号窗口和网络空闲时间4个部分[8],如图1所示。其中,静态段的长度一般占整个通信循环的70%以上[9];动态段和符号窗口不是必须的;网络空闲时间用于时钟同步,保证通信控制器在最坏情况下,能够有足够的时间计算相位修正值和频率修正值,并能进行相位的修正。

图1 FlexRay通信周期

静态段是由静态时隙(Static Slot)组成的,所有静态时隙的持续时间相同。静态段采用全局时分多路访问型操作原理进行媒体访问控制[10],网络中各节点只在被分配给它的静态时隙内有权向总线中发送数据。为便于分配,静态时隙从1开始依次编号,记为时隙ID。每个静态时隙只属于一个节点,但每个节点可以被分配最多16个时隙。这些概念均被协议参数化,由网络设计者离线配置。

静态段消息传输时间具有可预测型,一般用于传输对实时性要求比较高的报文,同时,静态段适合基于时间触发的报文,即在一个发送时隙到来时,无论被分配到该时隙发送的报文是否被更新,都将该报文发送到总线。

在协议运行过程中,消息被封装成FlexRay数据帧在总线上传输。FlexRay帧格式如图2所示,包括头部段、负载段和尾部段3个部分。头部段包含5 bits指示位、11 bits帧ID、7 bits负载长度、11 bits头部循环冗余校验码和6 bits周期计数;负载段可包含0~254 B的数据;尾部段含有24 bits尾部循环冗余校验码。

图2 FlexRay静态帧格式及封装方式

帧ID字段指示了传输该帧的时隙,即时隙ID。有效数据负载段保存至多254个字节的有效数据,该段的长度由有效负载长度字段指定。在静态段,所有帧的有效负载长度都是固定的。尾部段是一个3 B的CRC,用于校验前面的数据域传输是否正确,它的长度是头部端的字长加上有效负载数据段的字长。

逻辑数据要在物理层进行传输,必须要借助传输保护和预防措施对其进行传输封装,以消除传输媒介的影响。FlexRay以字节为单位进行封装,如图2所示,在帧起始、帧结尾和每个字节前加上特殊符号。

2 FlexRay协议设计与软件开发

2.1 应用层设计

FlexRay协议规定,静态时隙的时间长度由总线比特率和最长数据帧决定,静态段时隙的长度至少是静态段传输最长帧所需的时间加上集群内任一控制器处理的最长时间和时间精度的持续时间以及时隙延时校正参数的最大值[11]。由此可见,在配置静态时隙长度时,起决定作用的是静态段传输的最长帧所需时间。实际网络设计中,在一个静态帧只传输一则消息的前提下,这种时隙配置方式会降低总线带宽利用率。以图3为例,静态段以帧c的长度被分为10个静态时隙,可以发现,只有c充分利用了带宽,而e对带宽资源的浪费是网络设计者和使用者都无法容忍的。

图3 静态段时隙分配方案示例

本例所示时隙分配模型参考汽车工程师协会提供的FlexRay消息基准数据,具有一定的代表性。因此,针对根据网络最长帧配置静态段协议参数的缺陷,出现了一种称为消息分割法的消息封装策略。消息分割算法的核心思想是对长消息进行拆分,平衡消息的负载长度,并以此配置合适的静态时隙长度,以达到提高FlexRay总线带宽利用率的目的。

如图4所示,对于根据消息a负载长度配置时隙参数的FlexRay静态段通信来说,消息f封装成的数据帧显然无法在一个静态时隙内传输,因此,将其按照贪心策略分割为f1~f4 4个子消息,依序在4个连续通信周期的相同时隙内传输。

FlexRay静态段通信机制可以保证消息在总线上传输的顺序性,但无法保证连续通信周期内同一时隙中的消息在空间上的连续性。因此,利用消息分割算法封装的消息,还需要在接收端对其进行拼接。一种消息提交策略是定义一个由多个连续通信周期组成的信息交互周期[11],在信息交互周期内接收到的消息,在最后一个通信周期结束时,一并提交给接收端CPU。但是该方式会使消息得到处理的时间推迟到整个信息交互周期结束,影响了FlexRay消息的实时性。由此,提出一种消息分类处理的消息分割策略实现方式,利用FlexRay静态帧负载段首字节作为标志字段,以区分未分割消息和已分割消息。该字节前4位用于指示消息是否被分割,后4位用于指示该消息是否为被分割消息的最后一个子消息。发送端根据消息长度填充分割标志字段,接收端根据标志字段决定对消息的处理方式。为未分割消息和已分割消息配置不同的接收缓冲区,对于前者,可直接提交给CPU;对于后者,在完成所有子消息的接收后,对消息负载数据进行拼接,再一并提交。通过这种二级缓冲的机制,与基于信息交互周期的消息分割策略相比,提高了未分割消息的实时性。

图4 消息分割法

2.2 协议参数配置

基于本设计,消息在封装成FlexRay帧时,会产生额外协议开销。额外协议开销的来源有两个:① 数据负载段首字节的标志字段;② 对于被分割的消息,新增的消息帧会增加额外协议开销。协议开销的增长取决于静态帧负载段长度和消息负载长度。

由表1可以发现,负载段长度增大会在一定程度上导致总线带宽利用率的下降,但是减少了消息分割所产生的新FlexRay静态帧的个数,而额外协议开销主要来源于对新数据帧的封装。同时,负载段长度过大则会使带宽利用率严重下降,失去了消息分割的意义。因此,将FlexRay静态帧负载段长度定义为16 B。

根据前文对FlexRay静态帧格式和编码方式的分析,对于负载段长度为jbits的FlexRay静态帧,其长度可以表示为[12]

表1 不同负载段长度的额外协议开销与带宽利用率

LFL(j)=TSS+FSS+80+20wj+FES

(1)

式中,TSS、FSS和FES在图2中已说明,80为帧头和帧尾编码后所占位数;wj为以字为单位的有效负载长度。由此,FlexRay静态时隙的长度可以表示为

(2)

式中,TAPO为静态时隙的动作点偏移;gdBit为传输1 bit所需时间;CID为空闲通道定界符;TMT为宏节拍持续时间。

FlexRay网络参数取表2中各值,可得静态时隙长度LST的值为112 μs。故将静态时隙长度配置为120个宏节拍,即120 μs。静态段内静态时隙个数为20个,网络空闲时间占30个宏节拍,整个通信周期持续时间为2.43 ms,小于协议规定最大通信周期长度16 ms。

表2 FlexRay网络参数

2.3 软件设计

FlexRay数据收发通过中断触发。MC9S12XF512单片机内集成FlexRay模块,提供独立的中断源。节点的每一个时隙均与片内的一个Message Buffer对应。Message Buffer是FlexRay模块中一块连续的存储区域,被抽象成存储帧的数据结构[13]。在程序初始化阶段,为被使用的MB设置类型,并为其设置一个中断服务程序。当通信循环到达指定时隙时,即FlexRay模块系统时钟运行到该时隙的动作点处,对应MB的时隙状态信息被更新,Message Buffer中断标志位被置位,触发对应中断,执行中断服务程序。

2.3.1 FlexRay通信程序设计

通信程序基于μC/OS嵌入式系统中的任务进行管理,主要包括FlexRay收发任务和数据处理任务,其中数据处理任务负责将总线数据通过串口发送到PC上。所有任务均阻塞在μC/OS任务信号量等待,等待中断服务程序发布信号量将其唤醒。

FlexRay发送任务和FlexRay接收任务共同维护一个时隙映射表,时隙映射表中元素为保存有每个时隙中待处理的消息的链表的头节点,该节点储存有链表结构信息。

typedef struct {

slotListNode_t *start;

slotListNode_t *end;

slotType type;

} listHead;

程序利用μC/OS内存管理接口开辟一块内存池。对于发送时隙,其对应链表中节点储存的是待发送的消息;对于接收时隙,节点中储存接收到的被分割的子消息。节点中的数据域指针指向一块从内存池中申请的内存块。内存块大小都是16 B,因此在待发送消息入链时就需要对其以15 B为标准进行分割。

struct slotListNode_s {

unsigned char *frMsg;

struct slotListNode_s *pNext;

};

typedef struct slotListNode_s slotListNode_t;

FlexRay发送任务从对应时隙的消息链表中取出头节点后第一个节点中的数据(如果消息链表不为空),填充分割标志位后调用Fr_transmit_data函数发送,并将该节点从消息链表中移除。

图5 发送任务流程

typedef struct {

unsigned char base[512];

unsigned char front;

unsigned char rear;

unsigned char size;

} circularBuffer;

FlexRay接收任务在被唤醒后,调用接收函数Fr_receive_data读取MB中数据。Fr_receive_data函数是FlexRay驱动函数,对该函数进行修改,添加参数uint8 *split区分接收到的数据是否是完整的一条消息。对于未被分割的消息,直接将其数据写入到待处理队列circularBuffer;对于被分割的消息,将数据暂存在该时隙对应的消息链表中,待接收到全部子消息后一并写入待处理队列。

图6 接收任务流程

数据处理任务在收到CPU发布的信号后,从待处理队列中取出消息数据交由串口发送。

2.3.2 利用XGATE协处理器管理串口发送

为了提高程序执行效率,降低系统因中断而产生的实时性问题,采用XGATE处理串口通信。XGATE是一个独立于主CPU (S12X)的可编程RISC内核,用以提高应用程序的反应速度,减少主CPU的中断负荷。XGATE由中断驱动,可以独立于CPU运行中断服务程序。XGATE与CPU之间,可以通过共享变量进行通信[14]。

用XGATE处理串口通信,XGATE与S12X CPU之间采用双缓冲机制进行通信。XGATE将buf1中数据发送到串口缓冲区后,向CPU提交中断请求;CPU中断服务程序交换缓冲区,向数据处理任务发布信号,并重新置位串口发送中断。此时,XGATE继续通过串口发送数据,CPU执行数据处理任务。数据处理任务被唤醒后,将待处理队列中的数据拷贝到buf2中。

3 实验验证

使用集成有FlexRay通信控制器的MC9S12XF512型单片机作为主控芯片,与总线收发器TJA1080组成通信节点,并搭建一个双节点简易通信网络,节点结构如图5所示,FlexRay网络结构如图6所示。

图7 FlexRay节点结构

图8 FlexRay网络结构

实验参数配置如表3所示,Node 2通过串口将FlexRay总线数据提交给PC。

表3 静态段时隙分配

经过实验,程序运行稳定,通过串口助手观察实验数据。节点1在时隙7中在3个周期内发送的长消息在节点2中成功接收并实现拼接。

4 结束语

分析了基于消息分割策略的FlexRay总线静态段消息封装方式,提出了一种基于消息分类处理的消息分割策略实现方式,在此基础上对FlexRay应用层进行设计,通过对消息分割所产生协议开销和带宽利用率进行分析,确定FlexRay静态段协议参数,并在μC/OS系统上实现了基于该设计的FlexRay通信系统。本设计在保证带宽利用率和消息传输延迟的同时,满足了不同长度消息在静态段上的可靠传输,并具有一定可扩展性。最后,利用MC9S12XF512单片机搭建FlexRay网络,实验验证程序设计可行性。

猜你喜欢

时隙串口静态
静态随机存储器在轨自检算法
浅谈AB PLC串口跟RFID传感器的通讯应用
复用段单节点失效造成业务时隙错连处理
一种高速通信系统动态时隙分配设计
时隙宽度约束下网络零售配送时隙定价研究
USB接口的多串口数据并行接收方法探索
基于蓝牙串口适配器的GPS接收机与AutoCAD的实时无线通信
机床静态及动态分析
具7μA静态电流的2A、70V SEPIC/升压型DC/DC转换器
基于TDMA的无冲突动态时隙分配算法