XCP实战系列介绍01-测量与标定底层逻辑介绍
1.概述
在前面一篇文章《看了就会的XCP协议介绍》中详细介绍了XCP的协议,其中包括XCP的一般工作过程,常用命令,XCP测量及标定功能级别的实现,后面断断续续的收到一些读者的私信,想了解下测量及标定的底层代码实现逻辑,那本文就从代码级别对测量及标定是如何实现的进行分析。
需要先说明的是,本文介绍的部分API会对其主要功能进行介绍,不会把API的每段代码拿来一一分析,大家能结合手中项目对照学习,效果会更好。
2.XCP测量实现逻辑
首先我们看下测量,在前文中我们提到测量的本质就是对某个固定地址的变量的值进行读取。也提到了Poling模式是基于CTO通过发送命令及应答形式实现,DAQ是周期性调用不同周期的Event来实现。
2.1 Poling模式实现逻辑
Poling模式下,使用主结点发送的命令,通过指定的XCP地址来提取从结点的ECU内部的数据,并通过从结点的应答将该数据传送给主结点,如此循环往复来实现的。为了取出数据,使用PID为“0xF4”的命令“SHORT_UPLOAD”
对应在软件底层调用的API路径如下: 其中,Xcp_TIRxIndication(Xcp_ChannelTypeXcpChannel,uint8*CmdPtr)函数在Can中断中会被调用,XCP传输层接收到XCP CTO数据包时都必须调用该函数;
Xcp_CmdStd_Upload()函数会判断需上传的字节数最大不超过CTO-1,否则只会复制最大的有效字节数;
Xcp_CmdHlp_ReadMta()函数确认读取的内存地址有效后执行读取操作,会调用XcpAppl_MeasurementRead()函数复制相应地址上的信息。
2.2 DAQ模式实现逻辑
DAQ测量模式是主机一次性配置好所有要读取的变量,并关联ECU端的不同事件channel,一旦ECU对应的事件发生(例如100ms周期),主动上传数据给主机。
对应在软件底层调用的API路径如下:
与Poling模式比较大的区别是Poling模式是周期性的被调用,Poling模式则是在中断中才会触发。
另外两者获取测量值的API也不同,再具体到API级别的逻辑由于代码量巨大,无法一一展示,如果大家有兴趣后面可以单独私聊交流。
3.XCP标定实现逻辑
当前博主在做的项目是基于Overlay来实现的,即在标定开始前会先发送切面指令,从Reference Page切换到WorkigPage,在WorkigPage完成标定工作。
切面最主要的策略是在XcpAppl_SetCalPage()函数里完成的,实现的逻辑包括: 校验参数(模式、Page及Segment等)的合理性; 对寄存器进行设置,使能Overlay功能; 计算Overlay Block的大小; Copy Overlay Block中的数据(Flash→Ram)。