专栏名称: 汽车MCU软件设计
汽车MCU软件工程师,分享汽车功能安全、网络安全和AutoSAR
目录
相关文章推荐
知乎日报  ·  知乎瞎扯|人可以后知后觉到什么程度? ·  3 小时前  
知乎日报  ·  时隔 24 ... ·  昨天  
知乎日报  ·  有哪些东西是被过度设计的? ·  2 天前  
Quora文选英语  ·  Quora_你最近最快乐的时刻是什么时候?【 ... ·  2 天前  
知乎日报  ·  世界上第一个养猫的人是谁? ·  3 天前  
51好读  ›  专栏  ›  汽车MCU软件设计

汽车标定技术--关于XCP里ADDRESS_GRANULARITY的理解

汽车MCU软件设计  · 公众号  ·  · 2024-03-13 18:25

正文


目录

1.AG的理解

2.不同指令的填充方式

2.1 Connect指令

2.2 Upload指令

2.3 Download指令

3.小结



最近和朋友聊到一个XCP中关于ADDRESS_GRANULARITY的问题,主要分歧点在各指令基于AG对于数据帧的填充方式,因此记录下来,方便后续查找。

1.AG的理解

关于ADDRESS_GRANULARITY,资料其实很少,仅仅只在XCP协议里简单提了两句。原文如下:
An entry in an ODT references a data element by its address, the address extension, the size of the element in ADDRESS_GRANULARITY (AG) and for a data element that represents a bit, the bit offset.
本想着一两句描述,但自己都有点迷糊了,因此这还得从ODT和ODT Entry开始说起。
首先我们先看一个DAQ的Log数据:
在该log中,上位机(CANape)选择了DAQ LIST之后开始进行测量,下位机自动就将数据返回;那么这个数据到底从ECU的memory哪个位置来的? 这就必须再来一个图。
在XCP的世界里,每一个观测量都称为Element,它在ECU Memory中的地址和长度的描述信息按照固定格式存放到ODT(Object Descriptor Table)中,这个描述信息叫做ODT Entry。
以CAN为例,根据这个Entry的描述到ECU memory的目标地址取出数据,组成返回给上位机的数据帧,这个帧叫做DAQ-DTO;从代码实现角度如下:
那么这跟今天要聊的AG有啥关系呢?
首先我们明确AG字面意思为地址粒度,表示一个地址里面element的数据长度,单位为Byte,可能的值为{1,2,4};
其次在协议里要求,ODT_Entry指向的数据长度与AG有如下关系:
ODT_Entry指向元素Size必须大于等于AG(最小数据长度要求);

Address[AG] mod (GRANULARITY_ODT_ENTRY_SIZE_x[BYTE] / AG[BYTE]) = 0 (地址对齐要求)

SizeOf(element described by ODT entry)[AG] mod (GRANULARITY_ODT_ENTRY_SIZE_x[BYTE] / AG[BYTE]) = 0(数据对齐要求)

这意味着如果AG为2,那么ODT_Entry关联的数据元素的大小就至少为2,并且数据的地址、长度必须进行对齐。
因此AG在整个XCP的数据通信上是非常关键的基础单位信息。
一旦AG固定后,那么上下位机通信的数据长度单位就确定了,但是回过头来,一般来讲我们用的MCU最小单位通常都是Byte,如果AG是2,意味着下位机软件势必要对通信数据做填充处理,因此有了下面的议题。

2.不同指令的填充方式

2.1 Connect指令

在0xFF连接指令里,下位机回根据底层代码的配置将AG的预设值返回给上位机,上位机拿到信息后做好后续数据处理的准备。
AG的不同,影响的是上下位机element地址计算,如下图:
在不同AG值,同样的地址所包含的数据个数是不一样的,所以在实际操作中,假设上下位机双方约定AG=2,那么上位机就认为下位机的一个地址包含是一个WORD,而实际上我们接触的MCU都基本是按byte编址(一个地址一个Byte),如果此时观测量在MCU内部只有1个Byte,那么为了保证上位机获取数据的正确性,就必须在下位机软件里对数据做填充处理,如下:

2.2 Upload指令

Upload指令主要是获取ECU 指定memory的数据,指令格式如下:
响应格式如下:
以AG = 1、标准CAN为例,常见的时序如下:
那如果AG = 2,那这时候MCU就要做格式填充考虑了,具体如下( 没有考虑大小端 ):
如果AG=4,这时候其实一帧报文就只能传一个数据了,如下图所示:
这就解释了协议了这句话(用1、2、3等填充字节对数据帧进行填充):
Depending on AG 1, 2 or 3 alignment bytes must be used in order to meet alignment
requirements.

2.3 Download指令

该指令主要用于标定,如下:
协议里表示:
If AG = DWORD, 2 alignment bytes must be used in order to meet alignment requirements.
ELEMENT is BYTE, WORD or DWORD depending upon AG
因为上位机下发的肯定是DWORD,不会存在byte或者word情况 ,因此这里的填充主要是针对指令的填充。

与AG相关的指令还有DAQ测量、编程等等,搞懂原理,这里就不一一例举。

3.小结

从实际代码来看,基本不存在对AG的配置,定死AG=Byte,如下:
那至于为啥要提出AG,个人认为应该还是和标定的memory介质的编址方式\位宽有关,如果大家有这方面的经验,欢迎讨论。



往期回顾:

1.汽车标定精选

汽车标定技术--标定概念详解
汽车标定技术--Bypass的前世今生
万字长文:汽车标定技术--XCP概述

2.AUTOSAR 精选

AUTOSAR CryptoStack--CSM Job夹带了哪些私货
AUTOSAR 诊断栈分析(一)
AUTOSAR OS概述(一)






请到「今天看啥」查看全文