中国汽车工程师之家--聚集了汽车行业80%专业人士 

论坛口号:知无不言,言无不尽!QQ:542334618 

本站手机访问:直接在浏览器中输入本站域名即可 

搜索附件  
左侧广告
附件中心&附件聚合2.0
For Discuz! X2.5 © hgcad.com

AUTOSAR入门-PduR模块w16.jpg

 

AUTOSAR入门-PduR模块:
AUTOSAR入门-PduR模块



      AUTOSAR里面的模块需要进行交互,例如DoIP模块想给Dcm模块交互,在AUTOSAR CP构架的单片机程序里面没有进程的概念,那么就直接函数调用是可以实现的,但是随着AUTOSAR中模块的增多,比如有10个模块,两两都需要交互,那么需要100个函数接口来完成,接口太多写代码的能累死,这部分代码应该是能提取出来复用的,而且如果修改需求,需要新增函数,修改代码要直接修改函数成本太高。这时候就有一个思路,如果需要模块间交互同样都调用一个接口,这个接口形成一个新的模块PduR,然后PduR去查表,表里面规定谁可以和谁交互,那种类型的报文可以发给谁,这张表可以灵活配置。而且系统中只有这么一张表,集中维护,避免报文乱发。那么PduR就是干这个活的,作为中间人查表转发。如下图:



       这个很像地下党情报工作,有很多间谍和情报的部门需要通信,这中间需要一个中间人,也就是线人,不是间谍想给谁通信就可以的,必须要通过中间人才能传递消息,避免混乱。如果没有中间人,间谍得到情报后乱给人不就暴露了,如果固定死给一个明面上的部门,那这个部门消失了怎么办,为了灵活性和安全性,这个中间人缺少不了,而且只有一个中间人,这就是单线联系。单线联系一般是指地下工作时,为了安全起见,一个地下工作者只和一个上司也可能是上线联系,没有第二个人知道,也没有横向关系。

这里我们还是以:AUTOSAR入门-基于以太网诊断为例,AS平台代码结合AUTOSAR官网规范进行讲解,理论联系实际进行讲解PduR模块。


    AUTOSAR_SWS_PDURouter.pdf

参考上篇文章Dcm去官网下载AUTOSAR_SWS_PDURouter.pdf,先看简介:



       首先,我们可以知道这个模块是干啥的,提供路由服务,路由就是告诉包该往哪里发,包是I-PDU的,这是个新名词,我们可以查阅文档第2部分缩略词,如下:



交互层面的PDU协议数据单元(ProtocolData Unit),这里出现了一个词协议,还记得Dcm中的提到的ISO14229 里面是关于诊断的UDS协议,那么我们发送的UDS协议报文就是一个PDU,而且是一个I-PDU。回顾下这个UDS报文从client发送到板卡里面Dcm模块都走了哪些路:网卡驱动-》网络接口-》LWIP网络协议栈-》SoAd模块-》DoIP模块-》PduR模块-》Dcm模块。

继续看这个简介:

接口类型这里就是网卡接口SoAd,其实DoIP模块里面是以SoAd的接口跟Dcm交互的。

协议类型这里就是Dcm,Dcm里面要处理UDS协议。

最后我们可以看到:DoIP模块-》PduR模块-》Dcm模块

图中最后一句说,这个路由的配置是静态的,是指路由表在系统编译前是配置好的,参与编译后这个路由表是不能更改的。那这个表是从哪里来的?

答案就是配置工具,我们运行scons studio:



可以看到SoAd模块收到的报文路由给了Dcm

2. 功能说明



功能规范需要的时候自己看吧,大致就是说的怎么路由转发PDU报文。

3. API函数说明



API里面有函数接口的说明,这里我们结合代码看下。

我们看的这份规范的交互标准是由三个接口函数组成:

AAA_BBBTpStartOfReception:BBB发给AAA,准备接收报文

AAA_BBBTpCopyRxData:BBB发给AAA,拷贝报文

AAA_BBBTpRxIndication:BBB发给AAA,接收成功确认

有点遗憾的是我们的AS平台的Arccore代码比较老旧,报文传递的方式是由两个接口函数组成的:

AAA_BBBTpProvideRxBuffer()// BBB发给AAA开始传输报文

BBB模块调用memcpy函数,不需要接口函数,直接拷贝报文

AAA_BBBTpRxIndication()// BBB发给AAA传输报文完毕

其实思路是一样的,都是三步,AS平台两个函数实现对于学习来说还能简单一点。

我画了一个图如下:



下面我们具体来看下:

PduR_SoAdTpProvideRxBuffer
PduR_SoAdTpProvideRxBufferPduR_ARC_ProvideRxBuffer(PduId,sduLength, pduInfoPtr, 0x03);const PduRRoutingPath_type *route =PduRConfig->RoutingPaths[PduId];const PduRDestPdu_type * destination = route->PduRDestPdus[0];if (PduR_IsUpModule(destination->DestModule)) {  retVal = PduR_ARC_RouteProvideRxBuffer(destination,TpSduLength, PduInfoPtr);switch (destination->DestModule) {case ARC_PDUR_DCM:    retVal = Dcm_ProvideRxBuffer(destination->DestPduId,TpSduLength, PduInfoPtr);}
这里面有路由查找过程,是PdduR模块的精髓,下面用代码来说明下:

PduId是SoAd_Config.DoIpTargetAddresses[targetIndex].rxPdu,这个值在配置文件中配置的为:



一个I-PDU由ID进行辨识,BSW中的每一个模块处理I-PDU都有一个ID列表,处理I-PDU都需要一个查找表,在PduR路由数据过程中不对数据进行任何修改,ID作为接口参数。根据这个Id,去PduR模块里面找到路由route(工具可以配置路由)的目的地Dcm模块:



根据PduID找到路由表里面的路由route,然后根据route找到destination,这里就是Dcm。那么路由表PduRConfig在哪里?









可以看到DestModule就是ARC_PDUR_DCM

上面就是查路由表的代码路径,是PduR模块的精所在。在工具链sconsstudio里面也可以看到。

PduR_SoAdTpRxIndication
PduR_SoAdTpRxIndicationPduR_ARC_TpRxIndication(dcmRxPduId, result, 0x04);PduR_ARC_RxIndication(PduId, &PduInfo, serviceId);PduR_ARC_RouteRxIndication(destination, PduInfo);switch (destination->DestModule) {case ARC_PDUR_DCM:    Dcm_RxIndication(destination->DestPduId,*PduInfo->SduDataPtr);  }
这个函数同上也是找路由找到处理函数在Dcm模块

4. 时序图

这个是AS代码里面目前的过程。最新的AUTOSAR代码可以参考:https://github.com/openAUTOSAR/classic-platform

规范里面的流程如下:





后记:

       PduR模块核心思想不复杂,上面讲的也比较简略,但是精髓找路由的过程结合代码给出了,可以在代码里面对照打log,做我们的AUTOSAR入门-基于以太网诊断试验运行实践下。如果你代码环境还没搭建起来,请参考:AUTOSAR入门-AS开源代码运行环境搭建。

    Talk is cheap,show methe code!后续会继续更新,纯干货分享,无广告,不打赏,欢迎转载,欢迎评论交流!

往期见话题标签:AUTOSAR入门
AUTOSAR入门-PduR模块w16.jpg
         同一主题附件:
    AUTOSAR入门-PduR模块w1.jpg
    AUTOSAR入门-PduR模块w2.jpg
    AUTOSAR入门-PduR模块w3.jpg
    AUTOSAR入门-PduR模块w4.jpg
    AUTOSAR入门-PduR模块w5.jpg
    AUTOSAR入门-PduR模块w6.jpg
    AUTOSAR入门-PduR模块w7.jpg
    AUTOSAR入门-PduR模块w8.jpg
    AUTOSAR入门-PduR模块w9.jpg
    AUTOSAR入门-PduR模块w10.jpg
    AUTOSAR入门-PduR模块w11.jpg
    AUTOSAR入门-PduR模块w12.jpg
    AUTOSAR入门-PduR模块w13.jpg
    AUTOSAR入门-PduR模块w14.jpg
    AUTOSAR入门-PduR模块w15.jpg
    AUTOSAR入门-PduR模块w16.jpg

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 20-5-2024 02:31 , Processed in 0.342250 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.