基于 AUTOSAR 的汽车 CAN 通信软件开发

分享

分享到:

    发表于:2022-01-16 11:22  浏览量: 3357  来源: 未知
摘要:本文根据 AUTOSAR 规范要求,完成了 AUTOSAR CAN 通信模块软件的开发,并在中央控制单元硬件平台进行测试应用。软件开发按照分层和模块化的设计思想,层与层之间隐藏设计细节,实现了解耦,能够较好提升软件复用性,为后续软件开发减少时间和成本, 提高开发效率。




1 AUTOSAR介绍



AUTOSAR 采用模块化的分层软件设计,从软件架构视图角度可分为应用层、运行时环境和基础软件层, 如图 1 所示。应用层由软件组件单元构成,包含与硬件无关的应用软件组件、传感器软件组件和执行器软件组 件等。运行时环境为系统提供基础的通信服务,支持应 用层软件组件之间的通信,以及应用层软件组件到下层 基础软件层之间的通信,运行时环境将应用层软件与下层基础软件层分割开来。基础软件层主要提供基础软件服务、标准化系统功能和应用接口,由服务层、ECU 抽象层、微控制器抽象层和复杂驱动组成。


image.png

图 1 AUTOSAR 分层软件架构


AUTOSAR 架构通过将硬件层进行抽象,得到微控制器抽象层,隐藏了硬件接口细节,达到将硬件与上层软件分离的效果,实现水平层解耦。当 ECU 硬件平台进行更新换代时,只需要将微控制器抽象层接口函数进行修改,上层代码可以实现复用,大大减少了开发时间和成本,提升了软件的复用性。



2 CAN通信模块设计分析


2.1    CAN 通信模块软件架构


CAN 通信模块包括了 AUTOSAR COM、PDU  Rout- er、CAN Interface 和CAN Driver 几个模块。根据AUTO- SAR 分层设计思想和 AUTOSAR 规范对 CAN 通信模块设计的要求,设计出如图 2 所示的软件框架。OSEK OS 是个静态的实时操作系统,主要为应用层软件提供服 务,在 CAN 通信中为需要周期执行的函数提供服务。OSEK OS 位于系统服务层,操作系统需要直接操作下层硬件,贯穿了 ECU 抽象层和微控制器抽象层。


image.png

图 2 CAN 通信软件框架


AUTOSAR COM 模块主要起到信号接口和数据网关的作用,负责发送上层传递的信号和信号组,解析从底层接收的数据并通知上层。上层只需要传递数据和接收数据,无需关心传输和接收的具体过程。


PDU Router 简称PDUR,PDUR 模块主要是起一个过渡兼容的作用,对上提供统一的接口,屏蔽下层网络细节,对下层兼容多种车载总线,如 CAN、LIN 和FlexRay 等。PDUR 模块提供 I-PDU 的网关功能,使得不同的总线之间可以进行通信。


CAN Interface 简称 CAN  IF,CAN  IF 模块主要是处理上层模块和底层驱动之间的 PDU 数据流传递,为上层模块提供统一接口,并通过特定的接口函数来管理 CAN 硬件。


CAN Driver 模块为 CAN 通信软件的最底层,是直接访问 CAN 通信相关硬件的模块,通过对硬件抽象, 向上层 CAN IF 模块提供与硬件无关的函数接口。


2.2    CAN 通信模块开发步骤


CAN 通信模块各层软件开发步骤如图 3 所示。通过 AUTOSAR 规范中对分层架构设计和对 CAN 模块开发的要求,确定基础数据类型和定义数据结构,规范各文件主要作用并确定相互包含结构,设计相应的通知机制和错误处理机制。


image.png

图 3 软件开发步骤


3 软件设计


3.1    AUTOSAR COM 模块设计


COM 模块从上层接收到的数据称为信号或信号组,信号组由复杂的或者功能类似需要同步发送的信号组合而成。COM 模块的信号类型如表 1 所示。


image.png


COM 模块为上层需要传递的信号和信号组确定唯一的编号信息,并为类型相同的信号集中定义运行时缓冲区,用来存储信号值的最新数据。信号和信号组在 COM 模块都会被封装在交互层数据协议单元 (I- PDU) 之中,进而完成数据向下层模块传递。COM 模块为信号定义了 5 种传输属性,一个 I-PDU 可以包含多个信号,每个信号可以选择一种传输属性,这个传输属性定义了在信号写访问时触发包含此信号 I-PDU 的传输情况。信号的传输属性如表 2 所示。


image.png


I-PDU 有 4 种传输模式,各传输模式的含义如表 3 所示。


image.png


在 COM 模块的数据处理过程中,涉及到很多数据类型,这些数据类型包装在结构体中进行使用。COM 模块使用的数据结构体包括: COM 模块配置参数结构体、发送信号结构体、接收信号结构体、发送 I-PDU 结构体、接收 I-PDU 结构体、发送信号组结构体和接收信号组结构体等。


发送信号结构体类型 Com_TxSignalType 的设计及部分成员的含义:



image.png


结构体 Com_TxSignalType 中所包含的成员较多,进行了部分省略。发送信号主要包含用于在信号发送时的各项参数以及跟信号相关的回调函数。定义的 Com- ErrorNotification 是一个函数指针类型,主要用于在信号发送时,如果包含信号的 I-PDU 没有激活,就会调用这个回调函数通知错误。ComNotification 则用于信号成功发送到总线上时通知上层使用。


ComFilter 是一个指向过滤参数的结构体指针,在接收信号时用于接收过滤, 在发送信号时用于计算判断传输模式条件 TMC。TMC 的值会影响 I-PDU 发送模式选择 TMS 的值。


发送的信号最后会封装在 I-PDU 之中进行传输,发送 I-PDU 结构体类型 Com_TxIPduType 的设计及部分成员的含义:


image.png


结构体Com_TxIPduType 定义了发送I-PDU 传输中的参数,其中 ComTxModeTrue 和 ComTxModeFalse 是 COM 模块为 I-PDU 定义的两种发送方式,这两种发送方式的参数需要静态配置,根据 I-PDU 所有包含信号的 TMC 值来确定 I-PDU 发送模式选择 TMS。两种发送方式都可以定义 I-PDU 在传输时所需要的时间参数。


COM 模块发送信号的流程如图 4 所示。


image.png

图 4 Com_SendSignal( ) 信号发送流程图


通过调用 Com_SendSignal( ) 函数不会立即触发 I- PDU 的传输,只是更新存储在 I-PDU 缓冲区中的信号数据,I-PDU 的发送通过 OSEK OS 实时操作系统的任务调用 Com_MainFunctionTx( ) 函数进行处理。Com_ MainFunctionTx( ) 函数会对所有需要发送的 I-PDU 进行循环判断,结合 I-PDU 的传输模式和发送中需要满足的 时 间 参数综合判断是否需要调用 PduR _ ComTransmit( ) 函数传输该 I-PDU 到下层。


在接收数据时,下层会调用 Com_RxIndication( ) 回调函数通知COM 模块接收到I-PDU 数据,并将接收到的 PDU 数据信息复制到 COM 模块定义的 I-PDU 缓冲区中,更新相关的 I-PDU 属性参数。


上层通过 Com_ReceiveSignal( ) 函数获取存储在COM 模块的信号缓冲区中的数据,图 5 为软件执行流程。


image.png

图 5 Com_ReceiveSignal( ) 信号接收流程图


3.2    PDU Router 模块设计


PDU Router( 简称 PDUR) 模块位于通信软件中间,拥有多个上层和多个下层,在 CAN 通信软件中, PDUR 模块上层为 COM 模块,下层为 CAN Interface 模块。PDUR 模块主要包括两个部分,PDU 路由表和PDU 路由引擎。PDU 路由表静态定义了每个 I-PDU 的路由路径,根据路由表来确定 I-PDU  的上下层模块信息; PDU 路由引擎是根据 PDU 路由表进行操作的实际代码,实现 I-PDU 信息的路由传递。


COM 模块通过调用 PduR _ ComTransmit ( ) 将I-PDU传递到 PDUR 模块,PDUR 模块根据静态定义的路由表,查找 I-PDU 的目的模块,然后调用相关下层CanIf_Transmit( ) 函数实现传输。在完成传输之后,下层调用 PduR_ CanIfTxConfirmation ( ) 函数通知 PDUR 模块,PDUR 模块根据路由表查找上层模块信息,进而完成通知上层,此过程如图 6 所示。下层在接收到 I-PDU 数据时,操作过程与发送完成的确认过程类似。


image.png

图 6 PDUR 模块携带 I-PDU ID 传输过程


3.3    CAN Interface 模块设计


CAN Interface( 简称CAN IF) 模块位于 CAN Driver 层之上,提供特定的接口函数来管理 CAN 硬件。CAN IF 模块对 CAN 控制器邮箱结构进行抽象,得到硬件对象句柄( HOH) 、硬件发送句柄( HTH) 和硬件接收句柄(HRH) 。邮箱结构是 CAN 硬件缓冲区,包含了 CAN 帧的 ID、长度和数据等信息。HOH 定义为一个常数,表示可用的 CAN 控制器邮箱编号,定义为发送使用的是 HTH,定义为接收使用是 HRH。


CAN IF 模块 CanIf _ Transmit ( ) 函数接收来自 PDUR 模块的 I-PDU,根据传入的 I-PDU ID 获取静态配置的底层 CAN 帧信息,组包合成 CAN 协议数据单元,同硬件发送句柄 HTH 一起传递给下层发送函数进行发送,发送流程如图 7 所示。


image.png

图 7 CanIf_Transmit( ) 发送流程


当下层 Can_Write( ) 返回 CAN_BUSY 时,表明指定的硬件缓冲区没有空间,此时 CAN IF 模块将发送失败的数据存储在 CAN IF 模块定义的缓冲区,等待CAN 硬件缓冲区空闲时进行发送。当 CAN Driver 模块成功发送报文时,会在 CAN 发送中断中调用 CanIf_ TxConfirmation( ) 通知 CAN IF 模块,此函数再调用上层回调函数通知上层发送完成,并查询 CAN IF 缓冲区是否有待发送数据,如果存在待发送数据就会请求底层传输。


在底层 CAN 接收中断中,会调用 CAN IF 层 CanIf_RxIndication( ) 通知 CAN IF 层接收到了数据,此函数会判断接收的数据是否需要软件过滤,并检查数据长度,然后判断是否调用上层回调函数通知上层接收到新数据。


3.4    CAN Driver 模块设计


CAN Driver 模块是最底层的硬件驱动模块,通过操作硬件寄存器实现对硬件的控制。Can_Write( ) 是CAN Driver 模块的发送函数,具体流程如图 8 所示。


image.png

图 8 Can_Write( ) 发送流程图


当硬件邮箱空闲时正常完成发送,当在被占用情况下会返回 CAN_BUSY,CAN IF 模块会根据返回值存储没能完成发送的数据信息。


在 CAN 中断处理函数中,会根据中断标志位判断出现的是发送中断还是接收中断,然后调用不同的上层回调函数,完成发送确认和接收指示操作,具体流程如图 9 所示。


image.png

图 9 CAN ISR 中断执行流程


4 软件测试


软件测试是软件开发的重要一环,在软件设计时, 需要进行功能测试和系统测试。在各模块的函数功能 设计中,为函数设置不同的输入输出测试用例,来完成 函数功能测试,测试结果可在编译软件中调试查看。


系统测试采用中央控制单元作为硬件平台。中央控制单元作为电动汽车整车控制系统的核心,兼具整车控制与远程监控功能。中央控制单元主控芯片选用   了恩智浦公司的 ARM 内核 32 位微控制器MK60DN512VLQ10。测试工具包括12 V电源、USB CAN 分析仪、上位机软件和 JLINK 调试工具等,软件环境为 μVision V5.24.2.0。


在测试过程中通过在应用层定义信号,在各层配置  文件中进行参数配置,并定义信号所属的 I-PDU  以及发送和接收信号的 CAN 报文ID、帧类型、帧格式和长度等。将 PC 机与 USB CAN 分析仪和 JLINK 调试工具连接, CAN 总线波特率配置为250 kbit/s,使用编译器软件将编译好的程序下载至中央控制单元。通过 USB CAN 分析仪进行报文数据的解析,由 ECANTools 上位机软件进行显示。图10 为ECANTools 软件CAN 通信测试数据接收和发送界面,帧 ID 为 0x18FFFFFF 和 0x18FFFFFA 是中央控制单元发出的报文,帧 ID 为 0x18FFFF0A 是 ECAN- Tools 软件模拟其他 ECU 发送给中央控制单元的报文。经过测试验证,中央控制单元可以正常收发CAN 报文,且数据信息和报文格式都符合预期。


image.png

图 10 ECANTools 数据收发界面


5 结束语


本文根据 AUTOSAR 规范要求,完成了 AUTOSAR CAN 通信模块软件的开发,并在中央控制单元硬件平台进行测试应用。软件开发按照分层和模块化的设计思想,层与层之间隐藏设计细节,实现了解耦,能够较好提升软件复用性,为后续软件开发减少时间和成本, 提高开发效率



免责声明:文章来源于智能汽车开发者平台 ,作者奉辰钢,版权归原作者所有,文中观点仅供分享交流,不代表本公众号立场。如涉及版权等问题,请您告知,我们将及时处理。



关注官方微信