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

news2024/11/27 16:34:23

目录

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.coloradmin.cn/o/1172871.html

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

相关文章

为你整理了一份抖音小店的高分打造指南

抖音小店是一种在抖音平台上运营的电商店铺。通过打造一个高分店铺,可以吸引更多用户关注和购买,提升销售业绩。下面四川不若与众将介绍一些打造高分店铺的方法。 首先,店铺名称和简介要吸引眼球。店铺名称应该简洁明了,容易被记住…

Java EE进阶2

包如果下载不下来怎么办? 1,确认包是否存在 2.如果包存在就多下载几次 3.如果下载了很多次都下载不下来,看看是不是下面几步出现了问题? 1)是否配置了国内源 settings.xml 2)目录是否为全英文,存在中文的话就修改路径 3)删除本地仓库的 jar 包,重新下载(可能由于网络的原…

线扫相机DALSA--常见问题六:PoCL供电设置

第一步:Connect power to the board J7 connector(J7供电) 第二步:Use CamExpert to enable the PoCL feature in the the Basic Timing category(打开PoCL)

Appium 移动端自动化测试,触摸(TouchAction) 与多点触控(MultiAction)

一、触摸 TouchAction 在所有的 Appium 客户端库里,TouchAction 触摸对象被创建并被赋予一连串的事件。 规范里可用的事件有: * 短按(press) * 释放(release) * 移动到(moveTo) * 点击(tap) * 等待(wait) * 长按(longPress) * 取消(cancel) * 执行(per…

将Series中每个值v替换为v在Series中升序排列时的位置值s.rank()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将Series中每个值v 替换为v在Series中 升序排列时的位置值 s.rank() 选择题 下列代码执行三次排名索引a的名次值分别为? import pandas as pd s pd.Series([3,2,0,3],index list…

Java高频面试题——Java基础篇

java基本数据类型及对应的字节数?什么是自动拆装箱?int与integer的区别?项目中如何使用? 1.java基本数据类型及对应的字节数? java总共有8中基本数据类型,整型4种,浮点型2种,字符类…

【微服务】mysql + elasticsearch数据双写设计与实现

目录 一、前言 二、为什么使用mysqles双写 2.1 单用mysql的问题 2.2 为什么不直接使用es 2.2.1 非关系型表达 2.2.2 不支持事务 2.2.3 多字段将造成性能低下 三、mysqles双写方案设计要点 3.1 全新设计 VS 中途调整架构 3.2 全表映射 VS 关键字段存储 3.2.1 最大程度…

自定义类型联合体

目录 联合体联合体类型的声明联合体的特点相同成员的结构体和联合体对比联合体大小的计算联合体的应用联合的一个练习 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒 个人主页 🥸🥸&#x1f…

破解密码 LLM(代码LLM如何从 RNN 发展到 Transformer)

舒巴姆阿加瓦尔 一、说明 近年来,随着 Transformer 的引入,语言模型发生了显着的演变,它彻底改变了我们执行日常任务的方式,例如编写电子邮件、创建文档、搜索网络甚至编码方式。随着研究人员在代码智能任务中应用大型语言模型&am…

4K Video Downloader Pro v4.28.0(视频下载器)

4K Video Downloader Pro是一款专业的视频下载软件,支持从YouTube、Vimeo、Facebook、Instagram、TikTok等主流视频网站下载高质量的4K、HD和普通视频。它的操作流程简单,只需复制视频链接并粘贴到软件中即可开始下载。此外,该软件还提供了多…

校园招聘系统

校园管理系统 公共模块学生端游客端企业联系人端校内管理员端超级管理员端企业端 公共模块 登录 用户可以通过验证码、账号密码进行登录。 个人中心 学生端 学生主要为查看招聘信息以及投递等。 首页 简历详情投递 双选会公司详情 公告通知 学生端主要为这些等等&#xf…

线扫相机-TEK(埃科)相机平场矫正详细步骤

采集卡模式: 现场要求 (1) 采集卡连续采集相机图像,并正常显示。 (2) 光源控制在正常工作亮度,使画面亮度不要过低也不要饱和。 (3) 调整相机使画面偏离成像位置,形成虚焦。 (4) 相机拍摄物面使用白纸,调节曝光时间使整…

【鸿蒙软件开发】ArkUI之容器组件Counter(计数器组件)、Flex(弹性布局)

文章目录 前言一、Counter1.1 子组件1.2 接口1.3 属性1.4 事件 1.5 示例代码二、Flex弹性布局到底是什么意思? 2.1 权限列表2.2 子组件2.3 接口参数 2.4 示例代码示例代码1示例代码2 总结 前言 Counter容器组件:计数器组件,提供相应的增加或…

基础课21——知识库管理

1.知识库的概念、特点与功能 智能客服中的知识库是一个以知识为基础的系统,可以明确地表达与实际问题相对应的知识,并构成相对独立的程序行为主体,有利于有效、准确地解决实际问题。它储存着机器人对所有信息的认知概念和理解,这…

【排序算法】 快速排序(快排)!图解+实现详解!

🎥 屿小夏 : 个人主页 🔥个人专栏 : 算法—排序篇 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言🌤️快速排序的概念☁️快速排序的由来☁️快速排序的思想☁️快速排序的实…

网络运维Day02

文章目录 实验环境Linux系统简介Linux发行版RHEL与CentOS国产操作系统 安装CentOS7.9步骤一:虚拟硬件步骤二:为虚拟机安装操作系统为root设置密码首次初始化虚拟机 登录操作系统系统偏好设置 快照LINUX目录结构常见目录及其作用 LINUX磁盘表示方法LINUX中…

Linux常用命令——chage命令

在线Linux命令查询工具 chage 修改帐号和密码的有效期限 补充说明 chage命令是用来修改帐号和密码的有效期限。 语法 chage [选项] 用户名选项 -m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。 -M:密码保持有效的最大天数。 -w&…

毅速丨3D打印在压铸模上大有所为

压铸模是压铸件成型不可缺少的工具。它的作用是将液态的金属或合金浇入到预先准备好的型腔中,并在压力的作用下凝固、成形。3D打印技术在压铸模上的使用,尤其是随形水路的应用,将大幅度提升制造效率。 在传统的压铸模制造中,水路的…

树结构及其算法-二叉排序树

目录 树结构及其算法-二叉排序树 C代码 树结构及其算法-二叉排序树 事实上,二叉树是一种很好的排序应用模式,因为在建立二叉树的同时,数据已经经过初步的比较,并按照二叉树的建立规则来存放数据,规则如下&#xff1…

Linux shell编程学习笔记21:用select in循环语句打造菜单

一、select in循环语句的功能 Linux shell脚本编程提供了select in语句,这是 Shell 独有的一种循环语句,非常适合终端(Terminal)这样的交互场景,它可以根据用户的设置显示出带编号的菜单,用户通过输入不同…