汽车标定技术(四)--问题分析:多周期测量时上位机显示异常
目录
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 解决方案
那么修改代码如下:

数据显示正常:

哭了,注释一行代码,调试了一周。 还是当时设计时没有理清思路,给自己埋下了大坑。
相关文章:
汽车标定技术(四)--问题分析:多周期测量时上位机显示异常
目录 1.问题现象 2.数据流分析 3.代码分析 3.1 AllocDAQ 3.2 AllocOdt 3.3 AllocOdtEntry 4.根因分析及解决方法 4.1 根因分析 4.2 解决方案 1.问题现象 在手撸XCP代码时, DAQ的实现是一大头痛的事情。最初单周期实现还好一点,特别是…...
Flink SQL时间属性和窗口介绍
(1)概述 时间属性(time attributes),其实就是每个表模式结构(schema)的一部分。它可以在创建表的 DDL 里直接定义为一个字段,也可以在 DataStream 转换成表时定义。 一旦定义了时间…...
Tomcat免安装版修改标题名称和进程
tomcat免安装版启动后闪退问题 问题描述 在官网下载的tomcat免安装版的你安装完环境后发现启动闪退,tomcat启动依赖环境是JDK,所以需要tomcat对应版本的JDK支持。 tomcat8官网下载地址:https://tomcat.apache.org/ JDK环境官网下载地址&…...
vim搜索、替换tab
bibtex 中的缩进可能不一致,强迫症犯了想将: 缩进空格改 tab;行首的多个 tab 改为单个 参考 [1],空格换 tab 可以: :set noexpandtab :%retab!行首的多个 tab 换单个: :%s/^\t\/\t/gReferences Replac…...
一文读懂ARM安全性架构和可信系统构建要素
一文读懂ARM安全性架构和可信系统构建要素 所谓可信系统(trusted system),即能够用于保护密码和加密密钥等资产(assets)免受一系列的可信攻击,防止其被复制、损坏或不可用(unavailable…...
Voice vlan、ICMP、单臂路由、mux-vlan
目录 一,Voice VLAN Voice vlan配置命令 一,问:已知网络中一台服务器的IP地址,如何找到这太服务器在哪台交换机的哪个接口上编辑 思路: 二,ICMP协议 三,ICMP案例分析编辑 四…...
TCP IP 网络编程(七) 理解select和epoll的使用
文章目录 理解select函数select函数的功能和调用顺序设置文件描述符设置监视范围及超时select函数调用示例 优于select的epoll基于select的I/O复用速度慢实现epoll时必要的函数和结构体epoll_createepoll_ctlepoll_wait基于epoll的服务器端 边缘触发和水平触发 理解select函数 …...
Linux accept和FD_xxx的使用
Linux socket accept功能的作用是在服务器端等待并接受客户端的连接请求。当有客户端尝试连接服务器时,服务器调用accept函数来接受该连接请求,并创建一个新的socket来与该客户端进行通信。 具体来说,accept函数被动监听客户端的三次握手连接…...
树结构及其算法-二叉运算树
目录 树结构及其算法-二叉运算树 C代码 树结构及其算法-二叉运算树 二叉树的应用实际上相当广泛,例如表达式之间的转换。可以把中序表达式按运算符优先级的顺序建成一棵二叉运算树(Binary Expression Tree,或称为二叉表达式树)…...
vue的rules验证失效,部分可以部分又失效的原因
vue的rules验证失效,部分可以部分又失效的原因 很多百度都有,但是我这里遇到了一个特别的,那就是prop没有写全,导致验证某一个失效 例子: 正常写法 el-form-item....多个省略<el-form-item label"胶币" prop"cost"><el-input v-model"form.…...
c#字符串转整数类型
将字符串转换为整数类型。为了方便,C#提供了一个内置的方法TryParse来实现这个功能 字符串(String):表示一串字符的数据类型。整数(Integer):表示不带小数点的数字。解析(Parsing&a…...
【LeetCode】118. 杨辉三角
118. 杨辉三角 难度:简单 题目 给定一个非负整数 *numRows,*生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例…...
【Vue.js】Vue3全局配置Axios并解决跨域请求问题
系列文章目录 文章目录 系列文章目录背景一、部署Axios1. npm 安装 axios2. 创建 request.js,创建axios实例3. 在main.js中全局注册axios4. 在页面中使用axios 二、后端解决跨域请求问题方法一 解决单Contoller跨域访问方法二 全局解决跨域问题 背景 对于前后端分离…...
【车载开发系列】CRC循环冗余校验码原理
【车载开发系列】CRC循环冗余校验码原理 CRC循环冗余校验码原理 【车载开发系列】CRC循环冗余校验码原理一. CRC算法原理二. 生成多项式三. 多项式与其对应代码四. CRC码校验原理1)发送端2)接收端 五. CRC码原理方法1)发送端生成CRC码方法2&a…...
数据库实验:SQL的数据更新
目录 实验目的实验内容实验要求实验步骤实验过程总结 再次书接上文,sql基础的增删改查 实验目的 (1) 掌握DBMS的数据查询功能 (2) 掌握SQL语言的数据更新功能 实验内容 (1) update 语句用于对表进行更新 (2) delete 语句用于对表进行删除 (3) insert 语句用于对表…...
3.线性神经网络-3GPT版
#pic_center R 1 R_1 R1 R 2 R^2 R2 目录 知识框架No.1 线性回归基础优化算法一、线性回归1、买房案例2、买房模型简化3、线性模型4、神经网络5、损失函数6、训练数据7、参数学习8、显示解9、总结 二、 基础优化算法1、梯度下降2、学习率3、小批量随机梯度下降4、批量大小5、…...
大语言模型对齐技术 最新论文及源码合集(外部对齐、内部对齐、可解释性)
大语言模型对齐(Large Language Model Alignment)是利用大规模预训练语言模型来理解它们内部的语义表示和计算过程的研究领域。主要目的是避免大语言模型可见的或可预见的风险,比如固有存在的幻觉问题、生成不符合人类期望的文本、容易被用来执行恶意行为等。 从必…...
x264交叉编译(ubuntu+arm)
1.下载源码 https://code.videolan.org/videolan/x264 在windows下解压;复制到ubuntu; 2.进入源码文件夹-新建脚本文件 touch sp_run.sh 3.在sp_run.sh文件中输入 #!/bin/sh./configure --prefix/home/alientek/sp_test/x264/sp_install --enable-…...
SpringMVC 处理后端日期格式
通过扩展Spring MVC框架的消息转化器 在WebMvcConfiguration中扩展SpringMVC的消息转换器,统一对日期类型进行格式处理 WebMvcConfiguration /*** 扩展Spring MVC框架的消息转化器* param converters*/protected void extendMessageConverters(List<HttpMessag…...
Servlet详解
一.Servlet生命周期 初始化提供服务销毁 1.测试生命周期 package com.demo.servlet;import javax.servlet.*; import java.io.IOException;public class LifeServlet implements Servlet {Overridepublic void init(ServletConfig servletConfig) throws ServletException {…...
NSSCTF做题记录九 | [HUBUCTF 2022 新生赛]checkin
[HUBUCTF 2022 新生赛]checkin <?php show_source(__FILE__); //高亮显示当前代码 $username "this_is_secret"; //给$username赋值 $password "this_is_not_known_to_you"; //给$password赋值 include("flag.php");//here I chan…...
EmuELEC 3.9 vs 4.0+:不同版本写入EMMC的详细操作指南(附常见问题解决)
EmuELEC 3.9与4.0版本EMMC写入全流程实战解析 1. 版本差异与核心机制解析 EmuELEC作为开源游戏系统,其3.9与4.0版本在EMMC写入机制上存在根本性架构差异。理解这些差异是避免操作失误的前提。 3.9版本的技术特点: 采用传统的installtointernal.sh脚本…...
pvr.iptvsimple技术解构:IPTV直播系统构建的底层逻辑与实践指南
pvr.iptvsimple技术解构:IPTV直播系统构建的底层逻辑与实践指南 【免费下载链接】pvr.iptvsimple IPTV Simple client for Kodi PVR 项目地址: https://gitcode.com/gh_mirrors/pv/pvr.iptvsimple 问题定位:IPTV直播系统的技术痛点与架构挑战 IP…...
从线索到成交,陀螺匠帮我打通了客户管理全流程
作为一个从业多年销售,我觉得我在管理客户过程中遇到的这些问题,很多企业多多少少也出现过。比如销售小王跟了一个月的客户,最后发现小李早就联系过了,经常白忙活;好不容易谈成的单子,合同改来改去…...
原创:第三篇(工程落地・首个抓手)电磁筑基:无线充电工程落地总案
第三篇(工程落地・首个抓手)电磁筑基:无线充电工程落地总案 作者:华夏之光永存 总摘要 当前人类电磁学应用仍处于婴孩阶段,现有电磁能量传输技术多局限于有线模式,存在传输损耗高、场景适配性差、灵活性不足…...
深入解析STM32与FreeRTOS内存管理:从理论到实践的最佳配置策略
1. STM32内存结构深度剖析 第一次接触STM32内存管理时,我也被那些专业术语搞得晕头转向。直到把开发板跑死机十几次后,才真正理解RAM和Flash的区别。简单来说,RAM就像你的办公桌面,随时可以读写但断电就清空;Flash则是…...
3个突破限制步骤:res-downloader让网络资源获取变得无拘无束
3个突破限制步骤:res-downloader让网络资源获取变得无拘无束 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在数…...
光伏板缺陷检测实战:从数据集构建到YOLO模型训练全流程解析
1. 光伏板缺陷检测的现实意义 光伏发电作为清洁能源的重要组成部分,其运维效率直接影响发电量收益。我在实地考察中发现,一块被鸟粪覆盖的光伏板,发电效率可能下降30%以上;而热斑效应更会导致组件永久性损伤。传统人工巡检每天最多…...
避坑指南:用高德DistrictSearch获取精准行政边界时遇到的5个典型问题(含最新GeoJson处理技巧)
高德DistrictSearch深度避坑:5个实战难题与GeoJson优化方案 当你在深夜调试地图边界数据时,突然发现某个街道的轮廓出现了诡异的锯齿状变形——这不是恐怖片情节,而是使用高德DistrictSearch时可能遇到的真实场景。作为经历过数十个地图项目…...
告别兼容性问题:手把手教你用canvas和base64转换TIFF图片
前端工程师必备:TIFF图片处理全攻略与实战解决方案 在当今数字内容爆炸式增长的时代,图片处理已成为前端开发中不可或缺的一环。作为专业开发者,我们经常需要面对各种图片格式的兼容性问题,其中TIFF(Tagged Image Fil…...
