汽车标定技术(四)--问题分析:多周期测量时上位机显示异常

目录

1.问题现象

2.数据流分析

​​​​3.代码分析

3.1 AllocDAQ

3.2 AllocOdt

3.3 AllocOdtEntry  

4.根因分析及解决方法

4.1 根因分析

4.2 解决方案


1.问题现象

        在手撸XCP代码时, DAQ的实现是一大头痛的事情。最初单周期实现还好一点,特别是当出现了多周期的情况时,就出现了如下现象。

         解释一下i:

        为了测试XCP协议栈,我的算法为:Mea#i = Cal#i (i = 0-20)。

        当我选择所有观测量均通过10ms的周期进行上传时,数据显示没问题,即Mea10[0-9] = 10,Mea11[0-9] = 11;但是当我以1ms周期观测 Mea10,10ms周期观测Mea11,出问题了;如上图所示,本来应该都为11的,但是显示了一些我看不懂的数值。

        首先想到的是Slave拿数据拿错了,为什么会拿错呢?那肯定是ODT描述的element对应地址有问题。所以我们先来看看数据流,有图有真相。

2.数据流分析

       当有两个daqlist的时候,CANape在动态配置时顺序如下:AllocDAQ(分配2个daqlist)、AllocOdt(给两个daqlist分配好odt)、AllocOdtEntry(给2个daqlist的odt分配好entry),并不是之前我理解的每一个daqlist分配好odt和entry之后再处理另一个daq,具体看如下log截图:

        分配完毕之后再设置daq指针,往该地址里写相应的测量量的数据;如下

​​​​3.代码分析

       既然是ODT地址问题,那我们就从DAQ变量分配的地址开始查起来;我们根据XCP标准推荐的DAQ配置时序开始:

        从AllocDaq、ODT、ODT Entry开始查起来

3.1 AllocDAQ

       上位机通过指令(0xD5)告诉ECU现在需要分配两个Daq List:

        这里会给DAQ分配一个buffer,如下:

       调试发现分配了两个DaqList,这里没问题;

3.2 AllocOdt

        通过分配ODT(D4),数据流如下:

        这部分具体代码如下: 

代码行数

作用

831

odtCount表示这个DAQlist有多少条odt(可以想成多少条报文),所以就是DAQ列表的大小

834/5

给PID赋值,同时给下一个DAQlist的首个ODT的PID赋值

837

将xcp_dyndaqodt[pos]的首地址赋给当前daq的odt

839

在动态daqbuffer的Odt位置加1;

840-844

给odt分配odtcount

845

给当前daq分配状态

846

给daq配置时序分配处于odt配置状态

       完成之后配置结果如下:

        这里发现第一个odt和第二个odt的地址不止8个字节(一帧报文),这里可能有点问题;

         0x70003fe8对应的是动态daqbuffer的首地址:

        找到该地址看里面的数据如下:

        发现数据存放并不是连续的,而是直接跳了24个字节;怀疑这里应该存在问题:看代码中,只是对Xcp_DynDaqOdtPos进行了加1,但是从log来看的话,

        应该是给daq0分配了6个odt,然后再给daq1分配了3个odt;如果只对位置进行加1的话,也就是Xcp_DynDaqOdt[pos+1]的地址为当前daq的odt的下一个odt的首地址;那么第二次给daq1给配3个odt的时候,使用的地址就为[pos+1]的地址;这样就把daq0的第二个odt给覆盖了;

        但是还是没能找到在代码什么位置给赋值,在allocodtentry函数里给Xcp_DynDaqOdt里写数据(每一条分配一个地址),包括地址和entrysize:

        很明显这里面只有6个odt(正确应是9个),第二个odt里面放的地址是70004018,如下:

      正常情况下,第二个odt里应该放置的Xcp_DynDaqBuffer[1]的地址;也印证了之前odt被覆盖的猜想。

3.3 AllocOdtEntry  

        上位机通过指令ODT ENTRY(D3)分配Entry,这里就是给每一帧数据分配几个数据,还是接着上面的,第一帧可上传7个字节的数据,那么如果每个数据的大小均为4个字节,就只能上传1个数据加上下一个数据的前三个字节,因此ODTENTRY为2;那么第二帧接着上面的就可以上传第一帧未传完的剩余一个字节(1byte)、第三个数据(4byte)以及第四个数据的前两个字节(2byte),所以第二帧的ODTENTRY为3;以此类推。数据流如下:

     调试结果如下:

       ODTEntry里面包含了entry的地址(需要上传数据的地址)、长度等,且ODTentry本身的地址是动态daqbuffer里的地址,即是说我们是通过将数据放到动态daqbuffer里,然后再上传。

4.根因分析及解决方法

4.1 根因分析

        DAQ上传的具体线路:

        首先,在AllocOdt这条指令下,将Xcp_DynOdtBuffer的地址赋给DAQ[x].odt[y];

        然后在AllocOdtEntry,将Xcp_DynDaqBuffer地址赋给OdtEntry;

        最后在writeDaq里将变量的地址写到给OdtEntry(Xcp_DynDaqBuffer)里,即在Xcp_DynDaqBuffer里存放实际测量量的地址、DynOdtBuffer存放的是odtentry的地址。

        由于在alloctOdt时覆盖了DAQ0的第2-4个ODT,所以会出现如下现象:

       并没有一一对应。

4.2 解决方案

        那么修改代码如下:

数据显示正常:

        哭了,注释一行代码,调试了一周。 还是当时设计时没有理清思路,给自己埋下了大坑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/131996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB - Gazebo 联合仿真 —— 使用 UR10 机械臂检测和采摘水果

系列文章目录 文章目录 系列文章目录前言一、设置 Gazebo 仿真环境二、在 Gazebo 中模拟和控制机器人2.1 概述2.2 任务调度器2.3 感知和目标生成系统2.4 运动规划2.5 机械臂和关节控制系统 三、分配用于控制机器人的参数3.1 定义机器人模型和运动规划参数,3.2 定义机…

学习c++的第十一天

目录 继承和派生 基类 & 派生类 访问控制和继承 派生类的构造函数 派生类的析构函数 继承类型 多继承 重载运算符和重载函数 函数重载 运算符重载 可重载运算符/不可重载运算符 运算符重载实例 继承和派生 先来说继承,这与现实生活中的继承意思差不…

[直播自学]-[汇川easy320]搞起来(1)给PLC供电

从没正儿八经的用一用PLC,所以双11在淘宝入手一个EASY320,大概1000出头。 到货后,汇川官网搜了一下资料,搜到这几个: 首先是给PLC供电吧,看了下PLC前面是24V,不知道供电范围多宽,于…

YoloV8目标检测与实例分割——目标检测onnx模型推理

一、模型转换 1.onnxruntime ONNX Runtime(ONNX Runtime或ORT)是一个开源的高性能推理引擎,用于部署和运行机器学习模型。它的设计目标是优化执行使用Open Neural Network Exchange(ONNX)格式定义的模型,…

https原理

首先说一下几个概念:对称加密、非对称加密 对称加密: 客户端和服务端使用同一个秘钥,分两种情况: 1、所有的客户端和服务端使用同一个秘钥,这个秘钥被泄漏后数据不再安全 2、每个客户端生成一个秘钥&…

[云原生案例2.1 ] Kubernetes的部署安装 【单master集群架构 ---- (二进制安装部署)】节点部分

文章目录 1. 常见的K8S安装部署方式1.1 Minikube1.2 Kubeadm1.3 二进制安装部署 2. Kubernetes单master集群架构 ---- (二进制安装部署)2.1 前置准备2.2 操作系统初始化2.3 部署 docker引擎 ---- (所有 node 节点)2.4 部署 etcd 集…

HTML_案例1_注册页面

用纯html页面&#xff0c;不用css画一个注册页面。 最终效果如下&#xff1a; html页面代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册页面</title> </head>…

ffmpeg命令帮助文档

一&#xff1a;帮助文档的命令格式 ffmpeg -h帮助的基本信息ffmpeg -h long帮助的高级信息ffmpeg -h full帮助的全部信息 ffmpeg的命令使用方式&#xff1a;ffmpeg [options] [[infile options] -i infile] [[outfile options] outfile] 二&#xff1a;将帮助文档输出到文件 …

部署ELK

一、elasticsearch #拉取镜像 docker pull elasticsearch:7.12.1 #创建ELK docker网络 docker network create elk #启动ELK docker run -d --name es --net elk -P -e "discovery.typesingle-node" elasticsearch:7.12.1 #拷贝配置文件 docker cp es:/usr/share/el…

【2023年MathorCup高校数学建模挑战赛-大数据竞赛】赛道A:基于计算机视觉的坑洼道路检测和识别 python 代码解析

【2023年MathorCup高校数学建模挑战赛-大数据竞赛】赛道A&#xff1a;基于计算机视觉的坑洼道路检测和识别 python 代码解析 1 题目 坑洼道路检测和识别是一种计算机视觉任务&#xff0c;旨在通过数字图像&#xff08;通常是地表坑洼图像&#xff09;识别出存在坑洼的道路。这…

Pycharm 对容器中的 Python 程序断点远程调试

pycharm如何连接远程服务器的docker容器有两种方法&#xff1a; 第一种&#xff1a;pycharm通过ssh连接已在运行中的docker容器 第二种&#xff1a;pycharm连接docker镜像&#xff0c;pycharm运行代码再自动创建容器 本文是第一种方法的教程&#xff0c;第二种请点击以上的链接…

个人服务器到期,项目下线,新的开始

告别旧服务器 2023.11.06服务器到期&#xff0c;所有项目正式下线 时间真的过的很快&#xff0c;从开始踏入编程的大门&#xff0c;到现在不知不觉已经陆续经手了两台服务器了&#xff0c;目前这台服务器是一年前的阿里云活动白嫖的嘿嘿嘿&#xff0c;该服务器上目前运行的项…

项目实战:service业务逻辑组件引入

1、第一层DAO层 1.1、FruitDao接口 package com.csdn.fruit.dao; import com.csdn.fruit.pojo.Fruit; import java.util.List; //dao &#xff1a;Data Access Object 数据访问对象 //接口设计 public interface FruitDao {void addFruit(Fruit fruit);void delFruit(String fn…

计网【链路带宽100Mbps代表什么,“翻译”成人话是?】

这里写目录标题 带宽的概念本来的意思【通信领域】计网中的意思 结论【100Mbps代表什么】 带宽的概念 本来的意思【通信领域】 带宽这个概念本来是通信领域的&#xff0c;表示通信线路允许通过的信号频带范围&#xff0c;单位是赫兹Hz 感觉最简单的意思&#xff0c;例如如果…

ActiveMq学习⑧__ActiveMQ的消息持久化机制

ActiveMQ的消息存储和持久化 MQ的高可用 事务持久签收可持久化 &#xff08;类似于与mq消息的同步机制&#xff09; 为了避免意外宕机以后丢失信息&#xff0c;需要做到重启后可以恢复消息队列&#xff0c;消息系统一半都会采用持久化机制。 ActiveMQ的消息持久化机制 Act…

SurfaceFlinger的硬件Vsync深入分析-千里马android framework车机手机系统开发

背景&#xff1a; 学过或者你看过surfaceflinger相关文章同学都知道&#xff0c;vsync其实都是由surfaceflinger软件层面进行模拟的&#xff0c;但是软件模拟有可能会有误差或偏差&#xff0c;这个时候就需要有个硬件vsync帮忙校准。 故才会在surfaceflinger的systrace出现如下…

C语言从入门到精通之【第一个程序hello world】

编程步骤 通常&#xff0c;我们按照以下步骤进行 确立目标设计程序编写代码编译程序运行程序测试&调试修改维护 输出hello world 每个学编程的人都会从最经典的【输出hello world】开始。 https://lightly.teamcode.com/ 我们可以使用这个在线IDE学习C语言。 代码很简…

Go语言与Python语言的性能比较

目录 一、背景与意义 二、执行速度 三、内存消耗 四、并发性能 五、编译速度与开发效率 六、综合考虑 七、应用场景 八、未来发展趋势 总结 一、背景与意义 在编程世界中&#xff0c;Go语言和Python语言都占有一席之地。Go语言是由Google开发的&#xff0c;其设计初衷…

【JavaEE】JVM 剖析

JVM 1. JVM 的内存划分2. JVM 类加载机制2.1 类加载的大致流程2.2 双亲委派模型2.3 类加载的时机 3. 垃圾回收机制3.1 为什么会存在垃圾回收机制?3.2 垃圾回收, 到底实在做什么?3.3 垃圾回收的两步骤第一步: 判断对象是否是"垃圾"第二步: 如何回收垃圾 1. JVM 的内…

Python爬虫技术系列-04Selenium库的使用

Python爬虫技术系列-04Selenium库的使用 1 Selenium库基本使用1.1 Selenium库安装1.2 Selenium库介绍 2 Selenium库的使用2.1 各个版本的区别2.1.1 Selenium IDE介绍与使用2.1.2 Selenium Grid介绍与使用2.1.3 Selenium RC介绍与使用2.1.4 WebDriver介绍与使用 2.2 WebDriver常…