AUTOSAR实战教程--标准协议栈实现DoIP转DoCAN的方法
目录
软件架构
关键知识点
第一:PDUR的缓存作用
第二:CANTP的组包拆包功能
第三:流控帧的意义
配置过程
步骤0:ECUC模块中PDU创建
步骤1:SoAD模块维持不变
步骤2:DoIP模块为Gateway功能添加Connection
步骤3:DoIP模块为Gateway新增LA/TA/SA
步骤4:PDUR模块为Gateway功能创建路由
步骤5:PDUR模块为数据缓存创建Buffer
步骤6:CanTp配置
步骤7:CanIf中新增Pdu配置
全文总结
软件架构
设计方案如下图:
整个数据流传递非常简单明了,这整个网络结构看下来,其实重点和难点在诊断,而不在DoIP。好好理解这张图,任何一个函数的错误调用都会影响到整体功能的实现。诊断数据流的传递如下:
为了实现这个效果,有以下三点需要重点处理的地方。
关键知识点
第一:PDUR的缓存作用
CANTP本身没有缓冲区,所以面对DoIP大量的数据传来,必须有个地方去缓存这么大的数据,否者CANTP的组包无从谈起。根据上图,CANTP的上层是PDUR,所以只能在PDUR里面做缓冲池。具体方法后文介绍。
第二:CANTP的组包拆包功能
首先是PDUR调用CANTP的函数CanTp_Transmit( )告诉CANTP当前我这边有数据来了,数据长度有多长。然后CANTP不紧不慢的按自己的吞吐量,调用PduR_CanTpCopyTxData( )去PDUR的缓冲区取数据,一次又一次,直到该缓冲区为空。
因此,为了保证数据一致性,上层应该锁定该内存区域,直到出现指示。
当发送缓冲区被锁定时,上层不能在缓冲区内写入数据。当接收缓冲区被锁定时,CAN - T传输层不能保证缓冲区的数据一致性。上层既不能读也不能写缓冲区中的数据。
在咱们DoIP转CAN这个数据流测试下来,CANTP之于诊断就像人的脊髓之于整个人的作用(脊髓能够不经大脑产生膝跳反射),大脑肯定是DCM和DEM,但CANTP也负责一些简单的诊断协议栈标准的实现,比如UDS中甚为繁琐的种种时间参数就是CanTP实现的。还有流控帧的封装发送/接收判断也是CanTP实现的(也就是CANTP之上的模块如DCM根本不会接到流控帧的任何信息)。
![]() | ![]() |
流控帧用于调整发送方以适应接收方的能力, |