ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从零实践AUTOSAR CP:基于RH850搭建CAN通信开发环境

从零实践AUTOSAR CP:基于RH850搭建CAN通信开发环境 在汽车电子领域AUTOSARAUTomotive Open System ARchitecture早已不是陌生的词汇它代表了汽车软件开发的标准化未来。对于从事或即将进入汽车嵌入式软件开发的工程师而言理解AUTOSAR不仅是掌握一项技术更是理解一套完整的工程方法论。然而AUTOSAR标准文档庞大且抽象直接从规范入手往往令人望而生畏。本文旨在为初学者和有一定经验的开发者提供一个清晰的实践入口我们将聚焦于AUTOSAR Classic PlatformCP从零开始搭建一个基于RH850系列MCU的最小化AUTOSAR开发环境并实现一个基础的CAN通信示例。这个过程将串联起工具链配置、基础软件模块集成、通信栈初始化等核心环节让你不仅知道AUTOSAR“是什么”更能亲手实践“怎么做”并为后续排查复杂问题打下基础。1. 理解AUTOSAR CP的核心分层与工作流在动手搭建环境之前必须对AUTOSAR CP的基本架构和开发模式有一个宏观认识。这能帮助你在后续步骤中理解每一个操作的目的而不是机械地执行命令。1.1 AUTOSAR的分层架构从硬件抽象到应用AUTOSAR CP采用严格的分层架构目的是实现硬件与应用软件的完全解耦。自底向上主要分为四层微控制器抽象层MCAL这是最底层直接与微控制器如RH850的硬件外设如GPIO、ADC、CAN控制器、SPI打交道。MCAL由芯片厂商或第三方提供为上层提供统一的、硬件无关的API接口。例如无论CAN控制器的寄存器如何分布上层都通过统一的Can_Write函数发送数据。ECU抽象层ECU Abstraction Layer在MCAL之上它对多个MCAL模块进行组合和封装提供与ECU硬件布局相关的服务。例如它可能将一个具体的CAN控制器如CAN0抽象为一个逻辑CAN通道如CANIF_CHL_LS。服务层Services Layer这是AUTOSAR的“操作系统”和“公共服务”层提供系统服务如操作系统OS、诊断DCM、网络管理NM、存储NvM和通信服务如COM、PDU Router。你的应用软件SWC主要与这一层及RTE交互。运行时环境RTE这是连接应用软件组件SWC与底层基础软件BSW的桥梁。RTE根据配置自动生成代码实现SWC之间的通信端口和接口以及SWC对BSW服务的访问。开发者通常不直接编写RTE代码而是通过配置工具定义SWC的行为由工具生成RTE。开发者的主要工作集中在应用层Application Layer的SWC设计以及通过配置工具如Vector的DaVinci、ETAS的ISOLAR对基础软件层BSW进行“配置”而非“编码”。1.2 基于工具链的V模型开发流程AUTOSAR开发强烈依赖工具链遵循V模型左侧设计与配置在PC上的配置工具中进行系统设计定义ECU、SWC、通信矩阵、ECU配置配置BSW模块参数、生成RTE和代码生成。底部集成与编译将生成的配置代码、手写的应用代码、MCAL及BSW的库文件在特定的编译器如GreenHills、Tasking for RH850中进行链接生成可执行文件。右侧验证与测试将可执行文件刷写到目标ECURH850开发板或仿真环境中进行功能测试、集成测试。我们的实践将模拟一个简化的流程配置一个发送周期信号的SWC通过COM和CAN接口发送到总线上。2. 搭建RH850的AUTOSAR开发环境环境搭建是第一步也是最容易出错的一步。我们将明确每个组件的来源和作用。2.1 工具与软件组件清单你需要准备以下软件请注意版本兼容性本文以常见组合为例组件推荐/示例产品作用获取来源集成开发环境(IDE)与编译器GreenHills MULTI, Tasking for RH850代码编辑、编译、调试编译器厂商AUTOSAR配置工具Vector DaVinci Developer/Configurator ProSWC设计、BSW/RTE配置、代码生成VectorMCAL驱动包Renesas RTA-RH850 MCAL针对RH850芯片的AUTOSAR MCAL实现Renesas官网或代理商基础软件(BSW)库Vector MICROSAR, ETAS RTA-BSW, 或芯片厂商提供实现服务层、ECU抽象层模块的二进制库或源码工具链厂商或芯片厂商CAN总线工具Vector CANoe, PEAK-System PCAN-View监控、仿真、分析CAN总线数据相应厂商硬件开发板Renesas RH850系列评估板如CK-RH850运行和调试目标硬件Renesas或第三方注意不同工具链Vector, ETAS, EB等的配置界面和流程有差异但核心概念分层、配置参数、工作流相通。本文描述的概念和步骤具有通用性具体操作需参考你所使用工具的官方文档。2.2 安装与基础工程创建步骤安装编译器首先安装针对RH850的编译器如GreenHills并确保其许可证有效。这是生成机器码的基础。安装配置工具安装DaVinci Configurator Pro用于BSW配置和DaVinci Developer用于SWC设计。通常它们作为一个套件安装。导入MCAL和BSW包从Renesas获取对应你RH850具体型号的MCAL包通常是一个.arxml或.epc文件。在DaVinci Configurator Pro中通过“File - Import”将其导入。同时导入Vector提供的MICROSAR BSW包。创建新ECU工程在DaVinci Configurator Pro中创建新项目选择正确的AUTOSAR版本如4.3.1。在“ECU”视图中创建一个新的ECU节点命名为My_RH850_ECU。将导入的MCAL和BSW包分配给这个ECU。此时工具会加载所有可配置的BSW模块如Can, CanIf, Com, EcuM等。完成以上步骤后你的工程应该包含了一个ECU并且模块列表里出现了大量的AUTOSAR BSW模块。这是后续所有配置的起点。3. 配置CAN通信栈从驱动到应用接口我们的目标是让ECU周期性地通过CAN总线发送一帧数据。这需要配置一整条通信链路Can-CanIf-PduR-Com。我们以Vector工具链为例分步讲解。3.1 配置CAN控制器Can模块首先需要告诉系统硬件上CAN控制器的基本情况。在模块列表中找到Can模块打开其配置。进入CanController配置项。你需要创建一个或多个CAN控制器例如CanController_0对应芯片的CAN0外设。关键参数配置CanControllerBaudRate: 设置CAN总线波特率如500000500kbps。CanControllerPropSeg,CanControllerSeg1,CanControllerSeg2: 这些是位时序参数通常波特率设置正确后工具会根据芯片手册提供推荐值或自动计算。这是最容易导致通信失败的地方之一必须与总线上其他节点严格一致。CanControllerId 用于内部标识与CanIf配置关联。配置CanHardwareObject硬件对象即CAN邮箱。你需要定义至少一个TxHoh发送硬件对象和/或RxHoh接收硬件对象。对于发送设置其CanObjectType为FULL_CAN或BASIC_CAN并关联到一个CanControllerId。/* 示例在配置工具中设置的参数会生成如下结构的配置代码 */ const Can_ControllerConfigType CanControllerCfg[] { { .CanControllerId 0, // 控制器ID 0 .CanControllerBaudRate 500000, .CanControllerPropSeg 2, .CanControllerSeg1 7, .CanControllerSeg2 6, .CanControllerSyncJumpWidth 1, // ... 其他参数 } };3.2 配置CAN接口层CanIf模块CanIf是Can模块的上层提供统一的接口并管理多个CAN控制器。配置CanIf模块将上一步创建的CanController添加到CanIf的控制器列表中。配置CanIfTxPduCfg发送PDU配置。这里需要定义一个发送PDU例如CanIfTxPdu_MyMessage。CanIfTxPduId: PDU的唯一标识后续PduR会引用它。CanIfTxPduCanId: 设置CAN报文的ID标准帧或扩展帧例如0x100。CanIfTxPduDlc: 数据长度如8。CanIfTxPduDataLengthCode: 通常与DLC一致。关联到CanHardwareObject。3.3 配置PDU路由器PduR模块PduR负责在不同通信模块如COM, CAN TP, LIN TP之间路由PDU。对于简单的CAN收发它主要起通道作用。在PduR配置中找到PduRRoutingPaths。添加一个路由路径源为Com目标为CanIf。这意味着来自COM层的PDU将被路由到CAN接口层发送出去。需要配置源ID和目标ID的映射关系即Com发出的某个PDU ID对应到CanIf的哪个TxPduId。3.4 配置通信服务层Com模块Com模块提供信号和信号组的处理是最接近应用层的一环。定义信号Signal在Com配置的Signals下创建一个信号例如ComSignal_EngineSpeed。ComBitPosition: 信号在数据字节中的起始位。ComBitSize: 信号长度比特如16。ComSignalType: 数据类型如UINT16。ComSignalInitValue: 初始值。定义信号组Signal Group或PDU在Com配置的Pdus下创建一个IPDU交互层PDU例如ComIPdu_MyTxPdu。ComPduId: PDU标识与PduR中配置的源ID对应。ComPduLength: 长度与CAN DLC一致如8。ComPduType: 设置为TRANSMIT。ComPduSignalRef: 将前面定义的ComSignal_EngineSpeed信号添加到此PDU中并指定其在PDU数据域中的布局通过ComBitPosition和ComBitSize。配置发送模式在ComIPdu的属性中找到ComTxMode。创建一个周期发送模式例如ComTxModePeriodic。ComTxModeMode: 设置为PERIODIC。ComTxModePeriod: 设置发送周期单位通常为秒如0.01100ms。ComTxModeNumberOfRepetitions: 重复次数0表示无限重复。至此从应用信号到CAN总线帧的完整发送链路就配置好了ComSignal-ComIPdu-PduR-CanIfTxPdu-CanHoh-CanController。4. 创建应用软件组件并生成代码配置好BSW后需要创建应用软件组件SWC来产生或消费数据。4.1 在DaVinci Developer中设计SWC打开DaVinci Developer创建一个新的软件组件类型为AtomicSwComponentType命名为AppSwc_Sender。定义端口Port右键组件创建SenderReceiver端口命名为PPort_EngineData。为该端口创建接口Interface例如Iface_EngineData。在接口中定义数据元素Data Element例如deEngineSpeed类型为uint16。这对应了之前在Com中定义的信号。关联SWC与BSW回到DaVinci Configurator Pro在Com模块的配置中找到之前定义的ComSignal_EngineSpeed。将其ComSignalDataProvision属性设置为PROVIDED并映射到AppSwc_Sender组件的PPort_EngineData端口及deEngineSpeed数据元素。这一步建立了SWC端口与COM信号之间的绑定关系。4.2 生成RTE和BSW配置代码配置完成后最关键的一步是生成代码。生成RTE代码在DaVinci Configurator Pro中选择Rte模块执行生成操作。工具会根据SWC的端口和连接关系生成Rte_AppSwc_Sender.c/.h文件。这些文件提供了如Rte_Write_PPort_EngineData_deEngineSpeed()这样的API供你的应用代码调用。生成BSW配置代码对Can,CanIf,PduR,Com等所有配置过的模块分别执行“Generate Code”操作。这会生成每个模块的*_Cfg.c/.h文件里面包含了所有你设置的参数以const数组或结构体的形式存在。生成工程文件最后生成针对你的编译器如GreenHills的工程文件.gpj等这个工程会自动链接所有生成的代码、BSW库文件和MCAL库文件。4.3 编写应用层代码在生成的工程中找到属于AppSwc_Sender组件的文件通常是AppSwc_Sender.c。你需要实现组件的运行实体Runnable Entity。在DaVinci Developer中为AppSwc_Sender组件创建一个Runnable例如RE_SendEngineData并将其触发方式设置为TimingEvent例如每10ms触发一次。生成代码后在AppSwc_Sender.c中会找到该Runnable的骨架函数RE_SendEngineData。在此函数中调用RTE提供的写接口更新信号值。这个值会被自动传递到COM层并按照之前的配置周期性地通过CAN发送出去。/* AppSwc_Sender.c - 生成的应用代码骨架 */ #include “Rte_AppSwc_Sender.h” /* Runnable RE_SendEngineData */ void RE_SendEngineData(void) { Std_ReturnType status; uint16 engineSpeed 0; /* 模拟获取发动机转速数据 */ engineSpeed GetEngineSpeedFromSensor(); // 假设的函数 /* 通过RTE接口写入数据Com模块会自动读取并发送 */ status Rte_Write_PPort_EngineData_deEngineSpeed(engineSpeed); /* 建议检查返回值生产代码中需处理错误 */ if (status ! E_OK) { /* 错误处理记录日志或触发诊断事件 */ } }5. 编译、刷写与验证5.1 编译与链接用GreenHills或其他IDE打开生成的工程文件。检查编译路径确保包含了所有生成的头文件、MCAL头文件、BSW库路径。执行编译。首次编译可能会遇到大量头文件路径或库文件缺失的问题需要根据错误信息逐一在工程设置中修正。编译成功后会生成一个可执行文件如.elf或.hex。5.2 刷写到RH850开发板使用调试器如Renesas E1/E2x Lite, Lauterbach Trace32连接RH850开发板。在IDE中配置调试会话设置正确的芯片型号、调试接口和时钟。将编译好的可执行文件下载Download/Program到开发板的Flash中。复位并运行程序。5.3 使用CAN工具验证通信将开发板的CAN接口通过CAN收发器连接到PC的CAN卡如PEAK PCAN-USB。在PC上打开CAN分析软件如PCAN-View。设置相同的波特率500kbps。启动PCAN-View的监听功能。如果配置和代码正确你应该能看到ID为0x100的CAN报文以100ms的周期出现数据字段包含了你在代码中设置的engineSpeed值例如0x07D0表示2000转/分。6. 常见问题排查与调试技巧即使按照步骤操作第一次尝试也很可能失败。以下是几个最常见的故障点及排查思路。问题现象可能原因检查点与解决方案编译失败找不到头文件或符号1. 工程包含路径不正确。2. BSW或MCAL库文件未正确链接。3. 生成的代码有语法错误。1. 检查IDE中Include Paths确保包含所有生成代码、MCAL、BSW的路径。2. 检查Linker设置确认所有必要的.a或.lib文件已添加。3. 检查生成代码的*_Cfg.h文件看是否有配置错误导致的结构体定义异常。程序下载后无法运行卡死1. 启动顺序Startup Sequence配置错误。2. 时钟初始化失败。3. 栈或堆设置过小。1. 检查EcuM模块的EcuMStartupTwo配置确保所有BSW模块初始化顺序正确。2. 检查Mcu模块配置确认时钟源、PLL、分频等参数与硬件匹配。3. 检查链接脚本.lsl等中的内存分配。CAN总线上无任何报文1. CAN控制器未使能或初始化失败。2. 波特率或位时序配置错误。3. 硬件连接问题终端电阻、线序。4. 发送PDU未激活或触发条件未满足。1. 在Can_Init后检查是否调用了Can_SetControllerMode进入CAN_CS_STARTED状态。2.使用示波器或逻辑分析仪测量CAN_H和CAN_L波形确认是否有差分信号。这是最直接的硬件诊断方法。3. 检查CanIf_Init和Com_Init的返回值。4. 确认Com模块的ComTxMode已启用且Com_MainFunction被周期调用。有报文但ID或数据不对1.CanIfTxPduCanId配置错误。2.ComSignal到ComIPdu的布局Bit Position错误。3. 应用层写入的数据格式错误。1. 在PCAN-View中核对报文ID。2. 在Com配置中仔细检查信号的ComBitPosition和ComBitSize。3. 在应用代码中调试Rte_Write调用前后的数据值。报文发送周期不稳定1.Com_MainFunction或包含RE_SendEngineData的Task执行周期不稳定。2. 系统负载过高任务被阻塞。1. 确认OS中触发Runnable的Task优先级和周期设置正确。2. 检查是否有其他高优先级任务长时间占用CPU。调试建议善用调试器在关键初始化函数Can_Init,CanIf_Init,Com_Init,EcuM_StartupTwo和Runnable入口设置断点单步跟踪执行流程和返回值。添加调试输出如果硬件支持如串口可以在代码中添加简单的日志打印输出关键变量的状态。模块化验证不要一次性配置所有功能。可以先配置一个最简单的Can驱动回环测试Loopback确认MCAL和硬件工作正常再逐步向上层添加CanIf、Com等模块。7. 生产环境考量与最佳实践学习环境跑通只是第一步实际项目开发需要考虑更多。配置版本管理AUTOSAR配置.arxml或.dpa文件是项目的核心资产必须使用Git等版本控制系统管理。注意过滤掉工具生成的临时文件和二进制库。错误处理与诊断生产代码中必须检查所有AUTOSAR接口的返回值Std_ReturnType。重要的错误应通过Dem诊断事件管理器报告并可能触发BswM基础软件模式管理器进行模式切换。内存与性能优化合理配置Can模块的硬件对象HOH数量避免过多占用RAM。优化Com模块的信号处理对于高频信号考虑使用ComSignalGroup和直接信号处理接口。根据实际需求调整各模块MainFunction的调用周期平衡实时性与CPU负载。网络管理NM集成真实的ECU需要实现网络管理以实现总线睡眠和唤醒。这需要配置CanNm、ComM等模块并与EcuM协同工作。这是一个复杂的主题应在通信基础稳定后再引入。使用AUTOSAR工具链的“验证”功能在生成代码前使用配置工具提供的“一致性检查”或“验证”功能可以提前发现许多配置冲突或参数错误。文档与注释在配置工具中充分利用“Description”字段为关键的配置项如PDU ID、信号含义、周期添加注释。这在大团队协作和后期维护中至关重要。从零搭建AUTOSAR环境并实现第一个CAN通信功能是一个系统性工程。它要求你同时理解分层架构、工具链操作、硬件知识和C语言编程。遇到问题时按照从底层硬件到上层应用的顺序逐层排查并善用官方文档、示例代码和调试工具。当你成功在CAN总线上看到预期的报文时你就已经打通了AUTOSAR开发中最核心的配置与集成链路后续更复杂的功能如诊断、存储、多核调度都是在这条链路基础上的扩展和深化。
返回列表