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

news/2025/1/15 22:09:18/

标定是什么

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

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

  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地址的转换。


http://www.ppmy.cn/news/1521568.html

相关文章

maven-helper插件解决jar包冲突实战

经常遇到jar包冲突问题,今天梳理一下: 1、打开idea 2、安装后 打开pom文件 点击 3、 4、 5、 6、 7、 8、 9、 可参考的类似文章

Day 8:77 组合

77 组合 1. 题目描述2. 解题思路3. 代码实现4. 回溯模板 1. 题目描述 77 组合 2. 解题思路 该题可以使用回溯类型的模板来解决&#xff0c;注意到可以进行剪枝操作。 3. 代码实现 class Solution {vector<vector<int>> res;vector<int> path; public:ve…

nodejs发邮件如何实现自动化邮件发送功能?

nodejs发邮件的安全性探讨&#xff1f;使用nodejs发邮件的教程&#xff1f; 在处理邮件发送这类重复性任务时&#xff0c;使用Node.js发邮件的功能可以极大地简化工作流程。AokSend将详细探讨如何利用Node.js发邮件来实现自动化邮件发送功能&#xff0c;确保您的邮件发送任务既…

双指针法01

习题1 27. 移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k&#xff0c;要通过此题&#xff0c;您需要执行以下…

2024高教社杯全国大学生数学建模竞赛C题原创python代码

2024高教社杯全国大学生数学建模竞赛C题原创python代码 C题题目&#xff1a;农作物的种植策略 思路可以参考我主页之前的文章 以下均为python代码&#xff0c;推荐用anaconda中的notebook当作编译环境 from gurobipy import Model import pandas as pd import gurobipy as g…

探索TinyDB:轻量级数据库的优雅之旅

文章目录 探索TinyDB&#xff1a;轻量级数据库的优雅之旅背景&#xff1a;为何选择TinyDB&#xff1f;TinyDB是什么&#xff1f;如何安装TinyDB&#xff1f;简单库函数使用方法场景应用常见Bug及解决方案总结 探索TinyDB&#xff1a;轻量级数据库的优雅之旅 背景&#xff1a;为…

记一次MES项目上线失败总结--数据库层面+代码层面优化方案

难熬三个夜晚&#xff01;&#xff01;&#xff01;按原计划将ERP的生产订单、排程单、牌卡计划、小包装、装箱单等生产数据通过接口的形式同步到MES系统&#xff0c;其中生产订单、排程单和小包装、装箱单的数据量相对较少&#xff0c;合计大概50w条左右的数据&#xff0c;同步…

免费开源的低代码表单FormCreate安装教程,支持可视化设计,适配移动端

低代码表单FormCreate 是一个可以通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的表单生成组件。它支持 6 个 UI 框架&#xff0c;适配移动端&#xff0c;并且支持生成任何 Vue 组件。内置 20 种常用表单组件和自定义组件&#xff0c;再复杂的表单都可以轻松搞定 源码…