AUTOSAR入门-PduR模块

原创 thatway 那路谈OS与SoC嵌入式软件 2022-04-15 20:01

AUTOSAR入门-PduR模块

  AUTOSAR里面的模块需要进行  

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

   这个很像地下党情报工作,有很多**间谍**  

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

这里我们还是以:AUTOSAR入门-基于以太网诊断

为例,AS平台代码
结合AUTOSAR官网规范
进行讲解,理论联系实际
进行讲解PduR模块。

  1. 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_SoAdTpProvideRxBuffer
PduR_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_SoAdTpRxIndication
PduR_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入门

results matching ""

    No results matching ""