ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Vector工具链实战:AUTOSAR以太网与SOME/IP通信从配置到联调

Vector工具链实战:AUTOSAR以太网与SOME/IP通信从配置到联调 1. 为什么要在Vector工具链上啃AUTOSAR以太网这块硬骨头如果你是从CAN总线一路做过来的嵌入式工程师第一次接触车载以太网和SOME/IP大概率会有一种换了赛道的感觉。CAN那套东西信号、报文、周期、DBC闭着眼睛都能配但一转到以太网Service、Method、Event、SD、Skeleton、Proxy这些词一股脑砸过来再加上Vector那一整套DaVinci工具链很多人第一次打开界面就懵了。我当初也是这么过来的所以这篇就把我从零搭起一套AUTOSAR以太网SOME/IP通信的完整过程拆开讲包括工具链怎么选、配置怎么落、代码怎么生成、联调怎么排错。先说清楚这套东西解决什么问题。传统CAN通信是信号导向的发送方周期性把信号塞进报文广播出去接收方按DBC解析。但到了智能座舱、域控制器、ADAS这些场景数据量大、交互复杂、还要支持面向服务的动态发现信号导向就不够用了。SOME/IPScalable service-Oriented MiddlewarE over IP就是在这个背景下成为AUTOSAR标准里的服务通信中间件它跑在以太网上支持Method调用、Event订阅、Field读写配合Service Discovery实现服务的动态上线和查找。Vector这套工具链核心是DaVinci Configurator负责BSW和RTE配置、DaVinci Developer负责SWC和Service接口设计再加上MICROSAR作为底层协议栈。关键词里出现的vector davinci、autosar工具链、autosar ecuc模块说的都是这套东西。适合谁看有一定AUTOSAR基础、做过CAN配置、现在要上手以太网和SOME/IP的工程师或者正在做域控制器、想搞清楚服务通信怎么落地的朋友。下面我按实际项目推进的顺序把每个环节的坑和门道都摊开讲。2. 工具链版本与工程骨架的搭建细节2.1 版本匹配这件事比你想的更要命Vector工具链最坑的地方不是配置复杂而是版本之间的匹配关系。DaVinci Configurator、DaVinci Developer、MICROSAR协议栈、还有你用的编译器Tasking、GHS、GCC这四者的版本必须严格对应。我踩过一次坑用DaVinci Configurator 6.0去配MICROSAR 4.4的工程生成代码时直接报ECUC模块定义不匹配折腾了一整天才发现是版本错位。正确的做法是先确定MICROSAR协议栈的版本这个通常由项目定点决定因为License是绑定的然后去Vector官网下载对应版本的DaVinci Configurator和Developer。官网的下载页面会有一个兼容性矩阵一定要对着看。关键词里的vector driversetup下载、vector官网下载canoe其实说的是Vector的安装器DriverSetup它负责统一管理各个工具的安装和License。提示安装Vector工具链时License服务器Vector License Client要先配好否则DaVinci Configurator打开工程会提示无有效License很多人卡在这一步以为是软件问题。2.2 工程骨架从ECUC模块说起AUTOSAR的配置本质上是围绕ECUCECU Configuration模块展开的。一个以太网工程核心的ECUC模块包括Eth以太网驱动层配置MAC、PHY、控制器EthIf以太网接口层管理多个Eth控制器EthTrcv收发器驱动对应你板子上的PHY芯片TcpIpTCP/IP协议栈配置包括IP地址、ARP、DHCPSoAdSocket Adaptor负责PDU和Socket的映射SdService Discovery服务发现SomeIpXfSOME/IP传输层负责序列化这些模块在DaVinci Configurator里是树形结构配置顺序有讲究。我的经验是先配Eth和EthTrcv把物理链路打通再配TcpIp和SoAd把Socket建起来最后才是Sd和SomeIpXf。如果顺序反了中间验证不了出了问题根本不知道是哪一层。关键词里提到的autosar ecuc模块、autosar iocioc指的是Inter-OS-Application Communicator在多核工程里会用到单核工程可以先不管。2.3 PHY和收发器的配置要点车载以太网常用的PHY是Marvell 88Q2112100BASE-T1或者NXP TJA1100系列。关键词里出现了有tja1145的收发器TJA1145是CAN收发器别搞混了以太网这边对应的是TJA1100/TJA1101。配置EthTrcv时要选对收发器类型然后配置MII/RMII/RGMII接口模式。这里有个容易忽略的点PHY的地址和寄存器配置。有些PHY需要通过MDIO接口配置EthTrcv模块里要填对PHY Address。我见过有人PHY地址填错链路一直起不来抓包什么都抓不到最后发现是地址位搞反了。3. SOME/IP服务接口的设计与Skeleton/Proxy生成3.1 先想清楚服务模型再动手配SOME/IP的核心是服务。一个服务包含若干Method、Event、Field。Method是请求-响应Event是发布-订阅Field是带getter/setter/notifier的属性。在DaVinci Developer里设计服务接口时第一步是定义Service Interface然后往里加Method和Event。我建议在动手之前先用一张纸把服务模型画清楚哪些是Method、哪些是Event、参数类型是什么、有没有返回值。因为一旦Skeleton和Proxy生成出来再改接口就要重新生成、重新编译成本很高。关键词里的autosar did、autosar crypto这些DID是诊断数据标识跟SOME/IP服务不是一回事但诊断服务有时也会通过SOME/IP暴露这个后面可以单独聊。3.2 数据类型映射的坑SOME/IP支持的数据类型和C语言类型不是一一对应的。比如SOME/IP的uint8对应C的uint8但array、struct、string这些复杂类型映射规则要仔细看。特别是stringSOME/IP里string是带长度前缀的配置时要指定最大长度否则序列化会出问题。我在一个项目里定义了一个string类型的Field最大长度设了64结果实际传输时对方发了个100字节的字符串直接导致SomeIpXf序列化失败接收端解析出一堆乱码。后来把长度改到256才稳定。所以字符串长度一定要留足余量别抠那点内存。3.3 Skeleton和Proxy的生成在DaVinci Developer里设计好Service Interface后通过RTE Generator生成Skeleton服务端和Proxy客户端代码。Skeleton是服务提供者要实现的方法框架Proxy是服务消费者调用的接口。生成代码时要注意RTE的配置。RTE里要指定Service的Instance ID、端口映射、以及Skeleton/Proxy的运行实体Runnable Entity。这里有个细节Skeleton的Runnable要绑定到具体的Task上Task的周期和优先级会影响服务的响应时间。如果服务响应要求高Task优先级要设高一点。注意Skeleton和Proxy生成后不要手动改生成的文件因为下次重新生成会覆盖。要改逻辑改在用户代码区通常有专门的UserCode段。4. Service Discovery与网络管理的联动配置4.1 SD不是可选项是必选项很多人以为SOME/IP只要配好服务就能通信其实Service DiscoverySD才是让服务活起来的关键。SD负责服务的上线通告OfferService、下线StopOfferService、查找FindService、订阅SubscribeEventgroup。没有SD客户端根本不知道服务端在哪。SD的配置在Sd模块里核心参数包括参数说明典型值InitialDelayMin初始等待最小值10msInitialDelayMax初始等待最大值100msRepetitionsBaseDelay重发基础延迟200msRepetitionsMax最大重发次数3CyclicOfferDelay周期通告间隔1000msTTL服务存活时间3s这些参数直接影响服务发现的快慢和网络负载。InitialDelay设太小多个ECU同时上线会撞车设太大服务发现慢。我一般用默认值先跑通再根据实测调整。4.2 SD和网络管理的配合关键词里出现了autosar网络管理、autosar bswm下电是怎么配置的这两个跟SD关系很大。网络管理Nm负责协调总线上各个ECU的睡眠和唤醒BswMBasic Software Mode Manager负责模式切换。当网络管理进入Bus-Sleep模式时SD要停止发送OfferService否则会把总线唤醒。配置时要注意SD的StopOfferService要绑定到BswM的模式切换动作上。具体是在BswM里配置规则当Nm进入PrepareBusSleep时触发Sd的StopOfferService。这个联动如果没配好会出现总线该睡不睡的问题整车静态电流超标。4.3 事件组订阅的细节Eventgroup是SD里订阅的单位。客户端订阅一个Eventgroup服务端才会把该组内的Event发过来。配置Eventgroup时要指定Eventgroup ID、TTL、以及包含哪些Event。这里有个坑Eventgroup ID和Event ID不能重复而且要在整个工程里唯一。我见过有人两个服务用了相同的Eventgroup ID结果订阅串了客户端收到不该收的事件。排查这种问题很痛苦因为现象是偶尔收到奇怪的数据不是必现。5. 联调阶段抓包、日志与常见故障排查5.1 抓包工具的选择联调阶段抓包是必须的。车载以太网抓包常用的是Vector的VN5640或者VN5610接口卡配合CANoe或Wireshark。关键词里的vector官网下载canoe、车载以太网测试说的就是这个场景。Wireshark要装SOME/IP和SD的解析插件否则只能看到一堆UDP包解析不出服务内容。CANoe的话Vector提供了SOME/IP的解析选项配置好之后能直接看到Method调用和Event通知。5.2 常见故障排查表现象可能原因排查方法链路起不来PHY配置错误、MDIO地址错读PHY寄存器看Link Status服务发现不到SD参数配置错、多播地址错抓包看有没有OfferServiceMethod调用超时服务端Runnable没跑、Task优先级低看服务端日志确认Runnable执行Event收不到Eventgroup订阅失败、TTL过期抓包看SubscribeEventgroupAck数据解析乱码序列化配置错、字节序问题对比发送和接收的原始字节5.3 一个真实的排查案例有次调一个Event通信客户端一直收不到数据。抓包发现客户端发了SubscribeEventgroup但服务端没回Ack。查了半天发现是服务端的Eventgroup配置里TTL设成了0。TTL为0意味着订阅立即过期服务端直接忽略。把TTL改成3秒后通信正常。这个问题的教训是SD相关的参数每个都要理解含义不能照抄。TTL、InitialDelay、Repetitions这些抄错了就是坑。6. 代码集成与实测中的性能调优6.1 生成代码的集成DaVinci生成的代码要集成到你的工程里。通常包括BSW代码MICROSAR协议栈编译成库或者源码集成RTE代码Rte.c、Rte.h以及Skeleton/Proxy的代码配置代码各种Cfg.c、Cfg.h由DaVinci生成集成时要注意编译顺序和头文件路径。MICROSAR的库通常有多个变体Debug、Release选对。链接脚本里要确保以太网相关的段比如DMA描述符放在正确的位置。6.2 性能调优的几个方向SOME/IP的性能瓶颈通常在几个地方Socket缓冲区大小SoAd里配置的Socket Buffer要够大否则高负载下丢包Task周期Skeleton的Runnable如果跑在10ms Task里Method响应最快也就10ms序列化开销SomeIpXf的序列化是逐字节拷贝大数据量时CPU占用高中断处理以太网中断如果处理太慢会丢包我一般先用默认配置跑通然后用CANoe或者Wireshark统计延迟和丢包率再针对性调。比如Method响应要求5ms以内就把Skeleton的Task周期设成2ms优先级设高。6.3 实测中的稳定性问题长时间跑测试时遇到过Socket泄漏的问题。原因是SoAd的Socket没有正确关闭每次重连都新建一个Socket跑几个小时就耗尽了。后来在SoAd配置里加了Socket复用问题解决。还有一次是SD的CyclicOfferDelay设得太短100ms导致网络负载高其他ECU的通信受影响。改成1000ms后正常。所以SD参数要根据网络规模调不是越频繁越好。7. 从CAN工程师到以太网工程师的思维转变最后聊点务实的。从CAN转到以太网最大的思维转变是CAN是广播信号以太网是点对点服务。CAN里你关心的是信号有没有发出去以太网里你关心的是服务有没有被发现、订阅有没有成功、序列化有没有对齐。另外工具链的复杂度上了一个台阶。CAN配置可能一个DBC加一个Configurator就够了以太网要Configurator、Developer、还有各种协议栈配置版本还要匹配。我的建议是先把一个最小的SOME/IP服务跑通——一个Method、一个Event端到端能通信然后再往上加复杂度。别一上来就搞一堆服务出了问题根本定位不到。关键词里的autosar从入门到精通、autosar教程网上资料很多但真正讲Vector工具链实操的少。我踩过的这些坑希望能帮你少走点弯路。工具链这东西版本对了、顺序对了、参数理解了剩下的就是耐心调。
返回列表