基于Vector Davinci SIP的标定实现方法

标定是什么

在汽车软件开发过程中,软件做好之后一般都需要在实车上进行调试,尤其是底盘领域,软件的性能与实车参数、状态有很大的关系,很多参数在开发阶段没办法直接确定最优值,只能是先定一个大概的默认值,然后在实车调试阶段不断修改参数值,依据实车表现来确定最优的参数值。这个在实车上不断调整参数从而实现最优性能的过程就是标定。

标定需要底软实现哪些功能

  1. 默认的标定参数通常都是const类型的,也就是固化到Flash里的,但标定时又需要在程序运行过程中实时修改标定参数,而我们知道Flash里的数据是不能实时修改的,这时就需要底软来想办法实现实时修改标定参数的功能。
  2. 对于不同的车型,很多时候软件可以共用一套,只是标定参数有区别,为了提高复用性,我们需要把应用程序和标定参数在Flash的区域中独立开来,分别放到不同的地址空间,这样对不同车型刷写程序的时候,可以刷同样的程序,再匹配不同的标定参数即可。这里需要注意一下,如果使用相同的应用程序,那么与之匹配的多套标定数据的位置和顺序必须是一致。
  3. 标定时通常使用的工具是Vector的CANape,这个工具可以实现标定数据的导入和导出(专用的par格式),以及导出Hex文件。结合上一条,导出的Hex文件可以单独刷写进ECU,这个对Bootloader也提出了一定的要求,要实现分块刷写。

实现以上需求的方法

在Vector的协议栈中,主要是通过下面几个点来实现上述功能:

  • 要实现标定数据和程序数据的地址空间相互独立,需要用mammap将所有标定数据定义到指定的地址范围内,这个不难实现。但是,如果所有标定数据都是一个个单独的变量,那么这些标定数据在该地址范围内的具体位置我们是没办法控制的,是由编译器在链接阶段自动生成的,有可能重新编译软件的时候,标定数据变量的地址就变化了,这会影响我们复用标定数据的hex文件,因为如果想复用Hex,那么标定数据在hex中的地址必须是一致的。虽然有些编译器可以根据变量类型和变量名进行排序,能做到重新编译软件的时候变量地址不变,但我们依然是希望我们能对程序有完全的掌控,不依赖于编译器。所以最好的方法是将所有标定数据放到一个大的结构体内,然后把这个结构体变量放到固定的地址。这样每个标定数据在Flash中的位置就取决于它在结构体中的位置,而它在结构体中的位置我们是可以通过代码来控制的。

  • 如果想要实现把所有的标定数据放到一个结构体中,手动实现是不人性化且不现实的。在Vector的协议栈中,我们可以建一个Calibration类型的component,这种类型的component只能添加标定接口,我们在这个component中添加Provide类型的标定接口,在用这个标定数据的SWC中添加Require类型的标定接口,把两个接口相连,然后使能SWC的“Calibration Support Enabled”选项,生成RTE后就会自动生成一个结构体,所有该Calibration component中的标定接口都会被生成到一个结构体中,而且我们只需要完善一下memmap和链接脚本,就可以把这个结构体放到指定的Flash地址空间。

  • 以上步骤实现了之后,我们其实就实现了把标定数据放到指定地址的目的,且每个标定数据的位置对我们来说都是可见且可控的,下面我们来看如何实现在线标定。Vector协议栈生成的代码中,SWC调用标定数据接口的时候,是通过结构体指针来调用的,这个结构体指针默认指向的是Flash中的标定数据结构体,但这个指针是允许修改的,所以我们可以在RAM中划分一块标定RAM空间,在程序开始运行的时候,把Flash中的标定数据复制到标定RAM空间内,创建一个标定数据镜像,同时把标定数据指针指向这个镜像,这样当SWC想要使用标定数据的时候,就可以从RAM中取值。接下来我们要实现的就是标定的时候也去修改RAM镜像的标定数据值,而不是直接修改Flash中的数据。这个是在CANape中实现的。在CANape中创建一个Memory Segment,这个就是Flash到RAM的映射,这样当使用CANape对Flash中的数据进行标定的时候,CANape会自动把Flash地址转换成RAM镜像的地址。CANape也支持把这段Flash空间的数据导出为Hex,导出的Hex可以通过烧写器或Bootloader刷写进ECU。
    在这里插入图片描述

  • 在实际项目中还有一些更复杂的应用场景,比如同一辆车的不同使用场景下可能会有不同的标定参数,也就是说一辆车一套标定参数可能不能满足我们的需求,而是需要两套甚至更多套标定参数,这个时候我们需要建多个Calibration component,生成多个结构体,根据需求选择使用哪个结构体的标定数据。还有的时候标定数据过大,映射到RAM的时候RAM空间不够用,这个时候就需要分区进行标定,每次把一部分参数映射到RAM进行在线标定。

现在一些MCU带有硬件Overlay的功能,就是专门用来实现Flash到RAM空间的映射的,通过设置寄存器就可以实现自动实现Flash数据到RAM的复制,在线标定的时候也可以直接写Flash地址,MCU内部会做Flash地址到RAM地址的转换。

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老孟的孟不是很老的孟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值