当前位置: 首页 > news >正文

AUTOSAR进阶图解==>AUTOSAR_SWS_EthernetInterface

AUTOSAR 以太网接口模块(EthIf)详解

基于AUTOSAR标准的以太网接口模块架构、功能与接口分析

目录

  1. 概述
    1.1. EthIf模块定位
    1.2. 功能与职责
  2. 架构设计
    2.1. 整体架构
    2.2. 模块组织
    2.3. 配置结构
  3. 状态管理
    3.1. 模块状态
    3.2. 控制器状态
    3.3. 收发器状态
  4. 通信流程
    4.1. 初始化流程
    4.2. 通信初始化
    4.3. 数据传输
    4.4. 数据接收
    4.5. 链路状态管理
  5. 总结

1. 概述

1.1 EthIf模块定位

AUTOSAR (AUTomotive Open System ARchitecture) 架构中的以太网接口模块(EthIf)是一个关键的通信抽象层组件,位于ECU抽象层中的通信硬件抽象部分。它为上层模块提供了统一的、与硬件无关的接口,使应用程序能够访问多种不同类型的以太网控制器和收发器。

在这里插入图片描述

1.2 功能与职责

EthIf模块的主要职责是提供硬件独立的接口,实现以下功能:

  • 抽象层功能:屏蔽底层控制器和收发器的差异,提供统一API
  • 管理多种以太网设备:支持多个控制器、收发器和交换机
  • 数据收发:提供数据帧的传输和接收功能
  • 状态管理:管理控制器和收发器的状态变化
  • 链路监控:检测和通知链路状态变化
  • 配置管理:支持灵活配置,实现"one-fits-all"原则

EthIf模块遵循AUTOSAR的分层设计原则,不直接访问以太网硬件,而是通过多个驱动程序模块实现对硬件的间接访问,确保软件的可移植性和可重用性。

/* EthIf模块与相邻层次的接口示例 */
typedef struct {uint8 EthIfCtrlIdx;               /* 控制器索引,在EthIf上下文中唯一 */boolean EthIfCtrlEnable;          /* 控制器使能标志 */boolean EthIfCtrlEnableMii;       /* MII接口使能标志 */boolean EthIfCtrlEnableRxInterrupt; /* 接收中断使能 */boolean EthIfCtrlEnableTxInterrupt; /* 发送中断使能 */uint16 EthIfCtrlMtu;              /* 最大传输单元大小(字节) */
} EthIf_ControllerConfigType;

2. 架构设计

2.1 整体架构

以太网接口模块在AUTOSAR通信栈中位于ECU抽象层,连接上层模块(TCP/IP、EthSM、V2X等)和下层的以太网硬件驱动模块(Eth、EthTrcv、EthSwt等)。

架构层次说明:

  1. 应用层模块

    • TCP/IP:标准网络协议栈
    • EthSM:以太网状态管理器,负责协调高层状态管理
    • V2X:车辆通信模块
    • CDD:复杂设备驱动
  2. ECU抽象层

    • EthIf:以太网接口模块,提供硬件无关的统一接口
  3. 微控制器抽象层

    • Eth:以太网控制器驱动
    • EthTrcv:以太网收发器驱动
    • EthSwt:以太网交换机驱动
    • WEth:无线以太网控制器驱动
    • WEthTrcv:无线以太网收发器驱动
/* 上层模块与EthIf交互的回调函数示例 */
void TCP_IP_RxIndication(uint8 CtrlIdx,               /* 控制器索引 */Eth_FrameType FrameType,     /* 以太网帧类型 */boolean IsBroadcast,         /* 是否为广播包 */const uint8* PhysAddrPtr,    /* 源物理地址指针(MAC地址) */const uint8* DataPtr,        /* 数据指针 */uint16 LenByte               /* 数据长度(字节) */
) {/* 处理接收到的以太网数据帧 */
}

2.2 模块组织

EthIf模块具有明确的内部组织结构,其组件按功能分类:

  • 初始化组件:负责模块、控制器和收发器的初始化
  • 通信组件:处理数据传输和接收逻辑
  • 状态管理组件:管理控制器和收发器的状态变化
  • 链路管理组件:检测和通知链路状态变化
  • 配置管理组件:处理和验证配置数据

2.3 配置结构

EthIf模块采用层次化的配置结构,支持灵活配置和扩展。

在这里插入图片描述

配置结构说明:

  1. EthIf:顶级配置容器

    • 包含全局配置和配置集合
  2. EthIfGeneral:全局模块配置

    • EthIfDevErrorDetect:开发错误检测使能
    • EthIfEnableMii:MII接口使能
    • EthIfEnableRxInterrupt:接收中断使能
    • EthIfEnableTxInterrupt:发送中断使能
    • EthIfVersionInfoApi:版本信息API使能
    • EthIfSwitchMgmtSupport:交换机管理支持使能
  3. EthIfConfigSet:配置集合,包含多个控制器、交换机和收发器配置

  4. EthIfController:控制器配置

    • EthIfCtrlMtu:最大传输单元大小
    • EthIfCtrlIdx:控制器索引
    • EthIfCtrlEnable:控制器使能标志
    • EthIfCtrlEnableMii:MII接口使能标志
  5. EthIfFrameOwnerConfig:帧所有者配置

    • EthIfFrameType:以太网帧类型
    • EthIfFrameOwner:帧处理者
  6. EthIfTransceiver:收发器配置

    • EthIfTrcvIdx:收发器索引
    • EthIfEnableTrcvWakeup:唤醒功能使能
/* EthIf模块配置结构示例 */
const EthIf_ConfigType EthIf_Configuration = {/* 全局配置 */.EthIfGeneral = {.EthIfDevErrorDetect = TRUE,                /* 使能开发错误检测 */.EthIfEnableMii = TRUE,                     /* 使能MII接口 */.EthIfEnableRxInterrupt = TRUE,             /* 使能接收中断 */.EthIfEnableTxInterrupt = TRUE,             /* 使能发送中断 */.EthIfMainFunctionPeriod = 0.01,            /* 主函数周期(秒) */.EthIfVersionInfoApi = TRUE,                /* 使能版本信息API */.EthIfTrcvLinkStateChgMainReload = 100      /* 链路状态变化重新加载计数 */},/* 配置集 - 包含具体组件配置 */.EthIfConfigSet = {/* 控制器配置1 */.EthIfController[0] = {.EthIfCtrlIdx = 0,.EthIfCtrlMtu = 1500,                   /* 标准以太网MTU */.EthIfCtrlEnable = TRUE,.EthIfCtrlEnableMii = TRUE,.EthIfCtrlEnableRxInterrupt = TRUE,.EthIfCtrlEnableTxInterrupt = TRUE},/* 收发器配置1 */.EthIfTransceiver[0] = {.EthIfTrcvIdx = 0,.EthIfEnableTrcvWakeup = FALSE},/* 帧所有者配置 - IP帧 */.EthIfFrameOwnerConfig[0] = {.EthIfFrameType = 0x0800,               /* IP帧类型 */.EthIfFrameOwner = "TCP_IP"             /* 处理者为TCP/IP栈 */}}
};

3. 状态管理

3.1 模块状态

EthIf模块具有基本的初始化和未初始化状态,通过EthIf_Init()函数实现状态转换。

在这里插入图片描述

模块状态说明:

  • 未初始化:模块上电后的初始状态,不可调用大多数API
  • 已初始化:执行EthIf_Init()后的状态,模块功能可用

3.2 控制器状态

以太网控制器具有两种主要状态,由上层模块通过EthIf的API控制。

控制器状态:

  • ETH_MODE_DOWN:控制器关闭状态

    • 不可进行数据传输和接收
    • 收发器通常被禁用
    • 降低功耗
  • ETH_MODE_ACTIVE:控制器活动状态

    • 可以进行数据传输和接收
    • 收发器可被配置
    • 链路状态被监控

状态转换通过EthIf_SetControllerMode()API实现,状态变化会通知上层模块。

/* 控制器状态转换示例 */
Std_ReturnType ActivateEthernetController(uint8 CtrlIdx) 
{Std_ReturnType result;/* 请求切换控制器到激活状态 */result = EthIf_SetControllerMode(CtrlIdx, ETH_MODE_ACTIVE);/* 检查操作结果 */if (result == E_OK) {/* 控制器激活请求成功发送 *//* 注意:实际激活是异步的,会通过EthSM_CtrlModeIndication回调通知 */} else {/* 控制器激活请求失败 */}return result;
}

3.3 收发器状态

以太网收发器具有三种主要状态:

收发器状态:

  • ETHTRCV_MODE_DOWN:收发器关闭状态

    • 物理链路断开
    • 最低功耗状态
  • ETHTRCV_MODE_ACTIVE:收发器活动状态

    • 可以通信
    • 物理链路可以建立
  • ETHTRCV_MODE_SLEEP:收发器睡眠状态

    • 低功耗状态
    • 可被远程唤醒

收发器还具有链路状态属性:

  • ETHTRCV_LINK_STATE_DOWN:链路断开
  • ETHTRCV_LINK_STATE_ACTIVE:链路连接
/* 收发器链路状态监控示例 */
void MonitorLinkState(uint8 TrcvIdx) 
{EthTrcv_LinkStateType linkState;Std_ReturnType result;/* 获取当前链路状态 */result = EthIf_GetLinkState(TrcvIdx, &linkState);if (result == E_OK) {if (linkState == ETHTRCV_LINK_STATE_ACTIVE) {/* 链路已连接,可以获取信号质量 */EthIf_SignalQualityResultType signalQuality;if (EthIf_GetTrcvSignalQuality(TrcvIdx, &signalQuality) == E_OK) {/* 处理信号质量信息 */}} else {/* 链路断开 */}}
}

4. 通信流程

4.1 初始化流程

系统启动时,EthIf模块需要完成一系列初始化步骤。

在这里插入图片描述

初始化流程说明:

  1. ECU管理模块调用EthIf初始化

    • 传递配置指针
    • EthIf模块执行内部初始化
  2. EthIf初始化以太网控制器

    • 调用Eth_Init()函数
    • 传递控制器配置
  3. EthIf初始化以太网收发器

    • 调用EthTrcv_Init()函数
    • 传递收发器配置
  4. 激活控制器和收发器

    • 设置控制器为活动状态
    • 设置收发器为活动状态
    • 等待状态变化通知
/* 初始化函数代码示例 */
void EthIf_Init(const EthIf_ConfigType* ConfigPtr) 
{/* 参数检查 */if (ConfigPtr == NULL) {/* 报告开发错误 */ETHIF_DET_REPORT_ERROR(ETHIF_SID_INIT, ETHIF_E_PARAM_POINTER);return;}/* 保存配置指针 */EthIf_ConfigPtr = ConfigPtr;/* 初始化以太网控制器 */for (uint8 i = 0; i < ETHIF_MAX_CONTROLLERS; i++) {if (ConfigPtr->EthIfController[i].EthIfCtrlEnable) {Eth_Init(&Eth_Config[i]);/* 如果配置要求,设置控制器为活动状态 */if (ConfigPtr->EthIfController[i].EthIfCtrlStartMode == ETH_MODE_ACTIVE) {Eth_SetControllerMode(i, ETH_MODE_ACTIVE);}}}/* 初始化以太网收发器 */for (uint8 i = 0; i < ETHIF_MAX_TRANSCEIVERS; i++) {if (ConfigPtr->EthIfTransceiver[i].EthIfTrcvEnable) {EthTrcv_Init(&EthTrcv_Config[i]);/* 如果配置要求,设置收发器为活动状态 */if (ConfigPtr->EthIfTransceiver[i].EthIfTrcvStartMode == ETHTRCV_MODE_ACTIVE) {EthTrcv_SetTransceiverMode(i, ETHTRCV_MODE_ACTIVE);}}}/* 标记模块为已初始化状态 */EthIf_ModuleState = ETHIF_STATE_INITIALIZED;
}

4.2 通信初始化

在系统运行过程中,EthSM可能需要重新初始化通信功能,或根据需要开启/关闭以太网通信。

在这里插入图片描述

通信初始化流程说明:

  1. EthSM请求激活控制器

    • 调用EthIf_SetControllerMode()函数
    • 指定控制器索引和目标模式(ETH_MODE_ACTIVE)
  2. EthIf请求底层驱动激活控制器

    • 调用Eth_SetControllerMode()函数
    • 异步模式工作
  3. 底层驱动完成激活后通知

    • 通过EthIf_CtrlModeIndication()回调通知EthIf
  4. EthIf激活相关收发器

    • 调用EthTrcv_SetTransceiverMode()函数
    • 指定收发器索引和目标模式(ETHTRCV_MODE_ACTIVE)
  5. 收发器完成激活后通知

    • 通过EthIf_TrcvModeIndication()回调通知EthIf
  6. EthIf通知上层模块状态变化

    • 调用EthSM_CtrlModeIndication()通知EthSM模块
/* 通信初始化代码示例 */
Std_ReturnType EthSM_StartCommunication(uint8 NetworkHandle) 
{uint8 CtrlIdx;Std_ReturnType result;/* 从网络句柄获取控制器索引 */CtrlIdx = EthSM_GetControllerIdxFromNetworkHandle(NetworkHandle);/* 请求激活以太网控制器 */result = EthIf_SetControllerMode(CtrlIdx, ETH_MODE_ACTIVE);/* 控制器模式设置是异步的,实际结果将通过EthSM_CtrlModeIndication回调返回 */return result;
}

4.3 数据传输

以太网数据传输涉及缓冲区管理、帧格式化和传输确认等步骤。

在这里插入图片描述

数据传输流程说明:

  1. 上层模块获取传输缓冲区

    • 调用EthIf_ProvideTxBuffer()函数
    • 指定控制器索引、帧类型等参数
    • 获取缓冲区索引和数据指针
  2. 上层模块填充数据并触发传输

    • 填充缓冲区的数据内容
    • 调用EthIf_Transmit()函数触发传输
  3. EthIf将请求转发到底层驱动

    • 调用Eth_Transmit()函数
    • 传递必要的参数
  4. 传输完成后确认

    • 轮询模式:通过EthIf_MainFunctionTx()检查
    • 中断模式:通过EthIf_TxConfirmation()回调通知
  5. EthIf通知上层模块传输完成

    • 调用上层模块的确认回调函数
/* 数据传输代码示例 */
Std_ReturnType TCP_IP_TransmitFrame(uint8 CtrlIdx, const uint8* data, uint16 length) 
{BufReq_ReturnType bufResult;Std_ReturnType result;Eth_BufIdxType bufIdx;uint8* bufPtr;uint16 bufLen;/* 1. 获取传输缓冲区 */bufResult = EthIf_ProvideTxBuffer(CtrlIdx,             /* 控制器索引 */0x0800,              /* IP帧类型 */&bufIdx,             /* 缓冲区索引(输出) */&bufPtr,             /* 缓冲区指针(输出) */&bufLen              /* 缓冲区长度(输出) */);if (bufResult != BUFREQ_OK || bufPtr == NULL) {return E_NOT_OK;     /* 获取缓冲区失败 */}/* 2. 检查缓冲区大小 */if (bufLen < length) {return E_NOT_OK;     /* 缓冲区不足 */}/* 3. 填充数据到缓冲区 */for (uint16 i = 0; i < length; i++) {bufPtr[i] = data[i];}/* 4. 触发传输 */result = EthIf_Transmit(CtrlIdx,             /* 控制器索引 */bufIdx,              /* 缓冲区索引 */0x0800,              /* IP帧类型 */FALSE,               /* 非广播帧 */length,              /* 数据长度 */NULL                 /* 目的MAC地址(NULL表示使用默认地址) */);return result;
}

4.4 数据接收

以太网数据接收过程包括接收中断处理、数据分发和上层通知。

在这里插入图片描述

数据接收流程说明:

  1. 轮询模式接收

    • EthIf周期性调用EthIf_MainFunctionRx()函数
    • 调用Eth_Receive()检查新接收的数据帧
    • 对接收到的数据进行处理和分发
  2. 优先处理的接收

    • 对特定优先级的FIFO使用专用的处理函数
    • 通过EthIf_MainFunctionRx_<PriorityProcessing>()实现
  3. 中断模式接收

    • 控制器接收中断触发Eth_RxIrqHdlr_<CtrlIdx>()
    • 调用EthIf_RxIndication()通知EthIf
    • EthIf将数据分发到对应的上层模块
/* 数据接收处理代码示例 */
void EthIf_MainFunctionRx(void) 
{Eth_RxStatusType rxStatus;uint8 bufPtr[ETH_MAX_FRAME_SIZE];uint16 lenByte;Eth_FrameType frameType;uint8 physAddr[6];boolean isBroadcast;/* 检查模块是否已初始化 */if (EthIf_ModuleState != ETHIF_STATE_INITIALIZED) {return;}/* 遍历所有启用的控制器 */for (uint8 ctrlIdx = 0; ctrlIdx < ETHIF_MAX_CONTROLLERS; ctrlIdx++) {if (!EthIf_ConfigPtr->EthIfController[ctrlIdx].EthIfCtrlEnable) {continue;}/* 遍历所有非优先级处理的FIFO */for (uint8 fifoIdx = 0; fifoIdx < ETH_RX_FIFO_COUNT; fifoIdx++) {/* 检查该FIFO是否已分配给优先处理 */if (EthIf_IsFifoAssignedToPriorityProcessing(ctrlIdx, fifoIdx)) {continue;}/* 接收数据帧 */if (Eth_Receive(ctrlIdx, fifoIdx, &rxStatus) == E_OK) {/* 处理接收到的帧 */frameType = rxStatus->frameType;lenByte = rxStatus->lenByte;isBroadcast = rxStatus->isBroadcast;/* 查找帧类型对应的处理函数 */const EthIf_FrameOwnerConfig* ownerConfig = EthIf_FindFrameOwner(ctrlIdx, frameType);if (ownerConfig != NULL) {/* 调用对应的指示函数 */ownerConfig->EthIfRxIndicationFunction(ctrlIdx,frameType,isBroadcast,rxStatus->physAddr,rxStatus->dataPtr,lenByte);}}}}
}

4.5 链路状态管理

EthIf模块负责监控以太网链路状态,并通知上层模块状态变化。

在这里插入图片描述

链路状态管理流程说明:

  1. 轮询模式检测

    • EthIf周期性调用EthIf_MainFunctionState()函数
    • 调用EthTrcv_GetLinkState()检查链路状态
    • 如果状态发生变化,通知上层模块
  2. 中断模式检测

    • 收发器检测到状态变化后调用EthIf_TrcvLinkStateChg()
    • EthIf通知EthSM链路状态变化
  3. 端口组状态通知

    • 对于配置了端口组的系统,通知BswM_EthIf_PortGroupLinkStateChg()
  4. 信号质量监控

    • 链路状态激活时,可通过EthTrcv_GetPhySignalQuality()获取信号质量
/* 链路状态监控代码示例 */
void EthIf_MainFunctionState(void) 
{EthTrcv_LinkStateType currentLinkState;Std_ReturnType result;/* 检查模块是否已初始化 */if (EthIf_ModuleState != ETHIF_STATE_INITIALIZED) {return;}/* 遍历所有启用的收发器 */for (uint8 trcvIdx = 0; trcvIdx < ETHIF_MAX_TRANSCEIVERS; trcvIdx++) {if (!EthIf_ConfigPtr->EthIfTransceiver[trcvIdx].EthIfTrcvEnable) {continue;}/* 获取当前链路状态 */result = EthTrcv_GetLinkState(trcvIdx, &currentLinkState);if (result != E_OK) {continue;}/* 检查链路状态是否发生变化 */if (currentLinkState != EthIf_StoredLinkState[trcvIdx]) {/* 更新存储的状态 */EthIf_StoredLinkState[trcvIdx] = currentLinkState;/* 获取关联的控制器索引 */uint8 ctrlIdx = EthIf_GetCtrlIdxFromTrcvIdx(trcvIdx);/* 通知EthSM链路状态变化 */EthSM_TrcvLinkStateChg(ctrlIdx, currentLinkState);/* 如果链路激活,获取信号质量 */if (currentLinkState == ETHTRCV_LINK_STATE_ACTIVE) {EthIf_SignalQualityResultType signalQuality;if (EthTrcv_GetPhySignalQuality(trcvIdx, &signalQuality) == E_OK) {/* 更新信号质量信息 */EthIf_StoredSignalQuality[trcvIdx].actualSignalQuality = signalQuality;/* 更新最高/最低信号质量 */if (signalQuality > EthIf_StoredSignalQuality[trcvIdx].highestSignalQuality) {EthIf_StoredSignalQuality[trcvIdx].highestSignalQuality = signalQuality;}if (signalQuality < EthIf_StoredSignalQuality[trcvIdx].lowestSignalQuality) {EthIf_StoredSignalQuality[trcvIdx].lowestSignalQuality = signalQuality;}}}/* 检查是否配置了端口组 */uint8 portGroupIdx = EthIf_GetPortGroupIdxFromTrcvIdx(trcvIdx);if (portGroupIdx != ETHIF_INVALID_PORT_GROUP) {/* 通知BswM端口组链路状态变化 */BswM_EthIf_PortGroupLinkStateChg(portGroupIdx, currentLinkState);}}}
}

5. 总结

AUTOSAR以太网接口(EthIf)模块作为ECU抽象层的关键组件,成功地实现了以下目标:

  • 硬件抽象:通过统一的接口屏蔽不同以太网硬件的差异
  • 灵活配置:支持可扩展的配置结构,实现"one-fits-all"原则
  • 全面的状态管理:提供完善的控制器和收发器状态管理
  • 高效的通信处理:支持多种数据传输和接收模式
  • 可靠的链路管理:提供链路状态监控和通知机制

EthIf模块的设计遵循AUTOSAR的分层原则,使上层应用能够独立于具体硬件,提高了软件的可重用性和可移植性,同时也简化了复杂以太网网络的管理和使用。

通过标准化的接口和灵活的配置,EthIf模块为AUTOSAR架构中的以太网通信提供了坚实的基础,支持从简单的点对点连接到复杂的网络拓扑,满足现代汽车电子系统日益增长的高速数据交换需求。

http://www.xdnf.cn/news/1119799.html

相关文章:

  • GitCode 使用高频问题及解决方案
  • 技嘉UEFI固件SMM漏洞使系统面临固件植入和持久控制风险
  • AI和运维的故事
  • Faiss库
  • 017 进程控制 —— 终止进程
  • C语言-流程控制
  • 深入浅出Kafka Consumer源码解析:设计哲学与实现艺术
  • gitlab-ci.yml
  • Spark 和 Hadoop MapReduce 的基本概念及区别
  • 代码随想录算法训练营第四十九天|单调栈part2
  • PHP password_verify() 函数
  • vue vxe-tree 树组件加载大量节点数据,虚拟滚动的用法
  • 【AutoCAD全网最新版】AutoCAD 2026 保姆级下载安装注册使用详细图文教程
  • 借助DeepSeek编写输出漂亮表格的chdb客户端
  • [源力觉醒 创作者计划]_文心大模型4.5开源部署指南:从技术架构到实战落地
  • sfe_py的应力云图计算与显示step by step
  • 【LeetCode240.搜索二维矩阵Ⅱ】以及变式
  • iOS高级开发工程师面试——RunLoop
  • C++类模版与友元
  • 大数据领域开山鼻祖组件Hadoop核心架构设计
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | GithubProfies(GitHub 个人资料)
  • 编译器 VS 解释器
  • 电脑升级Experience
  • Linux操作系统之信号:信号的产生
  • 【C++进阶】---- 多态
  • 鹧鸪云:别墅光储项目方案设计的最终选择
  • 【Linux系统】进程切换 | 进程调度——O(1)调度队列
  • Linux:3_基础开发⼯具
  • 【Linux】基本指令详解(一) 树状文件结构、家目录、绝对/相对路径、linux文件类型
  • 使用systemctl命令控制软件的启动和关闭