汽车标定技术(三)--XCP协议如何支持测量功能
目录
1. 概述
2. 测量方式 -- Poll
3. 测量方式 -- DAQ
3.1 ODT概念模型
3.2 DAQ List概念
3.3 ODT 绝对编号和相对编号
3.4 静态DAQ和动态DAQ模式
(1)静态DAQ
(2)动态DAQ
4.小结
1. 概述
在该系列的首篇文章汽车标定技术(一):XCP概述-CSDN博客,我们知道标定系统中Master与Slave的命令交互帧叫做CTO(Command Transfer Objects);Master与Slave的测量数据交互帧叫做DTO(Data Transfer Objects)。
其中关于DTO分为两种:
- Slave(ECU)传输给Master(标定上位机)的数据帧:DAQ(Data AcQuisition)
- Master传输给Slave的数据帧:STIM(Stimulation)
其数据流如下图所示:
关于DAQ这个比较容易理解,实际上,做过标定的同学下面红框两个动作都非常熟悉:
左边表示与ECU建立连接,右边闪电表示master通知ECU:请开始上传我想要的数据吧!
数据开始传输后,ECU不需要得到Master的响应,可以按照预定义的周期一直发送数据,直到Master关闭闪电:ECU,你不要再传数据了,我不想看了。
至于STIM的功能使用则需要看你处于汽车开发的哪个阶段。一般来说,标定测量会贯穿整个汽车ECU的开发,因此在不同阶段有可能是不同工程师进行标定,台架或者仿真的同学如果家里有条件可能会用到STIM,但常年跑三高的同学就不怎么使用STIM,因为直接上车干了。
那么STIM到底是干什么的?我们留在第4节进行描述。
2. 测量方式 -- Poll
在概述中,我们看到master可以选择不使用闪电进行测量,那除了这种方式还有没有其他方式进行测量呢?答案肯定是有的。
Master问:"我要看观测量A的值,A的地址在0x00000001“,Slave答:”这个地址存的数据是2,主人“。这种一问一答的方式我们把它叫做轮询(Poll),很明显,这种方式就是用的CTO,而不是DTO了。如下图:
在XCP协议里提供了一条指令SHORT_UPLOAD(0xF4),具体如下:
以下图为例,对观测量Triangle选择Poll的方式进行测量,上位机就会使用F4指令,并把目标地址下发给ECU。
我们来看具体的数据流:
可以看到,ECU根据上位机下发的地址去获取数据,并返回给上位机。但是各位发现没有,这种测量方式一问一答只能针对一个特定的变量;如果我想在10ms同时获取5个观测量的值,这种方式肯定是不可能的。
所以,为了解决这种并发的情况,同时减少这种不必要的问答帧对总线的负荷,DAQ应运而生。
3. 测量方式 -- DAQ
我们首先以一个数据流来具象地体会一下DAQ这种方式,如下图:
可以看到,当上位机Master下发CMD通知ECU开始进行测量时,ECU首先答复:”我要开始咯“ ,然后就开始通过DTO-DAQ的方式不同的传输数据。这种方式只需要上位机提前通知ECU,我想要以什么样的速率获取哪些观测量的数据,ECU就会自动上传数据,而不再需要轮询这种问答制的低效率测量方式。
那么我们具体来看一下DAQ是如何实现的。
3.1 ODT概念模型
在我们讨论DAQ之前,我们先思考一个问题。
以XCP on CAN为例,如果我们想用DAQ的方式进行数据的测量,那么肯定希望Slave传递尽可能多的数据,比方说一帧标准CAN 报文,数据域8个字节,我恨不得这八个字节全是需要的数据,这样就在最有限的资源下干最多的事情。但实际情况,这是不可能的,假设现在有20个1 byte的观测量要以10ms的周期进行测量,这时候至少需要slave发送3帧报文,如果全是都是数据,master是如何直到哪一帧报文对应哪些数据呢?基于这种情况,XCP就规定DTO帧至少有一个字节是用来表示身份,如下:
因此,我们可以看到,在DTO的Identification Field至少有一个PID的身份信息。其余的FILL、DAQ的含义我们后面再讲。
接着我们来看,XCP对于要测量的数据是如何进行抽象的。首先祭出一张大家都看过的图:
这张图的知识点比较密集,但属于会者不难。
在XCP协议中,有几个概念需要理解,分别是Element、ODT、ODT Entry
- Element:观测量的具体值,存放在RAM中
- ODT:Object Description Table,一个表格,用于存放ODT Entry
- ODT Entry:我习惯说成ODT 条目,描述了Element的具体RAM地址和数据长度
Slave根据ODT中的描述,把目标观测量数取出组成一个标准CAN帧(一个ODT一帧报文),从上图我们可以看到,ODT里面总共有7个条目,意味着Slave要根据这个ODT来获取7个观测量的数据组成一个CAN报文,但实际上一帧标准CAN只有8个字节,PID占据一个字节,那只有7个字节可以用了,是不是就意味着上图中描述的每个Element的数据长度均为1;
如果上面所有7个观测量都变成了2个Byte,那么总共要传输的数据长度就变成了14个,此时需要CAN 报文2帧,填充方式如下:
这个时候,ODT#0中就有4个ODT enrty,ODT#1中也有4个ODT entry;因此我们可以直到,ODT entry不一定描述的完整观测量地址和长度,它只需要告诉slave在什么地方拿多长的数据即可,具体解析和拼接由master完成。总结下来,一个ODT中可以包含1~7个ODT Entry。如果参数占用1byte,则一个ODT可以容纳7个ODT Entry;如果参数占用2byte,则一个ODT可以容纳3个ODT Entry;如果参数占用4byte,则一个ODT可以容纳1个ODT Entry;如果参数有3个2byte和1个1byte,则一个ODT可以容纳4个ODT Entry。
3.2 DAQ List概念
多个ODT组成一个DAQ List,如下:
DAQ List可以有多个,对应不同的测量周期,例如 10ms对应DAQ list0、100ms对应DAQ list1。因此就引出了ODT的编号问题,比如说两个DAQ 的ODT#0怎么分别;接着往下看。
3.3 ODT 绝对编号和相对编号
ODT绝对编号是指每个ODT编号在所有的DAQ List中是唯一的。比如:有2个DAQ List(DAQ0和DAQ1),每个DAQ中都有7个ODT,则DAQ0中的ODT编号是0~6,则DAQ1中的ODT编号是7~13。
相对ODT编号是指每个DAQ List中的ODT编号都是从0开始编号。如比如:有两个DAQ List(DAQ0和DAQ1),每个DAQ都有7个ODT。对于DAQ0来说,ODT编号是0~6,对于DAQ1来说,ODT编号也是0~6。
除此之外,XCP使用了AG(ADDRESS_GRANULARITY)规定了element的对齐方式, 可以取值1、2、4。在配置中多使用1字节对齐。基于CAN的传输,一帧只能传输8个字节。假如标识区采用如下形式,AG=1,则对齐的方式就是1字节对齐,即不管参数是1、2、4字节都可以向该CAN帧中填。
如果AG=2,对于1byte的参数1和参数2,及2byte的参数3排列如下所示,参数1和参数2都是1byte,为保证AG=2,其后使用填充位AA补齐。
3.4 静态DAQ和动态DAQ模式
数据采集提供了DAQ静态采集和动态采集的模式,具体如下:
DAQ配置信息可通过指令GET_DAQ_PROCESSOR_INFO(0xDA)获取
(1)静态DAQ
可以看到,静态配置下,DAQlist数量、ODT入口数量都是固定的,但是每个DAQ列表中的ODT个数可以不一样。
(2)动态DAQ
从上图可以看出,动态DAQ中,DAQlist数量是由配置的DAQ(可以为0,1,2,。。。。)+配置好的DAQ(DAQ_COUNT)决定,非固定的;ODT数量由ODT_COUNT决定;而ODT入口长度也可以灵活配置。
在配置动态DAQ列表时,需要严格遵守以下时序:FREE_DAQ, ALLOC_DAQ, ALLOC_ODT ALLOC_ODT_ENTRY,首先,主机发送FREE_DAQ指令来清空DAQ;然后发送ALLOC_DAQ分配DAQ列表数量;接着,发送ALLOC_ODT将所有的ODT分配给DAQ列表;最后发送ALLOC_ODT_ENTRY将所有的ODT入口分配给ODT。具体如下:
动态配置流程
1)释放DAQ(D6):清除之前配置好的DAQ列表、ODT和ODT_Entry等,完成之后在这里会将DAQ配置状态置为FREE
2)分配DAQ(D5):上位机会根据命令(DA)中的DAQlist数量发送命令;
完成之后将DAQ配置状态置为DAQ状态
3)分配ODT(D4):这里的ODTcount推测是根据在上位机中拖取观测量的数量,如果拉出9个观测量,每个观测量大小为4个字节,每一帧可上传7个字节,因此ODTcount就为(4*9)/7=5.1,因此至少需要6个ODT. 完成之后将DAQ配置状态置为ODT状态
4)分配ODT ENTRY(D3):
这里就是给每一帧数据分配几个数据,还是接着上面的,第一帧可上传7个字节的数据,那么如果每个数据的大小均为4个字节,就只能上传1个数据加上下一个数据的前三个字节,因此ODTENTRY为2;那么第二帧接着上面的就可以上传第一帧未传完的剩余一个字节(1byte)、第三个数据(4byte)以及第四个数据的前两个字节(2byte),所以第二帧的ODTENTRY为3;以此类推。
两个DAQ list配置数据流如下:
当有两个daqlist的时候,CANape在动态配置时顺序如下:AllocDAQ(分配2个daqlist)、AllocOdt(给两个daqlist分配好odt)、AllocOdtEntry(给2个daqlist的odt分配好entry),并不是之前我理解的每一个daqlist分配好odt和entry之后再处理另一个daq,具体看如下log截图:
分配完毕之后再设置daq指针,往该地址里写相应的测量量的数据;如下
4.小结
本篇内容,我们简单把DAQ的基本概念和实现方式做了初步梳理,大家要注意理解DAQ动态分配的数据流,接下来我们讲STIM\Bypassing,以及不同传输协议对应的帧结构区别
相关文章:

汽车标定技术(三)--XCP协议如何支持测量功能
目录 1. 概述 2. 测量方式 -- Poll 3. 测量方式 -- DAQ 3.1 ODT概念模型 3.2 DAQ List概念 3.3 ODT 绝对编号和相对编号 3.4 静态DAQ和动态DAQ模式 (1)静态DAQ (2)动态DAQ 4.小结 1. 概述 在该系列的首篇文章汽车标定技…...

[c++]你最喜爱的stringstream和snprintf性能深入剖析
最近写一个程序中两个差不多的模块,一个使用了snprintf输出中间数据,另一个偷懒使用stringstream。结果你猜怎么着?居然压帧了!!到底是谁拖了性能的后退? 来自阿里云的性能分析实验 我上网一搜࿰…...

windows 用vs创建cmake工程并编译opencv应用项目生成exe流程简述
目录 前言一、安装opencv(1)下载(2)双击安装(3)环境变量和system文件夹设置 二、打开vs创建项目三、编辑cpp,.h,cmakelist.txt文件(1)h文件(2&…...

QML 仪表盘小示例
本次项目已发布在CSDN->GitCode,下载方便,安全,可在我主页进行下载即可,后面的项目和素材都会发布这个平台。 个人主页:https://gitcode.com/user/m0_45463480怎么下载:在项目中点击克隆,windows:zip linux:tar.gz tar # .pro TEMPLATE = appTARGET = dialcontrol#…...

力扣206. 反转链表
题目: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2: 输入:head [1,2] 输出:[2,1] 示例 3:…...

深度学习之基于Tensorflow卷积神经网络花卉识别系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习是一种机器学习方法,它通过模拟人脑神经网络的结构和功能来实现对数据的自动分析和学习。卷积神…...

leetcode链表
这几天手的骨裂稍微好一点了,但是还是很疼,最近学校的课是真多,我都没时间做自己的事,但是好在今天下午是没有课的,我也终于可以做自己的事情了。 今天分享几道题目 移除链表元素 这道题我们将以两种方法开解决&…...

Kali Linux渗透测试的艺术
Kali Linux(Kali)是专门用于渗透测试的Linux操作系统,它由BackTrack 发展而来。在整合了IWHAX、WHOPPIX 和Auditor 这3 种渗透测试专用Live Linux 之后,BackTrack正式改名为Kali Linux。 BackTrack是相当著名的Linux发行版本。在…...

2023年最新版潮乎盲盒源码含搭建教程
后台开发语言:后端 Laravel 框架开发 前端开发框架:uniappvue 环境配置: php7.4 mysql5.6 nginx1.22 redis(建议宝塔面板或 lnmp) 源码获取请自行百度:一生相随博客 一生相随博客致力于分享全网优质资源&#x…...

[GitLab] 安装Git 指定版本
卸载旧版本 检查是否已经安装 git --version如果已经安装,先卸载 yum -y remove git安装新版本 在GitHub上选择需要下载的版本 Git版本 在/usr/local/目录下新建文件夹:git,并在/usr/local/git/文件夹内下载压缩包 wget https://github…...

vue中ref和$refs
1.作用 利用ref 和 $refs 可以用于 获取 dom 元素 或 组件实例,也可以在父组件获取子组件,从而调用子组件的方法。 2.特点: 查找范围 → 当前组件内(更精确稳定) 3.语法 1.给要获取的盒子添加ref属性 <div ref"chartRef"&…...

CRM怎样帮助您的企业进行营销管理?
CRM助力企业营销管理,为企业降本增效提升投入产出比。CRM软件是如何实现的呢? 扩大线索量 想要精准获客的第一步是要扩大线索量,多渠道营销推广是很好的方法。例如: 1.线下展会线上Webinar等市场活动 2.搭建微信、微博、…...

Gerrrit 管理员常用命令
1. replication插件重新加载 当修改replication配置文件(replication.config),需要重启gerrit生效,或者重新加载replication。 # 重新加载replication插件 ssh -p 29418 usernamegerrit.company.com gerrit plugin reload repli…...

深入理解强化学习——多臂赌博机:增量式实现
分类目录:《深入理解强化学习》总目录 至今我们讨论的动作—价值方法都把动作价值作为观测到的收益的样本均值来估计。下面我们探讨如何才能以一种高效的方式计算这些均值,尤其是如何保持常数级的内存需求和常数级的单时刻计算量。 为了简化标记&#x…...

视频批量混剪剪辑软件类似剪映设计一个模板后, 视频,图片,文字,转场,音频,特效都可以系统随机
随着自媒体时代的到来,越来越多的人加入到了视频创作行列。然而,视频剪辑是一项繁琐的任务,特别是当你需要批量处理多个视频时。为了提高效率,一款名为“视频闪闪”的批量剪辑软件应运而生。 www.shipinshanshan.com “视频闪闪”…...

优维低代码实践:打包发布
导语 优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。…...

js深度学习(三)
循环 var i0 for(;i<10;){ console.log(i) i } while(i<10){ console.log(i) i } var i100; for(;i--;){ console.log(i) }2、引用值 typeof:number string boolean Object(object/array/null出现是为了指定为空对象/)undefined function typeof a >unde…...

JVM类的声明周期
文章目录 版权声明生命周期概述加载阶段查看内存中的对象 连接阶段连接阶段之验证连接阶段之准备连接阶段之解析 初始化阶段练习题目一练习题目二练习题目三练习题目四 使用阶段卸载阶段总结 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明…...

html将复选框变为圆形样例
html将复选框变为圆形样例 说明目录使用对勾图标实现圆形复选框原复选框html代码及默认样式取消复选框未勾选前的样式新增复选框未勾选前的样式新增复选框勾选后的样式获取复选框选中后的value值 使用CSS样式写对勾图标实现圆形复选框 说明 这里记录下用原生html实现将原复选框…...

笔记软件 Keep It mac v2.3.3中文版新增功能
Keep It mac是一款专为 Mac、iPad 和 iPhone 设计的笔记和信息管理应用程序。它允许用户在一个地方组织和管理他们的笔记、网络链接、PDF、图像和其他类型的内容。Keep It 还具有标记、搜索、突出显示、编辑和跨设备同步功能。 Keep It for mac更新日志 修复了更改注释或富文本…...

uni-app 开发的H5 定位功能部署注意事项
一、H5部署的时候,如果设计到定位功能,需要注意以下几点 1、打包部署的时候需要在Web配置-定位和地图里面勾选一个地图,并配置key 2、打包部署需要域名是https协议的,大多数现代浏览器要求在HTTPS协议下才能够访问地理位置信息&a…...

CY5-COOH脂溶性羧基荧光染料1032678-07-1
Cyanine5-COOH是一种荧光染料,它CAS号1032678-07-1,分子式为C32H39ClN2O2,分子量为519.12。Cyanine5-COOH具有良好的光稳定性和荧光亮度,可以用于生物学研究、诊断、药物筛选等领域。 Cy5-COOH (来自星戈瑞的花菁染料) 含有羧基官…...

【CSS】div 盒子居中的常用方法
<body><div class"main"><div class"box"></div></div> </body>绝对定位加 margin: auto; : <style>* {padding: 0;margin: 0;}.main {width: 400px;height: 400px;border: 2px solid #000;positio…...

Pytorch网络模型训练
现有网络模型的使用与修改 vgg16_false torchvision.models.vgg16(pretrainedFalse) # 加载一个未预训练的模型 vgg16_true torchvision.models.vgg16(pretrainedTrue) # 把数据分为了1000个类别print(vgg16_true) 以下是vgg16预训练模型的输出 VGG((features): S…...

webgoat-Path traversal
Path traversal 路径(目录)遍历是一种漏洞,攻击者能够访问或存储外部的文件和目录 应用程序运行的位置。这可能会导致从其他目录读取文件,如果是文件,则会导致读取文件 上传覆盖关键系统文件。 它是如何工作的&#…...

P8976 「DTOI-4」排列,贪心
题目背景 Update on 2023.2.1:新增一组针对 yuanjiabao 的 Hack 数据,放置于 #21。 Update on 2023.2.2:新增一组针对 CourtesyWei 和 bizhidaojiaosha 的 Hack 数据,放置于 #22。 题目描述 小 L 给你一个偶数 n 和两个整数a,b…...

使用 Python 进行自然语言处理第 5 部分:文本分类
一、说明 关于文本分类,文章已经很多,本文这里有实操代码,明确而清晰地表述这种过程,是实战工程师所可以参照和依赖的案例版本。 本文是 2023 年 1 月的 WomenWhoCode 数据科学跟踪活动提供的会议系列文章中的一篇。 之前的文章在…...

uni-app---- 点击按钮拨打电话功能点击按钮调用高德地图进行导航的功能【安卓app端】
uniapp---- 点击按钮拨打电话功能&&点击按钮调用高德地图进行导航的功能【安卓app端】 先上效果图: 1. 在封装方法的文件夹下新建一个js文件,然后把这些功能进行封装 // 点击按钮拨打电话 export function getActionSheet(phone) {uni.showAct…...

通讯录详解(静态版,动态版,文件版)
💓博客主页:江池俊的博客⏩收录专栏:C语言进阶之路👉专栏推荐:✅C语言初阶之路 ✅数据结构探索✅C语言刷题专栏💻代码仓库:江池俊的代码仓库🎉欢迎大家点赞👍评论&#x…...

在windows中搭建vue开发环境
1.环境搭建 具体环境搭建步骤参考链接 注意该博客中初始化命令: vue init webpack MyPortalProject需改为小写: vue init webpack myportalproject不然会报错 Warning: name can no longer contain capital letters2.创建第一个vueelement ui项目 …...