CAN报文滤波解析方法、系统及电子控制单元与流程

文档序号:13391453阅读:1005来源:国知局
CAN报文滤波解析方法、系统及电子控制单元与流程

本发明涉及汽车电子技术领域,特别是涉及can报文滤波解析方法、系统及电子控制单元。



背景技术:

随着汽车技术的升级和功能的日益丰富,汽车电子系统can网络的报文越来越多,对于网络中的具体can节点而言,会接收到大量无用的报文。由于can控制器硬件滤波功能有限,当can节点需要接收并解析多个报文时,便无法使用硬件滤波功能,目前一般采用软件滤波过滤掉无用报文,当can网络达到一定负载率时,频繁的报文接收、滤波和解析会极大地消耗mcu负荷。另一方面,汽车电子控制单元(ecu)的程序通常存储在非易失性存储器flash中,程序运行时,mcu从程序计数器指向的地址处读取指令。由于mcu内部ram资源有限,程序一般在flash中运行,flash技术的限制决定了其读取速度远小于ram读取速度,相应地,在flash中运行程序的速度远小于在ram中运行程序的速度。通过软件方式进行报文接收、滤波和解析时,ecu需要消耗大量的ram资源、指令周期和时间处理这些任务,不仅影响系统实时性,还会对mcu规格提出一定要求。

通过软件滤波过滤无用报文,有两种实现方式:

1、设置足够大的can报文接收缓冲区,并为can报文解析任务设置足够大的消息队列,在can报文接收中断服务程序中把报文依次存储到缓冲区中,然后向can报文解析任务发送消息,在can报文解析任务中过滤无用报文,解析有用报文。

2、设置一定大小的can报文接收缓冲区,在can报文接收中断服务程序中过滤掉无用报文,将有用报文存储到缓冲区中,然后向can报文解析任务发送消息,在can报文解析任务中解析有用报文。

采用第一种实现方式时,如果can网络存在大量本节点不需要解析的无用报文,需要将报文接收缓冲区和can报文解析任务消息队列设置得足够大,否则可能出现缓冲区溢出或者消息队列溢出,造成报文丢失的严重错误。较大的接收缓冲区和报文解析任务消息队列会消耗大量ram资源,可能需要更换ram更大同时也更昂贵的mcu,从而增加电子零部件的成本。

采用第二种实现方式时,需要在接收中断服务程序中进行软件滤波,采用遍历比较方法过滤报文,需要大量的指令周期,违反了中断服务程序运行时间越短越好的原则。执行中断服务程序期间再次发生中断可能会导致中断嵌套或中断丢失,中断嵌套会大量消耗有限的堆栈资源,如果堆栈溢出,会导致不可预料的后果。中断丢失也会影响系统运行的准确性和可靠性。

遍历比较法是指设置一个常数数组,数组元素为需要解析的报文id,将接收到的报文id和数组元素逐一进行比较,如果接收到的报文id和某个数组元素相等,则表示can节点需要解析这个报文。

中国发明专利:can总线报文的软件滤波方法、系统及电子控制单元(申请号:201410058072.1),描述了一种can总线报文的软件滤波方法,该发明设置了若干个接收缓冲区,每个缓冲区中存储的报文id为若干个固定取值,首先把报文存储到某个缓冲区中,然后将报文id和该缓冲区对应的若干个固定id进行比较。该方法可以减少id比较次数,但需要设置若干个接收缓冲区,不仅程序设计比较复杂,而且接收缓冲区内存储的是滤波之前的can报文,需要消耗的ram资源比较多。而且,该发明专利没有说明,是在接收中断服务程序还是在报文解析任务中进行软件滤波。



技术实现要素:

为了解决现有技术的不足,本发明提供了一种can报文滤波解析方法,其在ram中执行can报文接收、滤波和解析函数,不仅能够降低中断服务程序的运行时间,还可以降低对系统堆栈的要求,同时提出一种报文id匹配算法,将报文id匹配算法放在中断服务程序中进行,降低了报文接收缓冲区和can报文解析任务消息队列对ram资源的要求;

一种can报文滤波解析方法,应用于电子控制单元,包括步骤如下:

步骤(1):在电子控制单元ecu上电或者复位后的初始化阶段,将ram_code_seg代码段对应的flash空间中的程序复制到对应的ram空间中,当mcu运行can报文接收、滤波和解析函数时,程序计数器自动指向ram_code_seg所在的ram空间,在ram内运行所述程序;

步骤(2):确定需要解析的有效报文id和个数,个数记为valid_num,建立有效报文id取值数组valid_id[valid_num];

步骤(3):将can标准帧id取值区间划分为8个子区间;

步骤(4):以数组下标的形式确定各个子区间内有效报文id在valid_id[valid_num]中的起始位置;建立数组id_idx[9],以id_idx[i]为i号子区间最小有效报文id对应的valid_id[valid_num]数组元素的下标值,id_idx[8]=valid_num;

步骤(5):在can报文接收中断服务程序中,判断接收到的报文的id是否在有效报文id取值数组valid_id[valid_num]范围内,如果不是,则直接退出接收中断服务程序,否则进入步骤(6);

步骤(6):将接收到的报文的id右移8位,将结果记为idx;

步骤(7):以id_idx[idx]和id_idx[idx+1]-1作为有效报文id取值数组valid_id[valid_num]的下标区间,将接收到的报文的id和下标区间内的id取值逐一进行比较,如果接收到的报文的id和所述下标区间内任何一个id取值都不相等,则丢弃收到的报文,直接退出接收中断处理程序,否则进入步骤(8);

步骤(8):将报文id、所在id取值子区间的标号、报文长度、报文数据存储在报文接收缓冲区中,向报文解析任务发送“接收到新报文”消息;

步骤(9):在报文解析任务中,根据id取值子区间的标号,将报文id与所述取值子区间中的id进行比较,提取相应的can信号,执行相关的操作。

所述步骤(1)的ram_code_seg代码段,设置在链接文件中,是可重定位的代码段;ram_code_seg代码段中定义can报文接收、滤波和解析函数;将程序编译、链接后,烧录程序时,mcu把定义在ram_code_seg代码段中的程序数据存储到flash空间;

所述可重定位的代码段中设定一段flash空间和一段与flash空间尺寸相同的ram空间,并将flash空间重定位到ram空间。

所述步骤(2)中,根据ecu的技术规范和can网络矩阵表,确定需要解析的有效报文id和个数;

所述步骤(2)中按需要解析的有效报文id取值从小到大的顺序建立有效报文id取值数组valid_id[valid_num],最小值为valid_id[0],最大值为valid_id[valid_num-1]。

所述步骤(2)中,valid_num和valid_id[valid_num]均为常量,由技术规范和can网络矩阵表分析得出。

所述步骤(3)中,can标准帧id为11位,取值范围为0x00-0x7ff,将can标准帧id取值区间划分为8个子区间;8个子区间的id取值范围分别为0x00-0xff、0x100-0x1ff、0x200-0x2ff、0x300-0x3ff、0x400-0x4ff、0x500-0x5ff、0x600-0x6ff和0x700-0x7ff,对应子区间标号分别为0、1、2、3、4、5、6和7。

所述步骤(4)中,根据ecu的技术规范和can网络矩阵表,以数组下标的形式确定各个子区间内有效报文id在valid_id[valid_num]中的起始位置。

所述步骤(4)的方法如下:

假设本节点需要解析的报文id取值在0号子区间0x00-0xff之间的有0x40,0x50,0x60,0x70…,一共有n个,id取值在0x100-0x1ff之间的有0x140,0x150,0x160,0x170…,一共有m个,则id_idx[0]=0,id_idx[1]=n,id_idx[2]=n+m…,id_idx[8]=valid_num。

所述步骤(5)首先将接收到的报文的id分别与valid_id[0]和valid_id[valid_num-1]相比较,如果接收到的报文的id大于valid_id[valid_num-1]或者小于valid_id[0],直接退出接收中断服务程序,否则进入步骤(6)。

本发明还提出了另外一种技术方案:

一种can报文滤波解析系统,包括:电子控制单元ecu,其上存储有计算机指令,所述计算机指令在运行时执行以下步骤:

步骤(1):在电子控制单元ecu上电或者复位后的初始化阶段,将ram_code_seg代码段对应的flash空间中的程序复制到对应的ram空间中,当mcu运行can报文接收、滤波和解析函数时,程序计数器自动指向ram_code_seg所在的ram空间,在ram内运行所述程序;

步骤(2):确定需要解析的有效报文id和个数,个数记为valid_num,建立有效报文id取值数组valid_id[valid_num];

步骤(3):将can标准帧id取值区间划分为8个子区间;

步骤(4):以数组下标的形式确定各个子区间内有效报文id在valid_id[valid_num]中的起始位置;建立数组id_idx[9],以id_idx[i]为i号子区间最小有效报文id对应的valid_id[valid_num]数组元素的下标值,id_idx[8]=valid_num;

步骤(5):在can报文接收中断服务程序中,判断接收到的报文的id是否在有效报文id取值数组valid_id[valid_num]范围内,如果不是,则直接退出接收中断服务程序,否则进入步骤(6);

步骤(6):将接收到的报文的id右移8位,将结果记为idx;

步骤(7):以id_idx[idx]和id_idx[idx+1]-1作为有效报文id取值数组valid_id[valid_num]的下标区间,将接收到的报文的id和下标区间内的id取值逐一进行比较,如果接收到的报文的id和所述下标区间内任何一个id取值都不相等,则丢弃收到的报文,直接退出接收中断处理程序,否则进入步骤(8);

步骤(8):将报文id、所在id取值子区间的标号、报文长度、报文数据存储在报文接收缓冲区中,向报文解析任务发送“接收到新报文”消息;

步骤(9):在报文解析任务中,根据id取值子区间的标号,将报文id与所述取值子区间中的id进行比较,提取相应的can信号,执行相关的操作。

本发明还提出了另外一种技术方案:

一种电子控制单元,包括:can控制器,所述can控制器中存储有计算机指令,所述计算机指令在运行时执行以下步骤:

步骤(1):在电子控制单元ecu上电或者复位后的初始化阶段,将ram_code_seg代码段对应的flash空间中的程序复制到对应的ram空间中,当mcu运行can报文接收、滤波和解析函数时,程序计数器自动指向ram_code_seg所在的ram空间,在ram内运行所述程序;

步骤(2):确定需要解析的有效报文id和个数,个数记为valid_num,建立有效报文id取值数组valid_id[valid_num];

步骤(3):将can标准帧id取值区间划分为8个子区间;

步骤(4):以数组下标的形式确定各个子区间内有效报文id在valid_id[valid_num]中的起始位置;建立数组id_idx[9],以id_idx[i]为i号子区间最小有效报文id对应的valid_id[valid_num]数组元素的下标值,id_idx[8]=valid_num;

步骤(5):在can报文接收中断服务程序中,判断接收到的报文的id是否在有效报文id取值数组valid_id[valid_num]范围内,如果不是,则直接退出接收中断服务程序,否则进入步骤(6);

步骤(6):将接收到的报文的id右移8位,将结果记为idx;

步骤(7):以id_idx[idx]和id_idx[idx+1]-1作为有效报文id取值数组valid_id[valid_num]的下标区间,将接收到的报文的id和下标区间内的id取值逐一进行比较,如果接收到的报文的id和所述下标区间内任何一个id取值都不相等,则丢弃收到的报文,直接退出接收中断处理程序,否则进入步骤(8);

步骤(8):将报文id、所在id取值子区间的标号、报文长度、报文数据存储在报文接收缓冲区中,向报文解析任务发送“接收到新报文”消息;

步骤(9):在报文解析任务中,根据id取值子区间的标号,将报文id与所述取值子区间中的id进行比较,提取相应的can信号,执行相关的操作。

与现有技术相比,本发明的有益效果是:

1、mcu在实际运行时,can报文接收、滤波和解析函数会重定位到ram中运行,大大提高了can报文接收、滤波及解析的速度,提高了系统实时性。

2、通过设定id取值子区间,减少了id比较的次数,提高了报文滤波速度。

3、接收到的can报文进行滤波处理后,将有效的报文存入接收缓冲区,降低了接收缓冲区和can报文解析任务消息队列的ram资源需求。

4、根据在中断服务程序中得到的id取值子区间,在can报文解析任务中进行id匹配时,可以降低id比较次数,提高了报文解析速度。

附图说明

构成本申请的一部分的说明书附图用来提供对本申请的进一步理解,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。

图1为本发明的整体工作流程图;

图2为本发明的报文滤波算法流程图。

具体实施方式

应该指出,以下详细说明都是例示性的,旨在对本申请提供进一步的说明。除非另有指明,本文使用的所有技术和科学术语具有与本申请所属技术领域的普通技术人员通常理解的相同含义。

需要注意的是,这里所使用的术语仅是为了描述具体实施方式,而非意图限制根据本申请的示例性实施方式。如在这里所使用的,除非上下文另外明确指出,否则单数形式也意图包括复数形式,此外,还应当理解的是,当在本说明书中使用术语“包含”和/或“包括”时,其指明存在特征、步骤、操作、器件、组件和/或它们的组合。

如图1和2所示,一种can报文滤波解析方法,应用于电子控制单元,包括步骤如下:

步骤(1):在电子控制单元ecu上电或者复位后的初始化阶段,将ram_code_seg代码段对应的flash空间中的程序复制到对应的ram空间中,当mcu运行can报文接收、滤波和解析函数时,程序计数器自动指向ram_code_seg所在的ram空间,在ram内运行所述程序;所述ram_code_seg代码段,设置在链接文件中,是可重定位的代码段;ram_code_seg代码段中定义can报文接收、滤波和解析函数;将程序编译、链接后,烧录程序时,mcu把定义在ram_code_seg代码段中的程序数据存储到flash空间;所述可重定位的代码段中设定一段flash空间和一段与flash空间尺寸相同的ram空间,并将flash空间重定位到ram空间。

步骤(2):确定需要解析的有效报文id和个数,个数记为valid_num,建立有效报文id取值数组valid_id[valid_num];根据ecu的技术规范和can网络矩阵表,确定需要解析的有效报文id和个数;按需要解析的有效报文id取值从小到大的顺序建立有效报文id取值数组valid_id[valid_num],最小值为valid_id[0],最大值为valid_id[valid_num-1]。valid_num和valid_id[valid_num]均为常量,由技术规范和can网络矩阵表分析得出。

步骤(3):将can标准帧id取值区间划分为8个子区间;can标准帧id为11位,取值范围为0x00-0x7ff,根据id最高三位的取值,将can标准帧id取值区间划分为8个子区间;8个子区间的id取值范围分别为0x00-0xff、0x100-0x1ff、0x200-0x2ff、0x300-0x3ff、0x400-0x4ff、0x500-0x5ff、0x600-0x6ff和0x700-0x7ff,对应子区间标号分别为0、1、2、3、4、5、6和7。

步骤(4):以数组下标的形式确定各个子区间内有效报文id在valid_id[valid_num]中的起始位置;建立数组id_idx[9],以id_idx[i]为i号子区间最小有效报文id对应的valid_id[valid_num]数组元素的下标值,特别地,id_idx[8]=valid_num;

根据ecu的技术规范和can网络矩阵表,以数组下标的形式确定各个子区间内有效报文id在valid_id[valid_num]中的起始位置。

假设本节点需要解析的报文id取值在0号子区间0x00-0xff之间的有0x40,0x50,0x60,0x70…,一共有n个,id取值在0x100-0x1ff之间的有0x140,0x150,0x160,0x170…,一共有m个,则id_idx[0]=0,id_idx[1]=n,id_idx[2]=n+m…。特别地,id_idx[8]=valid_num。

步骤(5):在can报文接收中断服务程序中,首先将接收到的报文的id分别与valid_id[0]和valid_id[valid_num-1]相比较,如果接收到的报文的id大于valid_id[valid_num-1]或者小于valid_id[0],直接退出接收中断服务程序,否则进入步骤(6);

步骤(6):将接收到的报文的id右移8位,将结果记为idx;

步骤(7):以id_idx[idx]和id_idx[idx+1]-1作为数组valid_id[valid_num]的下标区间,将接收到的报文的id和下标区间内的id取值逐一进行比较,如果接收到的报文的id和所述下标区间内任何一个id取值都不相等,则丢弃收到的报文,直接退出接收中断处理程序,否则进入步骤(8);

步骤(8):将报文id、所在id取值子区间的标号、报文长度、报文数据存储在报文接收缓冲区中,向报文解析任务发送“接收到新报文”消息;

步骤(9):在报文解析任务中,根据id取值子区间的标号,将报文id与所述取值子区间中的id进行比较,提取相应的can信号,执行相关的操作。

本申请结合具体实施例对本发明做具体说明:

为某汽车厂开发的一款peps,需要解析的有效报文id有20个,包括0x42,0x52,0x70,0x73,0x74,0x75,0x1a2,0x270,0x271,0x340,0x380,0x390,0x4e0,0x521,0x570,0x610,0x630,0x645,0x701,0x7df,根据本方法,valid__num=20,建立的有效id数组为uint16_tvalid_id[valid__num]={0x42,0x52,0x70,0x73,0x74,0x75,0x1a2,0x270,0x271,0x340,0x380,0x390,0x4e0,0x521,0x570,0x610,0x630,0x645,0x701,0x7df};根据本发明方法建立表格如下:

表1

uint8_tid_idx[9]={0,6,7,9,12,13,15,18,20};

具体地,假设接收到的报文id=0x521,如果按照遍历比较法对接收到的报文id进行滤波,需要进行14次比较运算。按照本方法步骤6,将接收到的报文的id右移8位,将结果记为idx;

idx=0x521>>8=5

以id_idx[5]和id_idx[6]-1作为数组valid_id[valid_num]的下标区间,即13-14,将0x521与valid_id[13]-valid_id[14]之间的取值进行比较,只需要执行一次比较运算,就能确定接收到的报文为有效报文。

假设接收到的报文id=0x520,如果按照遍历比较法对接收到的报文id进行滤波,需要进行20次比较运算,按照本发明的方法,只需要执行一次右移运算和三次比较运算。

平均而言,按照遍历比较法对接收到的报文id进行滤波,如果为有效报文,平均比较次数为valid__num/2次,如果为无效报文,比较次数为valid__num次,按照本发明进行滤波,比较次数会大大小于遍历比较法。

以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1