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

目录

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 定义机…

OpenCV(应用) —— 目标轮廓的相关应用

文章目录 一、目标轮廓的获取与绘制二、轮廓的信息(面积和周长)三、轮廓外接形状的三种表达方式 一、目标轮廓的获取与绘制 通常,使用findContours() 函数是为了获取一张图像内目标对象的所有轮廓,并且在 OpenCV4.x 版本中&#…

Python 深度学习导入的一些包的说明

Python 深度学习导入的一些包的说明 这段代码导入了一些Python库和模块,并定义了一些数据转换操作。 from future import print_function, division:这是一个Python 2和Python 3兼容性的导入语句。它确保在Python 2中使用Python 3的print函数和除法运算符…

学习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)格式定义的模型,…

helm一键部署grafana

一键部署命令 helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update helm install prometheus prometheus-community/kube-prometheus-stack暴露服务 kubectl port-forward --address 0.0.0.0 deployment/prometheus-gr…

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 集…

重启某个节点、重启电脑服务器后,kubernetes无法运行,k8s无法运行

问题描述 环境:ubuntu18.04 LTS 现象:按步骤安装kubernetes后,正常启动,各个命令均可正常使用。服务器重启后,执行命令错误信息如下: sudo kubectl get nodesThe connection to the server 127.0.0.1:644…

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;识别出存在坑洼的道路。这…

轻量封装WebGPU渲染系统示例<16>- 使用GPU Compute计算(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/ComputeEntityTest.ts 系统特性: 1. 用户态与系统态隔离。 细节请见&#xff1a;引擎系统设计思路 - 用户态与系统态隔离-CSDN博客 2. 高频调用与低频调用隔离。 …

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

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

【LeetCode】187. 重复的DNA序列

187. 重复的DNA序列 难度&#xff1a;中等 题目 DNA序列 由一系列核苷酸组成&#xff0c;缩写为 A, C, G 和 T.。 例如&#xff0c;"ACGAATTCCG" 是一个 DNA序列 。 在研究 DNA 时&#xff0c;识别 DNA 中的重复序列非常有用。 给定一个表示 DNA序列 的字符串 …

Java实现创建链表与打印链表元素(可作为模板)

1、通过数组元素值&#xff0c;构造一个单向链表&#xff1b; 2、将链表元素以数组的形式打印出来&#xff0c;如“[1, 2, 3, 4]” package listnodes;//创建节点类 class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) { this.val val; }ListNode(int v…

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

告别旧服务器 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…