掌桥专利:专业的专利平台
掌桥专利
首页

一种读取通讯总线宿端口数据的调度方法

文献发布时间:2023-06-19 09:35:27


一种读取通讯总线宿端口数据的调度方法

技术领域

本发明涉及总线通讯技术领域,尤其涉及一种读取通讯总线宿端口数据的调度方法。

背景技术

目前,总线通讯技术中,通常经由板卡将处理器与总线连接在一起。而板卡与处理器的接口有很多种,大多数处理器的处理速度都慢于自身总线通讯速度。因此当宿端口周期较小,宿端口数量较大时,通常策略一般有两种:一种是整体轮询策略,将所有通讯总线宿端口定期轮询一遍,将数据获取上来。该策略存在的问题是一次轮序周期内无法获取所有数据,导致数据更新不及时;另一种是时间分类策略,首先将通讯总线宿端口按照端口周期分类,然后按照时间间隔轮询每个端口周期的数据。该策略存在的问题是当遇到各个时间分类周期的最小公倍数时间周期时,无法保证所有数据全部及时刷新,特别是应用在采用MVB总线或半双工通讯总线的分析仪、记录仪、专家系统主机、智能运维系统等设备时,需要诊断所有数据的每一个总线周期时,延迟或丢帧问题严重。

发明内容

本发明提供一种读取通讯总线宿端口数据的调度方法,以克服上述技术问题。

本发明一种读取通讯总线宿端口数据的调度方法,包括:

获取全部需要处理的端口信息,将所述端口信息按照端口周期进行分类;

设定最小值的所述端口周期作为扫描周期;计算最大值的所述端口周期相对于所述扫描周期的倍数N;

建立所述倍数N个第一时间片;依次比较全部所述端口周期与所述扫描周期的周期值;

若所述端口周期小于/等于扫描周期,将小于/等于扫描周期的所述端口周期内的所述端口信息依次分配至所述倍数N个所述第一时间片内处理;

若所述端口周期大于扫描周期,计算大于扫描周期的所述端口周期相对于扫描周期的倍数M,建立所述倍数M个第二时间片;按照M个所述第二时间片分配大于扫描周期的所述端口周期进行处理,并分配至N个所述第一时间片内处理;

按照所述扫描周期,循环读取N个所述第一时间片内的所述端口信息。

进一步地,所述的循环读取N个所述第一时间片内的所述端口信息,包括:每个第一时间片内分配的端口数量S的表达式为:

S≤1倍周期端口数+(n+1)倍周期端口数/(n+1);式中,n为1至n的常数。

进一步地,采用一级链表实现所述第一时间片的逻辑功能;采用二级链表实现所述第二时间片的逻辑功能。

进一步地,所述的建立所述倍数N个第一时间片;依次比较全部所述端口周期与所述扫描周期的周期值,包括:建立字典类型索引,按照端口周期的周期值从小到大的顺序排列所述倍数N个第一时间片;按照所述字典类型索引遍历全部所述端口周期,依次比较所述端口周期与所述扫描周期的周期值。

进一步地,所述的获取全部需要处理的端口信息,将所述端口信息按照端口周期进行分类,包括:通过初始化获取所述端口信息,所述端口信息,包括:端口地址、端口大小、端口类型、数据内容、端口周期以及上次发送时间;将所述端口信息按照所述端口周期进行分类。

本发明通过查询最小端口周期并设定为扫描周期;通过查询最大端口周期,算出最大端口周期相对于扫描周期的倍数;将最大端口周期的端口个数的值作为处理时间片,按照各个端口周期分类,将端口周期按照调度算法插入槽中,最后按照扫描周期逐一处理各个槽中的端口数据。本发明可以有效避免当各个端口处理周期达到最小公倍数时,CPU集中处理不及时,数据读取及处理速度跟不上而导致的丢包现象,从而有效提高通讯总线数据传输的可靠性与稳定性。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作以简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为一种读取通讯总线宿端口数据的调度方法的方法流程图;

图2为一种读取通讯总线宿端口数据的调度方法的逻辑图;

图3为本发明所述的第一时间片中的端口分配示意图;

图4为本发明所述的一级链表与二级链表的关系图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

如图1、图2所示,本实施例提供了一种读取通讯总线宿端口数据的调度方法,包括:

101、获取全部需要处理的端口信息;将端口信息按照周期值进行分类;

具体而言,程序初始化获取全部需要处理的端口信息,以太原某地铁线实际工程为例,系统中的宿端口为216个,源端口为1个。系统中所需的端口周期:32ms周期有10个,64ms周期宿端口有25个,128ms周期有47个,256ms周期有76个,512ms有36个,1024ms有22个。所有端口数据长度为32字节。

102、设定最小值的端口周期作为扫描周期;计算最大值的端口周期相对于扫描周期的倍数N;

具体而言,系统中所需的最小端口周期为32ms,最大端口周期为1024ms,通过计算,N=1024/32=32。

103、建立倍数N个第一时间片;依次比较全部端口周期与扫描周期的周期值;

具体而言,时间片,即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片,即该进程允许运行的时间,使各个程序从表面上看是同时进行的。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。而不会造成CPU资源浪费。在本实施例中,采用phtyon语言编写调度算法的程序,也可以通过C、C++、JAVA等其他编程语言实现。同时,采用一级链表实现所述第一时间片的逻辑功能,采用二级链表实现所述第二时间片的逻辑功能。系统动态生成倍数N个一级链表,链表长度为N=32,并将一级链表按照端口周期从小到大的顺序建立字典类型索引,字典类型索引的key为端口周期,value为同端口周期的端口信息列表。字典结构是按照端口周期分类的结果,字典的索引是端口周期,便于算法处理,提高CPU运算效率。

104、若端口周期小于/等于扫描周期,将小于/等于扫描周期的端口周期内的端口信息依次分配至倍数N个第一时间片内处理;

105、若端口周期大于扫描周期,计算大于扫描周期的端口周期相对于扫描周期的倍数M,建立倍数M个第二时间片;按照M个第二时间片分配大于扫描周期的端口周期进行处理,并分配至N个第一时间片内处理;

具体而言,根据遍历结果比较端口周期与扫描周期的大小,当端口周期小于等于扫描周期时,将这个端口周期的所有端口信息插入N个链表中的每一个元素。本实施例中,由于端口周期是32ms,因此10个32ms端口周期的宿端口和1个源端口(端口周期内部直接设定为0,最高速度)被筛选出来。筛选出来的端口信息依次插入32个一级链表的每一个元素中。端口周期内容包括:端口地址(port_address)、端口大小(port_size)、端口类型(port_type)、数据内容(message)、端口周期(period)和上次发送时间(time_pass)。

当端口周期大于扫描周期时,算出该端口周期于扫描周期的倍数,并建立该倍数的二级链表M,再将这个端口周期集中的所有端口交替均匀分配并插入到M个二级链表中。本实施例中,如图4所示,端口周期为128ms的宿端口,建立二级量表M的长度为128/32,即M=4;以128ms周期端口为例,M[0]中包含的128ms宿端口序号为单数,M[1]中包含的128ms宿端口序号为双数。循环N个一级链表,将M个二级链表中的端口元素交替均匀分配在N个1级链表中。M分配结束后,再从头开始重新分配。本实施例中,以128ms周期端口为例,N=32时,当N%4==0的时候,放入M[0]的元素内容,当N%4==1的时候,放入M[1]的元素内容。

如图3所示,每行均为32个一级链表,每列是以扫描周期32ms为公倍数的端口周期,每个一级链表的处理周期均为32ms,也就是每个一级链表的处理周期内都需要处理所有最快周期的端口;大于扫描周期的端口根据相对于扫描周期的倍数M分成M份,本端口周期处理一部分端口信息,剩下端口信息分配至接下来的处理周期内完成。如图3所示,处理周期是32ms,64ms的端口就分成2份处理,第一个一级链表内处理32ms端口周期和64ms端口周期内1-5端口的端口信息;第二个一级链表内处理32ms端口周期和64ms端口周期内6-10端口的端口信息;二级链表的功能是区分端口周期内需要处理端口。使得64ms的端口周期可以保证在64ms内完成数据刷新,32ms的周期端口也是32ms就完成了刷新,从而不会出现延时和丢帧。同理,128ms的端口周期分成4份,每32ms处理1份,累计处理4次完成;256ms的端口周期分成8份,每32ms处理1份,累计处理8次完成。依次类推。

106、按照所述扫描周期,循环读取N个所述第一时间片内的所述端口信息。

具体而言,按照扫描周期,一次循环读取N个一级链表中的每一个元素中的端口集,N个一级链表中的每个链表元素中的端口集包含端口数相对固定,总数S≤1倍周期端口数+2倍周期端口数/2+3倍周期端口数/3……n倍周期端口数/n。每个扫描周期需要处理的数量远小于各个端口之和,避免当最小公倍数周期到达时的读取丢帧现象。

本实施例中,N=32时,每个元素含有的端口数量≤10+13+12+10+3+1=49。按照SPI通讯方式,每个端口平均通讯周期500us计算,49个端口数据刷新周期为24.5ms<32ms,因此可以保证精确的不丢包数据刷新。而传统方法无论如何都会经历所有端口最小公倍数的危险时刻,该时刻到达是,全部端口刷新时间需要216*0.5=108ms,会丢失绝大部分32ms和64ms周期的数据帧,导致丢包。

本发明主要应用在MVB总线,或RS485,RS422等半双工通讯总线的宿端口数据调度。

下面通过仿真试验对采用整体轮询策略、时间分类策略以及本申请的策略所得到的数据进行对比。

SPI接口的板卡与CPU通讯速率大概是:每读取一帧需要500-800us;

端口周期的分布大体为32ms-1024ms之间的正太分布,如表1所示:

表1

当端口数量<40的时候。整体轮询策略、时间分类策略和本申请的策略的效果是一样的。

当端口数量≥100的时候(实际项目中,作为记录仪来说,读取端口一般都会超过100个)

整体轮询策略的丢帧率为100%。因为每次轮询周期都会>32ms,从而导致32ms最快的端口周期数据丢帧;

时间分类策略的丢帧率约为60%(约有60%的轮询周期,需要同时轮询端口数量>40个);

本申请的策略的丢帧率为0%(每次轮序端口个数<40个,保证完全不丢帧)。

最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

相关技术
  • 一种读取通讯总线宿端口数据的调度方法
  • 一种具有多个读取端口的路由器及其读取数据的方法
技术分类

06120112221809