CN112769816B - 一种电源监控高速can报文处理方法与*** - Google Patents
一种电源监控高速can报文处理方法与*** Download PDFInfo
- Publication number
- CN112769816B CN112769816B CN202110004996.3A CN202110004996A CN112769816B CN 112769816 B CN112769816 B CN 112769816B CN 202110004996 A CN202110004996 A CN 202110004996A CN 112769816 B CN112769816 B CN 112769816B
- Authority
- CN
- China
- Prior art keywords
- message
- hash table
- perfect hash
- perfect
- power supply
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L69/00—Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
- H04L69/22—Parsing or analysis of headers
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9014—Indexing; Data structures therefor; Storage structures hash tables
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L12/00—Data switching networks
- H04L12/28—Data switching networks characterised by path configuration, e.g. LAN [Local Area Networks] or WAN [Wide Area Networks]
- H04L12/40—Bus networks
- H04L12/40006—Architecture of a communication node
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L12/00—Data switching networks
- H04L12/28—Data switching networks characterised by path configuration, e.g. LAN [Local Area Networks] or WAN [Wide Area Networks]
- H04L12/40—Bus networks
- H04L2012/40208—Bus networks characterized by the use of a particular bus standard
- H04L2012/40215—Controller Area Network CAN
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Signal Processing (AREA)
- Computer Networks & Wireless Communication (AREA)
- Computational Linguistics (AREA)
- Computer Security & Cryptography (AREA)
- Software Systems (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明公开了一种电源监控高速CAN报文处理方法与***,构建完美哈希表用于缓存CAN报文,使每个哈希表行对应一个报文ID,同时在完美哈希表中为每个ID的CAN报文指定对应的解析函数入口;电源监控接收到CAN报文后,根据报文ID定位该CAN报文在完美哈希表中的位置,进而将该CAN报文缓存到完美哈希表中相应的位置;在本轮报文接收完毕后遍历完美哈希表,根据报文ID依次调用对应的解析函数,完成完美哈希表中每个CAN报文的解析处理。本方案解决了大量报文冲击时的报文接收与缓存问题,同时解决了报文解析时分支结构过多的问题,提高报文解析处理能力。
Description
技术领域
本发明属于CAN通信技术领域,更具体地,涉及一种电源监控高速CAN报文处理方法与***。
背景技术
控制器局域网(Controller Area Network,简写为CAN)属于现场总线的范畴,是一种有效支持分布式控制***的串行通信网络,也是20世纪80年代专门为汽车行业开发的一种串行通信总线。由于其高性能、高可靠性以及独特的设计而越来越受到人们的重视,目前已被广泛应用于汽车业、航空业、工业控制、安全防护等领域。
电源***是将高压交流电或高压直流电转换为低压直流电,供通信设备运转使用的设备。电源***通常由电源监控和多个整流模块组成,电源监控用来监控整个电源的运行情况,需要控制调节整个电源***,同时上报***的各种环境参数、性能、状态、告警等数据;整流模块用来将高压交流电或高压直流电转换为低压直流电,通常是将220V交流电转换为48V直流电,或者将220V直流电转换为48V直流电。
电源监控和整流模块之间通过CAN总线进行通信,即,在CAN基础帧结构的定义中加入用户的协议形成应用层的CAN报文,根据CAN报文ID的不同定义指定不同报文的含义和格式,以供应用层进行有效通信。如图1所示,对于电源***来说,通常使用一个电源监控来管理多个整流模块,最多可能有几十个整流模块,其中电源监控为请求节点,整流模块为应答节点,图中以n表示整流模块数量。由于电源监控使用广播命令查询,导致多个整流模块同时返回多条报文给电源监控,CAN总线带宽1M的情况下,电源监控会在短时间内(通常为几毫秒内)接收到大量报文。如果电源监控的报文接收能力不足,就容易形成大量报文冲击,造成报文丢失。
目前,电源监控主要通过以下手段进行CAN报文处理:
1)接收一条,保存一条,解析一条。由于解析报文通常需要比较多的时间,当需要在短时间内接收大量报文时,无法及时完成所有报文的接收、解析过程,从而产生丢包现象。
2)使用一个接收队列用于缓存报文,解析进程从接收队列取出报文逐一解析。该方法能解决瞬间接收大量报文的问题,但需要预设较大队列,队列占用空间较大,接收队列满时也会有丢包现象。
3)使用分支结构进行报文解析,根据报文ID分别处理每一条CAN报文;具体地,如果报文ID是1,则根据ID找到报文1的解析函数并执行;如果报文ID是2,则根据ID找到报文2的解析函数并执行,以此类推。当需要解析处理的报文ID非常多的时候,分支结构就变得非常庞大臃肿、执行效率较低,报文解析需要更多的时间。
基于上述三种方法存在的缺陷,本方案需要解决的问题主要有两方面:一方面是解决大量报文冲击时的接收和缓存问题,另一方面是解决报文解析时分支结构过多的问题。综合来看,也就是电源监控存在大量报文冲击时,如何及时进行报文接收、缓存以及解析处理,保证不丢失报文。
发明内容
针对现有技术的以上缺陷或改进需求,本发明提供了一种电源监控高速CAN报文处理方案,其目的在于提高电源监控的报文处理能力,避免丢包,由此解决传统方案中大量报文冲击时电源监控无法及时进行报文接收、缓存以及解析的技术问题。
为实现上述目的,按照本发明的一个方面,提供了一种电源监控高速CAN报文处理方法,包括:
构建完美哈希表用于缓存CAN报文,使每个哈希表行对应一个报文ID,同时在完美哈希表中为每个ID的CAN报文指定对应的解析函数入口;
电源监控接收到CAN报文后,根据报文ID定位该CAN报文在完美哈希表中的位置,进而将该CAN报文缓存到完美哈希表中相应的位置;
在本轮报文接收完毕后遍历完美哈希表,根据报文ID依次调用对应的解析函数,完成完美哈希表中每个CAN报文的解析处理。
优选地,所述构建完美哈希表用于缓存CAN报文,使每个哈希表行对应一个报文ID,同时在完美哈希表中为每个ID的CAN报文制定对应的解析函数入口,具体为:
基于报文ID为每一个需要接收的CAN报文创建一个哈希表行,并在每个哈希表行中为对应的报文ID分配数据域;
为每个报文ID创建一个解析函数,并将解析函数入口地址填入对应的哈希表行中;
通过映射数组的形式建立报文ID与哈希码之间的映射关系。
优选地,所述通过映射数组的形式建立报文ID与哈希码之间的映射关系,具体为:
取报文ID的低m位作为参考对象,建立报文ID的低m位与哈希码之间的映射关系,形成映射数组。
优选地,所述电源监控接收到CAN报文后,根据报文ID定位该CAN报文在完美哈希表中的位置,进而将该CAN报文缓存到完美哈希表中相应的位置,具体为:
电源监控每接收到一条CAN报文后,读取报文ID;
基于报文ID,通过映射数组获取对应的哈希码;
根据哈希码,定位CAN报文在完美哈希表中的缓存位置;
将CAN报文的报文ID和数据域复制到完美哈希表中相应的位置。
优选地,所述电源监控通过中断接收报文,每接收到一条CAN报文便产生一个中断,并在中断中完成报文的读取和缓存。
优选地,所述遍历完美哈希表,根据报文ID依次调用对应的解析函数,完成完美哈希表中每个CAN报文的解析处理,具体为:
将哈希码i的取值初始化为0;
判断当前的哈希码i是否小于完美哈希表的总行数N;
如果是,则调用完美哈希表中第i行的解析函数解析该行的CAN报文,并将哈希码i的取值加1,继续判断当前的哈希码i是否小于N,直至当前的哈希码i等于N时停止遍历。
优选地,在所述完成完美哈希表中每个CAN报文的解析处理之后,所述方法还包括:
电源监控发出广播查询命令,以便查询各整流模块的信息;
延时预设时间等待下一轮报文接收完毕后,继续遍历完美哈希表,根据报文ID依次调用对应的解析函数,完成当前完美哈希表中每个CAN报文的解析处理。
优选地,所述预设时间的取值范围为1s~5s。
按照本发明的另一方面,提供了一种电源监控高速CAN报文处理***,包括电源监控和多个整流模块,所述电源监控和所述多个整流模块之间通过CAN总线进行通信;
所述电源监控中设有完美哈希表、信息轮询模块和CAN接收中断模块;
所述完美哈希表用于保存CAN报文,使每个哈希表行对应一个报文ID,并为每个ID的CAN报文指定对应的解析函数入口;
所述信息轮询模块用于向所述多个整流模块发出广播查询命令,以便查询各整流模块的信息;以及遍历完美哈希表,根据报文ID依次调用对应的解析函数,完成完美哈希表中每个CAN报文的解析处理;
所述CAN接收中断模块用于接收所述多个整流模块返回的CAN报文,并根据报文ID定位该CAN报文在完美哈希表中的位置,进而将该CAN报文缓存到完美哈希表中相应的位置。
优选地,所述电源监控中还设有CAN模块,所述CAN模块用于将所述信息轮询模块发出的广播查询命令通过CAN总线发送给所述多个整流模块,并将所述多个整流模块返回的CAN报文接收保存到寄存器,并触发所述CAN接收中断模块的调用。
总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有如下有益效果:本发明提供的电源监控高速CAN报文处理方案中,创建一个完美哈希表来缓存报文,接收到CAN报文后直接根据报文ID即可定位在哈希表中的位置,然后将CAN报文缓存至哈希表中相应位置,解决了大量报文冲击时的报文接收与缓存问题;另外采用先缓存后解析的方法,并使用策略模式在完美哈希表中为每一条报文制定解析函数的入口,通过对哈希表进行遍历可依次调用对应解析函数对每个报文进行解析处理,解决了报文解析时分支结构过多的问题,提高报文解析处理能力。
附图说明
图1是本发明实施例提供的一种电源监控与整流模块之间的CAN通信模型示意图;
图2是本发明实施例提供的一种电源监控高速CAN报文处理方法的流程示意图;
图3是本发明实施例提供的一种完美哈希表的结构示意图;
图4是本发明实施例提供的一种完美哈希表中报文ID与哈希码的映射示意图;
图5是本发明实施例提供的一种先解析后查询的执行策略示意图;
图6是本发明实施例提供的一种电源监控轮询整理模块以及报文接收处理的时序图;
图7是本发明实施例提供的一种电源监控高速CAN报文处理***结构示意图;
图8是本发明实施例提供的一种信息轮询模块的轮询任务处理流程图;
图9是本发明实施例提供的一种CAN接收中断模块接收处理报文的流程图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
实施例1
为解决传统方案中大量报文冲击时电源监控无法及时进行报文接收、缓存以及解析的技术问题,本发明实施例提供了一种电源监控高速CAN报文处理方法,如图2所示,主要包括以下步骤:
步骤10,构建完美哈希表用于缓存CAN报文,使每个哈希表行对应一个报文ID,同时在完美哈希表中为每个报文ID的CAN报文指定对应的解析函数入口。
本发明主要解决的就是大量报文冲击的丢包问题,因此需要使用一个能够快速访问的数据结构来缓存报文。完美哈希表又称为理想哈希表,是指没有哈希码冲突的哈希表,即每个哈希码都是唯一的;完美哈希表的访问时间复杂度是O(1),即无论哈希表多大、有多少种报文、要保存的报文在哈希表的什么位置,访问需要的时间都是不变的,并且是一个很小的常量,类似于访问整型数组某个指定下标的元素,因此满足快速访问的需求。在本发明实施例中,电源监控需要接收的CAN报文的报文ID类型是明确的,报文ID数量是有限的,每个报文ID可以映射到一个唯一的哈希码(即哈希下标),符合创建完美哈希表的条件,因此电源监控可以通过构建完美哈希表来进行报文的缓存。
需要说明的是,报文ID标识的是一类报文而不是具体某条报文,报文ID可以标识多种信息,比如协议版本、设备地址、报文类型等;此处哈希表中的报文ID主要截取了其中的设备地址和报文类型,用来区分不同的设备和不同的信息类型。其中,哈希表的每行包括报文ID、数据域以及解析函数的指针,具体构建过程如下:
1)***初始化时,基于报文ID为每一个需要接收的CAN报文创建一个哈希表行,并在每个哈希表行中为对应的报文ID分配数据域。其中,构建完美哈希表的目的是为了保存CAN报文,以CAN报文为单位,每条报文是一个对象,因此完美哈希表的每一行用来代表一种报文,而报文的唯一身份标识是就是报文ID,如图3中的x、y、z等,因此实际上也就是为每个报文ID创建一个哈希表行,并为其分配数据域。
2)***设计时为每个报文ID创建一个解析函数,***初始化时将解析函数入口地址填入对应的哈希表行中。
为解决报文解析时分支结构过多的问题,本发明使用策略模式,策略模式是设计模式中的一种,设计模式通常应用于面向对象编程中,C语言虽然不是面向对象的编程语言,但也可以模仿策略模式的实现思路:在一个结构体中声明一个函数指针,用于指定一个结构体变量的策略函数(即文中的解析函数);当需要对报文结构体进行解析处理时,通过结构体内的策略函数指针,就可以调用相应的策略函数。这样做的好处就是,当需要处理一个结构体变量数组时,可以使用一个循环依次调用所有结构体变量的策略函数,完成所有报文结构体的解析。鉴于上述原理,本发明使用策略模式,在哈希表中为每一条报文指定一个解析函数入口,即,将解析函数入口地址(也称为函数指针)填入对应的哈希表行中,如图3中的解析函数x、解析函数y、解析函数z等,以便后续通过函数调用来解析报文。
3)***初始化时通过映射数组的形式建立报文ID与哈希码之间的映射关系。
使用哈希表就需要有哈希函数,将报文ID唯一地映射到哈希下标,即哈希码。由于在本发明的场景中,完美哈希表是静态的,在***构建时已经明确,运行过程中哈希表没有元素的增加和删除,因此可以使用一个“映射数组”,在***初始化时记录每一个报文ID对应的哈希码,则在***运行过程中就可以直接通过报文ID得到哈希码了。参考图4,如映射数组声明为short id_to_hash_code[256];初始化时遍历完美哈希表的报文ID,报文ID作为映射数组的下标,哈希码作为映射数组相应位置的值,则初始化时将执行,例如:id_to_hash_code[11]=0;id_to_hash_code[35]=1;......id_to_hash_code[z]=n,从而建立报文ID与哈希码之间的映射关系。
其中,映射数组长度要求大于等于最大的报文ID,因此通常取报文ID的低m位作为参考对象,建立报文ID的低m位与哈希码之间的映射关系,形成映射数组。例如,通常可取报文ID低8位(即m=8)作为参考对象,建立报文ID的低8位与哈希码的映射关系,形成映射数组,这样映射数组大小为0XFF。使用映射数组来形成报文ID和哈希码的映射关系后,有多少种报文ID,哈希表便只需要多少行,不需要以冗余的方式根据最大的报文ID来实现哈希表,节约了***内存。
步骤20,电源监控接收到CAN报文后,根据报文ID定位该CAN报文在完美哈希表中的位置,进而将该CAN报文缓存到完美哈希表中相应的位置。
参考图1可知,电源监控发出广播查询命令后,会在短时间接收到多个整流模块返回的大量CAN报文,从而来查询各整流模块的性能、状态、告警等信息。其中,本发明中配置CAN报文接收方式为中断接收方式,则所述电源监控通过中断接收报文,每接收到一条CAN报文便产生一个中断,并在中断中完成报文的读取和缓存,即步骤20是在中断中完成的。具体过程如下:电源监控每次通过中断接收到一条CAN报文后读取报文ID;然后基于报文ID,通过映射数组获取对应的哈希码;进一步根据哈希码,定位CAN报文在完美哈希表中的缓存位置;最后将CAN报文的报文ID和数据域复制到完美哈希表中相应的位置,完成CAN报文到完美哈希表的缓存。
以图4为例,当接收到报文ID为11时,通过取映射数组相应位置id_to_hash_code[11],得知id_to_hash_code[11]=0即可取出哈希码0,因此将CAN报文缓存到完美哈希表的第0行;当接收到报文ID为35时,通过取映射数组相应位置id_to_hash_code[35],得知id_to_hash_code[35]=1,即可取出哈希码1,因此将CAN报文缓存到完美哈希表的第1行;以此类推,即可将接收到的所有CAN报文缓存到完美哈希表中。由于使用了完美哈希表缓存报文,而完美哈希表的访问时间复杂度是O(1),因此,无论需要接收的报文种类有多少,所有报文的接收缓存的处理时间是一个很小的常量,可以在接收到CAN报文时快速在哈希表中定位缓存地址,并将CAN报文写入对应缓存空间,从而能够实现快速访问,解决大量报文冲击的丢包问题。
步骤30,在本轮报文接收完毕后遍历完美哈希表,根据报文ID依次调用对应的解析函数,完成完美哈希表中每个CAN报文的解析处理。
由于本发明使用策略模式,在哈希表中已经预先为每一条报文指定了一个策略函数入口,因此解析时通过遍历完美哈希表,依次调用完美哈希表中的每个策略函数,即可完成所有报文的解析,去掉了解析报文的分支结构。策略函数的特征是,函数原型一样,但函数内部的逻辑不一样,从而可以实现使用统一的调用形式,完成对不同报文的解析。
为了在大量报文冲击时能够把所有报文接收下来,必须先抛开解析操作,专注于接收;等一轮报文接收完毕,再统一对报文进行解析。因为在广播查询的情况下,电源监控通常1秒或几秒钟向整流模块查询一次,而数据报文可能在几毫秒内集中返回。因此,接收报文的时间只有几毫秒,而解析报文的时间却有一秒以上,通过将报文接收和耗时的解析分开处理,可以避免解析流程影响接收,确保接收到返回的所有报文。
基于上述原理,本发明采用“先缓存后解析”的策略,在本轮报文接收完毕后,使用一个循环即可完成如图3所示的哈希表中的所有报文解析。具体的遍历解析过程如下:首先,将哈希码i的取值初始化为0;然后,判断当前的哈希码i是否小于完美哈希表的总行数N;如果是,则调用完美哈希表中第i行的解析函数解析该行的CAN报文,并将哈希码i的取值加1,继续判断当前的哈希码i是否小于N,如此循环判断执行,直至当前的哈希码i等于N时停止遍历。其中,对应使用的循环语句如下:
for(i=0;i<N;i++)
{
hash_table[i].handler(data);
}
进一步地,在传统方案中,通常是使用“先查询后解析”的策略,即电源监控发出广播查询命令后,对接收到的CAN报文进行报文解析,但这样做无法确保应答报文是否全部返回就已经开始解析,而且也无法在报文解析完成后马上开始新的查询。为此,在优选的实施例中,本发明使用“先解析后查询”的策略,确切地说是“先解析后查询,延时等待,再解析,再查询”的循环处理流程,如图5所示。具体如下:
在步骤30之后,即完成本轮完美哈希表中每个CAN报文的解析处理之后,所述方法还包括:电源监控发出广播查询命令,以便查询各整流模块的性能、状态、告警等信息;然后延时预设时间等待下一轮报文接收完毕后,再继续遍历完美哈希表,根据报文ID依次调用对应的解析函数,完成当前完美哈希表中每个CAN报文(即下一轮缓存的所有报文)的解析处理;其中,所述预设时间的取值范围为1s~5s,图5中是以预设时间取值1s为例。
因为报文的接收和缓存是在中断中实现的,因此查询后经过一定延时再解析是有必要的,相当于在这个预设时间内要完成本次查询的报文接收和缓存,即完成步骤20。虽然正常情况下报文在几毫秒内全部返回,但是为了***的健壮性和扩展性,配合查询周期的时长,延时1秒或几秒或再解析,可确保应答报文已经全部返回;解析后则无需延时,马上进行下一轮查询即可,这样做可提高查询效率,减少不必要的延时等待。
需要说明的是,使用“先解析后查询”的策略时,***初始化后的第一轮解析实际上是没有意义的,这是因为:先执行解析再执行查询,实际上每次解析的是上一轮查询的结果;又由于***刚上电时并未进行过查询操作就先执行解析了,此时完美哈希表中没有缓存正常的报文,因此解析没有什么实质意义,只是一个执行流程。
基于本发明实施例中“先缓存后解析、先解析后查询”的策略,电源监控轮询整理模块以及报文接收处理的时序图可参考图6,电源监控每隔1秒或几秒钟需要查询一次整流模块的各种信息,如整流模块的输出电压、电流、功率、温度等。电源监控发出广播查询命令后,会进行预设时间的延时,在这段延时时间内,电源监控可完成中断接收报文以及报文缓存;其中,中断接收报文的时间为毫秒级,接收并缓存报文后,通常还存在一定的空闲时间。延时到期后,确保所有的应答报文已全部返回被接收,因此可统一对哈希表中的CAN报文进行报文解析,这就实现了报文接收与解析分离;其中,报文解析时间为毫秒级。解析结束后,可马上发出广播查询命令,继续进行下一轮的查询。
综上所述,本发明实施例提供的报文处理方法不仅解决了大量报文冲击时的接收和缓存问题,还解决了报文解析时分支结构过多问题。其中:
解决大量报文冲击时的接收和缓存问题主要基于:一是使用完美哈希表来缓存CAN报文,访问时间复杂度是O(1),无论哈希表多大、有多少种报文,都能够实现快访问;二是使用“先缓存后解析”的策略,将报文接收和报文解析分开处理,先快速接收缓存报文,再统一进行解析,可以避免解析流程影响接收,提高电源监控的报文接收能力;三是使用“先解析后查询”的策略,既留有足够的时间确保报文全部返回,又能在解析完成后马上开始新的查询。通过上述方法,解决了电源监控广播查询整流模块信息时,由于瞬间大量CAN报文的冲击而无法及时接收和解析的问题,避免了丢包现象。另外,创建哈希表时,使用一个“映射数组”保存从报文ID到哈希码的映射关系,高效又省内存。
解决报文解析时分支结构过多的问题主要基于:使用策略模式,在缓存哈希表中预先为每一条报文制定一个策略函数入口,待接收到本轮所有的应答报文后,通过一个循环遍历哈希表,即可依次调用哈希表中的策略函数,完成所有报文的解析。通过策略模式,去掉了传统报文解析处理的分支结构,代码更简洁,可扩展性更好。
实施例2
为解决传统方案中大量报文冲击时电源监控无法及时进行报文接收、缓存以及解析的技术问题,本发明实施例提供了一种电源监控高速CAN报文处理***,用于实现上述实施例1中的报文处理方法。
如图7所示,本发明实施例提供的报文处理***主要包括一个电源监控和多个整流模块(即图中整理模块1到整理模块n),所述电源监控与所述多个整流模块之间通过CAN总线进行通信。其中,所述电源监控可下发广播查询命令给所述多个整流模块,所有的整流模块会立即返回数据帧报文,使得所述电源监控在短时间内即可接收到大量报文。
所述电源监控中设有完美哈希表、信息轮询模块和CAN接收中断模块,这也是所述电源监控的内部程序CAN处理相关的主要模块。其中:
所述完美哈希表用于保存CAN报文,使每个哈希表行对应一个报文ID,并为每个ID的CAN报文指定对应的解析函数入口。在完美哈希表中,每个哈希表行包括报文ID、对应的数据域以及解析函数的指针,且报文ID通过映射数组的形式唯一映射到哈希码,如图3、图4和图7所示。其中,完美哈希表的具体构建过程可参考实施例1中步骤10的相关介绍,在此不做赘述。
所述信息轮询模块一方面用于向所述多个整流模块发出广播查询命令,以便查询各整流模块的信息;另一方面用于遍历完美哈希表,根据报文ID依次调用对应的解析函数,完成完美哈希表中每个CAN报文的解析处理。其中,所述信息轮询模块采用“先解析后查询”的执行方式,解析完成后发出广播查询命令,而每次发出广播查询命令后,延时预设时间后再继续遍历哈希表进行下一轮的报文解析。
所述CAN接收中断模块用于报文接收和缓存,具体为:接收所述多个整流模块返回的CAN报文,并根据报文ID定位该CAN报文在完美哈希表中的位置,进而将该CAN报文缓存到完美哈希表中相应的位置。
继续参考图7,所述电源监控中还设有CAN模块,所述CAN模块用于将所述信息轮询模块发出的广播查询命令通过CAN总线发送给所述多个整流模块,并将所述多个整流模块返回的CAN报文接收保存到寄存器,并触发所述CAN接收中断模块的调用。其中,所述CAN模块又包括单片机上的CAN控制器和单片机外的CAN收发器,所述CAN控制器上又设有寄存器,所述CAN模块通过所述CAN收发器、CAN控制器接收到各整流模块返回的CAN报文,并将报文ID暂存在所述寄存器上。
下面结合附图,进一步对所述信息轮询模块和所述CAN接收中断模块的功能实现进行具体描述。
如图8所示,所述信息轮询模块主要按图示流程执行以下操作:
1)***初始化,构建完美哈希表。哈希表的每行为一个对象,其中包含报文ID、数据域、解析函数的指针;初始化时为每一个需要接收的CAN报文ID创建一个哈希表行,并为其分配数据域和解析函数指针;同时建立报文ID与哈希表下标的映射关系,形成“映射数组”。其中,具体构建过程可参考实施例1中步骤10的相关介绍,在此不做赘述。
2)开始解析报文,即遍历哈希表,根据报文ID依次调用各个报文的解析函数,完成所有报文的解析。由于使用“先解析后查询”的策略,每次解析的实际上是上一轮查询的结果;而***刚上电时并未进行过查询操作就先执行解析了,此时完美哈希表中没有缓存正常的报文,因此***初始化后的第一轮解析实际上是没有意义的,只是一个执行流程。遍历解析过程参考图8:先将哈希码i的取值初始化为0;然后判断当前的哈希码i是否小于完美哈希表的总行数N;如果是,则调用完美哈希表中第i行的解析函数解析该行的CAN报文,并将哈希码i的取值加1,继续判断当前的哈希码i是否小于N,如此循环判断执行,直至当前的哈希码i等于N时停止遍历。
3)当遍历解析完成后,即判断当前的哈希码i是否小于完美哈希表的总行数N时发现判断结果为否时,发出广播查询命令,以便查询整流模块的性能、状态、告警等信息。
4)延时等待预设时间,例如1s,然后重复执行上述步骤2)-步骤4)。
其中,这里的实现使用了隐含的处理技巧,信息轮询任务只负责发出广播查询命令,在预设时间的延时等待后,遍历哈希表调用解析函数来实现对各个报文的解析,这样就实现了“报文接收与解析分离”,“先解析后查询,再延时,再解析”的循环处理流程。因为报文的接收和缓存是在中断中实现的,虽然正常情况下报文在几毫秒内全部返回,但是为了***的健壮性和扩展性,配合查询周期的时长,经过一定的延时后再解析是有必要的,可确保所有报文全部返回,然后再马上进行下一轮查询。
所述CAN接收中断模块每接收到一条报文,便会产生一个中断,并在中断中完成报文的读取和缓存。如图9所示,每接收一条报文,报文接收中断主要按图示流程执行以下操作:
1)进入CAN报文接收中断;
2)从CAN模块的寄存器中读取报文ID;
3)取报文ID中特定m位,通过“映射数组”基于报文ID获取哈希码;
4)根据哈希码,定位报文在完美哈希表中的缓存位置;
5)将报文ID和数据域复制到完美哈希表相应位置。至此,完成CAN报文的接收和缓存。
本发明实施例提供的报文处理***中,电源监控使用完美哈希表来缓存CAN报文,并使用“先缓存后解析”的策略,将报文接收和报文解析分开处理,使用“先解析后查询”的策略,留有足够的时间确保报文全部返回,解决了电源监控广播查询整流模块信息时,由于瞬间大量CAN报文的冲击而无法及时接收和解析的问题,避免了丢包现象。另外,使用策略模式在缓存哈希表中预先为每一条报文制定一个策略函数入口,待接收到本轮所有的应答报文后,通过一个循环遍历哈希表,即可依次调用哈希表中的策略函数,完成所有报文的解析,还解决了报文解析时分支结构过多问题。
本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种电源监控高速CAN报文处理方法,其特征在于,包括:
构建完美哈希表用于缓存CAN报文,使每个哈希表行对应一个报文ID,同时在完美哈希表中为每个ID的CAN报文指定对应的解析函数入口;
电源监控接收到CAN报文后,根据报文ID定位该CAN报文在完美哈希表中的位置,进而将该CAN报文缓存到完美哈希表中相应的位置;
在本轮报文接收完毕后遍历完美哈希表,根据报文ID依次调用对应的解析函数,完成完美哈希表中每个CAN报文的解析处理。
2.如权利要求1所述的电源监控高速CAN报文处理方法,其特征在于,所述构建完美哈希表用于缓存CAN报文,使每个哈希表行对应一个报文ID,同时在完美哈希表中为每个ID的CAN报文制定对应的解析函数入口,具体为:
基于报文ID为每一个需要接收的CAN报文创建一个哈希表行,并在每个哈希表行中为对应的报文ID分配数据域;
为每个报文ID创建一个解析函数,并将解析函数入口地址填入对应的哈希表行中;
通过映射数组的形式建立报文ID与哈希码之间的映射关系。
3.如权利要求2所述的电源监控高速CAN报文处理方法,其特征在于,所述通过映射数组的形式建立报文ID与哈希码之间的映射关系,具体为:
取报文ID的低m位作为参考对象,建立报文ID的低m位与哈希码之间的映射关系,形成映射数组。
4.如权利要求2所述的电源监控高速CAN报文处理方法,其特征在于,所述电源监控接收到CAN报文后,根据报文ID定位该CAN报文在完美哈希表中的位置,进而将该CAN报文缓存到完美哈希表中相应的位置,具体为:
电源监控每接收到一条CAN报文后,读取报文ID;
基于报文ID,通过映射数组获取对应的哈希码;
根据哈希码,定位CAN报文在完美哈希表中的缓存位置;
将CAN报文的报文ID和数据域复制到完美哈希表中相应的位置。
5.如权利要求4所述的电源监控高速CAN报文处理方法,其特征在于,所述电源监控通过中断接收报文,每接收到一条CAN报文便产生一个中断,并在中断中完成报文的读取和缓存。
6.如权利要求2所述的电源监控高速CAN报文处理方法,其特征在于,所述遍历完美哈希表,根据报文ID依次调用对应的解析函数,完成完美哈希表中每个CAN报文的解析处理,具体为:
将哈希码i的取值初始化为0;
判断当前的哈希码i是否小于完美哈希表的总行数N;
如果是,则调用完美哈希表中第i行的解析函数解析该行的CAN报文,并将哈希码i的取值加1,继续判断当前的哈希码i是否小于N,直至当前的哈希码i等于N时停止遍历。
7.如权利要求1-6任一所述的电源监控高速CAN报文处理方法,其特征在于,在所述完成完美哈希表中每个CAN报文的解析处理之后,所述方法还包括:
电源监控发出广播查询命令,以便查询各整流模块的信息;
延时预设时间等待下一轮报文接收完毕后,继续遍历完美哈希表,根据报文ID依次调用对应的解析函数,完成当前完美哈希表中每个CAN报文的解析处理。
8.如权利要求7所述的电源监控高速CAN报文处理方法,其特征在于,所述预设时间的取值范围为1s~5s。
9.一种电源监控高速CAN报文处理***,其特征在于,包括电源监控和多个整流模块,所述电源监控和所述多个整流模块之间通过CAN总线进行通信;
所述电源监控中设有完美哈希表、信息轮询模块和CAN接收中断模块;
所述完美哈希表用于保存CAN报文,使每个哈希表行对应一个报文ID,并为每个ID的CAN报文指定对应的解析函数入口;
所述信息轮询模块用于向所述多个整流模块发出广播查询命令,以便查询各整流模块的信息;以及在本轮报文通过所述CAN接收中断模块接收完毕后遍历完美哈希表,根据报文ID依次调用对应的解析函数,完成完美哈希表中每个CAN报文的解析处理;
所述CAN接收中断模块用于接收所述多个整流模块返回的CAN报文,并根据报文ID定位该CAN报文在完美哈希表中的位置,进而将该CAN报文缓存到完美哈希表中相应的位置。
10.如权利要求9所述的电源监控高速CAN报文处理***,其特征在于,所述电源监控中还设有CAN模块,所述CAN模块用于将所述信息轮询模块发出的广播查询命令通过CAN总线发送给所述多个整流模块,并将所述多个整流模块返回的CAN报文接收保存到寄存器,并触发所述CAN接收中断模块的调用。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110004996.3A CN112769816B (zh) | 2021-01-04 | 2021-01-04 | 一种电源监控高速can报文处理方法与*** |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110004996.3A CN112769816B (zh) | 2021-01-04 | 2021-01-04 | 一种电源监控高速can报文处理方法与*** |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112769816A CN112769816A (zh) | 2021-05-07 |
CN112769816B true CN112769816B (zh) | 2022-06-21 |
Family
ID=75699092
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110004996.3A Active CN112769816B (zh) | 2021-01-04 | 2021-01-04 | 一种电源监控高速can报文处理方法与*** |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112769816B (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6714553B1 (en) * | 1998-04-15 | 2004-03-30 | Top Layer Networks, Inc. | System and process for flexible queuing of data packets in network switching |
CN101924769A (zh) * | 2010-08-24 | 2010-12-22 | 无锡开创信息技术有限公司 | 一种基于净荷特征识别的搜狐天龙八部游戏业务识别方法 |
CN105812266A (zh) * | 2014-12-31 | 2016-07-27 | 北京东土科技股份有限公司 | 一种请求报文的硬件配置处理方法及装置 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7337241B2 (en) * | 2002-09-27 | 2008-02-26 | Alacritech, Inc. | Fast-path apparatus for receiving data corresponding to a TCP connection |
CN103248726B (zh) * | 2013-05-23 | 2015-09-16 | 中国科学院计算机网络信息中心 | 一种多根对等的物联网标识解析方法 |
CN104750758B (zh) * | 2013-12-31 | 2018-07-03 | 深圳航天东方红海特卫星有限公司 | 一种微小卫星测试数据包的通用解析处理方法和*** |
-
2021
- 2021-01-04 CN CN202110004996.3A patent/CN112769816B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6714553B1 (en) * | 1998-04-15 | 2004-03-30 | Top Layer Networks, Inc. | System and process for flexible queuing of data packets in network switching |
CN101924769A (zh) * | 2010-08-24 | 2010-12-22 | 无锡开创信息技术有限公司 | 一种基于净荷特征识别的搜狐天龙八部游戏业务识别方法 |
CN105812266A (zh) * | 2014-12-31 | 2016-07-27 | 北京东土科技股份有限公司 | 一种请求报文的硬件配置处理方法及装置 |
Non-Patent Citations (1)
Title |
---|
Key-Value型NoSQL本地存储***研究;马文龙等;《计算机学报》;20170601(第08期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN112769816A (zh) | 2021-05-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111580995B (zh) | 基于mqtt异步通信场景下的分布式云平台与物联网智能终端的同步通信方法与*** | |
Zhao et al. | A window protocol for transmission of time-constrained messages | |
US20010010052A1 (en) | Method for controlling multithreading | |
CN108920153B (zh) | 一种基于负载预测的Docker容器动态调度方法 | |
CN108123820B (zh) | 一种网络设备信息采集方法和装置 | |
CN104158699B (zh) | 一种基于优先级和分段的数据采集方法 | |
WO2021238248A1 (zh) | 一种网络流量的分类处理方法、装置、设备及介质 | |
CN109547162B (zh) | 基于两套单向边界的数据通信方法 | |
CN109992597A (zh) | 一种热点数据的存储方法及终端 | |
CN114389955A (zh) | 嵌入式平台异构资源池化管理方法 | |
CN111865809B (zh) | 基于协议无感知转发的设备状态感知方法、***及交换机 | |
CN112769816B (zh) | 一种电源监控高速can报文处理方法与*** | |
CN112866339B (zh) | 数据传输方法、装置、计算机设备和存储介质 | |
WO2019029721A1 (zh) | 任务的调度方法、装置、设备及存储介质 | |
CN106788842A (zh) | 一种ptp报文的处理方法及soc | |
CN115827285A (zh) | 一种跨平台通信方法、***、装置、设备及介质 | |
JPH09319597A (ja) | 周期的プロセスのスケジューリング方法 | |
CN116132369A (zh) | 云网关服务器中多网口的流量分发方法及相关设备 | |
CN102999390B (zh) | 一种云计算环境下的后端资源控制方法和装置 | |
JP3387464B2 (ja) | 通信制御システムとその制御方法 | |
CN113485749A (zh) | 一种数据管控***及数据管控方法 | |
CN109600189B (zh) | 基于时分多址tdma协议时隙调度方法、自组织网络控制*** | |
CN106453656A (zh) | 一种集群主机选取方法及装置 | |
CN112433840A (zh) | 针对高性能计算的动态的存储资源划分方法 | |
CN111258937A (zh) | 一种环式链表dma的传输方法及*** |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |