一、AUTOSAR介绍

AUTOSAR CP(Classic Platform)是汽车电子控制单元(ECU)的标准化软件架构,专为满足实时性、安全性要求严格的动力总成、底盘和车身控制等场景设计。

其核心价值在于通过分层架构实现软硬件解耦:应用层由独立软件组件(SWC)构成,通过虚拟功能总线(VFB)进行通信;运行时环境(RTE)作为中间层管理SWC间交互;基础软件层(BSW)提供硬件抽象和通用服务。该架构采用静态配置模式,基于微控制器和OSEK实时操作系统,支持CAN/LIN等传统车载通信协议,显著提升了软件复用率和开发效率

二、CAN通信模块设计分析

在汽车电子控制系统的 CAN 通信架构中,其核心功能模块具体包含 AUTOSAR COM(通信管理模块)、PDU Router(协议数据单元路由模块)、CAN Interface(CAN 接口模块)以及 CAN Driver(CAN 驱动模块)这四个关键组成部分。

依据 AUTOSAR 架构中经典的分层设计理念,结合 AUTOSAR 规范对 CAN 通信模块在功能定义、接口标准化、模块解耦等方面的具体设计要求,最终构建出如图 所示的 CAN 通信软件框架。该框架通过明确各模块的职责边界与数据交互逻辑,确保了 CAN 通信功能的稳定性与可扩展性。

此外,OSEK OS 作为一款典型的静态实时操作系统,其核心作用是为上层应用层软件提供基础运行支持,例如任务调度、资源管理、事件处理等服务。在 CAN 通信场景中,OSEK OS 的核心应用场景之一,便是为那些需要周期性执行的函数(如 CAN 报文周期性发送、通信状态周期性检测等函数)提供精准的定时调度与执行环境,保障通信任务按预设周期稳定运行。

从系统架构层级划分来看,OSEK OS 处于系统服务层。由于操作系统需要直接对底层硬件资源进行控制与管理(如微控制器的定时器、中断控制器、CAN 控制器等硬件外设),因此 OSEK OS 的功能覆盖范围贯穿了 ECU 抽象层(ECU Abstraction Layer)与微控制器抽象层(Microcontroller Abstraction Layer),形成了从硬件控制到上层服务的完整功能链路,为 CAN 通信模块与底层硬件的交互提供了可靠的操作系统支撑。

三、软件设计

1.AUTOSAR COM模块设计

COM 模块从上层接收到的数据称为信号或信号组,信号组由复杂的或者功能类似需要同步发送的信号组合而成。COM 模块为上层需要传递的信号和信号组确定唯一的编号信息,并为类型相同的信号集中定义运行时缓冲区,用来存储信号值的最新数据。

信号和信号 组在COM模块都会被封装在交互层数据协议单元( I PDU) 之中,进而完成数据向下层模块传递。COM模块为信号定义了5种传输属性,一个I-PDU可以包含多个信号,每个信号可以选择一种传输属性,这个传输属性定义了在信号写访问时触发包含此信号I-PDU的传输情况。

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

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

typedef struct

 {

   const uint32 ComBitPosition; /* 信号在 I-PDU 内起始位置* /

   const uint8 ComBitSize; /* 信号的大小,以 bit 为单位* /

   P2FUNC( void,COM_APPL_CODE,ComErrorNotification) ( void) ; / * 发生错误时调用的回调函数Com_CbkTxErr* /

   const Com_SignalIdType ComSignalId; /* 信号标识符 ID* /

   P2FUNC( void,COM_APPL_CODE,ComNotification) ( void) ; /* 信号发送端回调函数Com_CbkTxAck,用于信号传输成功确认* /

   const Com_SignalType ComSignalType; /* 信号类型* /

   const Com_TransferPropertyType ComTransferProperty; /* 信号写访问触发I-PDU传输的几种模式* /

   const PduIdType ComIpduRefIndex; /* 所属的 I-PDU 的索引* /

   P2CONST( Com_FilterType,AUTOMATIC,COM_APPL_CONST)

   ComFilter; /* 信号的过滤配置参数,在发送端用于确定传输模式条件TMC* /

 } Com_TxSignalType;

结构体Com_TxSignalType 中所包含的成员较多,进 行了部分省略。发送信号主要包含用于在信号发送时 的各项参数以及跟信号相关的回调函数。定义的Com ErrorNotification 是一个函数指针类型,主要用于在信号 发送时,如果包含信号的I-PDU没有激活,就会调用这 个回调函数通知错误。ComNotification 则用于信号成功 发送到总线上时通知上层使用。ComFilter是一个指向 过滤参数的结构体指针,在接收信号时用于接收过滤, 在发送信号时用于计算判断传输模式条件TMC。TMC 的值会影响I-PDU发送模式选择TMS的值。

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

 typedef struct

 {

   const uint16 ComIPduHandleId; /* I-PDU 的标识 ID* /

   const Com_IPduSignalProcessingType ComIPduSignalProcessing;/* 信号的确认和指示的处理模式,直接模式和延迟模式* /

   const Com_IPduType ComIPduType; /* I-PDU 类型* /

   const Com_SignalIdType ComIPduSignalsRefNumber; /* I-PDU 所有包含信号的数量* /

   P2CONST( Com_SignalIdType,AUTOMATIC,COM_APPL_CONST)

   ComIPduSignalsRef; /* 指向此 I-PDU 所包含的信号的指针* /

   const uint16 ComPduIdRef; /* 底层 PDU 标识 ID* /

   P2CONST( Com_TxModeType,AUTOMATIC,COM_APPL_CONST)

   ComTxModeTrue; /* I-PDU 发送方式 TRUE 的结构体指针* /

   P2CONST( Com_TxModeType,AUTOMATIC,COM_APPL_CONST)

   ComTxModeFalse; /* I-PDU 发送方式 FALSE 的结构体指针* //* 省略部分参数* /

 } Com_TxIPduType;

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

通过调用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 模块的信号缓冲区中的数据,上图为软件执行流程。

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模块根据路由表查找上层模块信息,进而 完成通知上层,此过程如上图所示。下层在接收到I PDU 数据时,操作过程与发送完成的确认过程类似。

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一起传递给下层发送函数进 行发送,发送流程如图所示。

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

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

4.CAN Driver 模块设计

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

当硬件邮箱空闲时正常完成发送,当在被占用情 况下会返回CAN_BUSY,CAN IF模块会根据返回值存 储没能完成发送的数据信息。 在CAN中断处理函数中,会根据中断标志位判断 出现的是发送中断还是接收中断,然后调用不同的上 层回调函数,完成发送确认和接收指示操作,具体流程 如图所示。

结束语

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

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐