XCP协议和A2L文件 – 在线标定详解

在前边的章节中我们也介绍过在线标定的基本用例,大家应该对在线标定实现的功能有了了解。在这一篇文章中,我们将基于XCP标准中规定的在线标定的实现方式和一些概念,来讨论怎么在一个实际的ECU中设计在线标定方案。

首先大家来看一下下边的这个图,在XCP协议中,提出来PAGE(页)的概念,所谓的页就是对数据赋予了访问属性的概念,页是一种对数据的描述,一个SEGMENT中不同的页代表这相同地址上的相同的数据,唯一的区别是他们的数据内容和访问权限是不同的,下图中SEGMENT1中的页1是ECU可以访问的,而页2只有XCP可以访问,这个图只是XCP标准里边的示意图,在具体的在线标定实现中,没有这么复杂的页设置,一般来讲,在线标定只需要两个页,即Working Page(工作页)和Reference Page(参考页)。在实际应用中,控制算法中正在使用或者访问的数据来源页被称为激活页(Active Page),页的切换动作会有XCP提供的命令来触发,同时XCP也会提供相应的命令可以获取现在ECU中的激活页编号。同一个SEGMENT里边的不同的页通过PAGE_NUMBER这样的术语来索引,页的索引都是从0开始,连续递增的。这个图中提到的SEGMENT表示的是ECU地址分配的逻辑分区(与FLASH物理状态无关,纯逻辑应用概念),举例来说SEGMENT1可以是标定区,SEGMENT0可以是程序区,每一个SEGEMENT可以有多个页。SEGMENT是用SEGMENT_NUMBER这样的术语来索引的,该索引页是从0开始连续递增的,而SECTOR则代表着ECU地址分配的物理分区,它就是指FLASH的物理分区状态,每一个SECTOR代表一个单独可擦除的物理分区。

xcp_pages

那么,这些PAGE啊SEGMENT的概念是怎么和在线标定联系起来的。首先,有个概念我们要明确一下,所谓标定数据,就是控制算法中使用的一些固定的参数,这些参数在完成开发阶段的调优以后就会固化起来,因此显而易见,这部分数据会被分配到ECU的FLASH区域中,而作为ECU开发阶段重要过程的参数调优(标定过程)则要求这些数据可以通过通讯(XCP等)能够实时被修改,因此这部分数据又需要被分配到ECU的ram中。而数据的承载形式-变量在编译链接以后只能有一个地址,因为标定数据本质上看是固定的参数,因此他们会实际被配置到FLASH中。而这些数据在开发阶段同时需要具备被修改的RAM属性,对照上文我们看到的页的概念,可以自然而然的将页的概念引入进来,然后,FLASH中的标定数据就称为参考页(Reference Page),RAM中的标定数据就成为工作页(Working Page),参考页就是可以被ECU/XCP读取但不能写入的数据,工作页就是可以被ECU读取/写入,可以被XCP读取和写入的数据,他们在逻辑上都是对应了相同的FLASH地址而被赋予了不同的读写属性。下边的这个图可以给大家一个更加直观的概念解释,在ECU中的标定数据(标定SEGMENT)里边含有两个页(页0-参考页,页1-工作页),处于标定SEGMENT中有一个标定量为CAL_PID_K,它在链接以后会被分配FLASH地址(位于RP中),当激活页为RP的时候,这个变量的内容会从FLASH中获得此时为20,然后上位机通过XCP命令让ECU工作于工作页(WP),这个时候这个变量的内容会从RAM中获得此时为15,同时由于数据都从RAM中获得,这个时候如果更改了RAM中的数据,相应的应用到算法上的变量CAL_PID_K也会相应的变化,从而实现了在线标定。

xcp_wp_rp

上边介绍了在线标定所使用的基本原理,这时候,聪明的你可能已经看出来,这里有一个最不可思议的点,怎么用相同的地址来在不同的情况下访问RAM或者FLASH呢。解决这个难题主要的手段是通过地址映射来将本来链接时候固定下来的变量地址(我们称为逻辑地址)在不同的激活页的情况下映射到不同的物理地址上,有两种方案来实现这个映射,这两种方案和ECU所使用的主控芯片有关,我们来逐一介绍一下。

1.硬件实现地址映射

目前有很多支持硬件实现地址映射的芯片,例如PowerPC系列(MMU模块),TriCORE系列(Overlay 模块),如果你的ECU选取了这类芯片作为主控芯片,那么我们就可以很简单的通过配置几个寄存器实现地址映射即页切换。这种方式的好处是,控制逻辑在访问标定变量的时候不需要做任何软件的转换和干预,使用起来简单方便,软件好维护,缺点是,带有这种功能的芯片价格都偏高。

hardware_addressing_mapping

 

2. 软件处理地址映射

如果处于成本考虑,你的ECU的主控芯片并没有硬件的地址映射模块,那么必须通过一些软件干预的形式实现这个功能,具体我们来看下边这个图,标定变量在实际编译的时候会放置在FLASH区域(图中绿色实线箭头),而当激活WP以后,标定变量的内容会从RAM区域的WP去获取,而获取的方式是通过在访问变量的时候增加一个偏移量实现的。举例来说,我们有个字节型的控制变量current等于一个可标定的阈值,那么使用的时候可以这样写current = *(uint8_t*)((uint32_t)CAL_Current + offset),这个offset就是软件地址转换的核心,当激活RP的时候,该offset = 0,标定变量的地址实际指向0x000到0x200范围内,而激活WP的时候offset就可以设置为0x1000,那么current在获取标定数据的时候就自动在地址上增加了该偏移量,从而指向0x1000到0x1200区域。这种方式的优点是,可以适用于任何芯片,缺点也显而易见,需要在访问标定数据的时候增加偏移量,会增加软件的维护工作量。

software_addressing_mapping

 

发表评论

电子邮件地址不会被公开。