首页 > 其他分享 >AUTOSAR CP Ethernet State Manager(EthSM)规范的主要功能以及工作原理导读

AUTOSAR CP Ethernet State Manager(EthSM)规范的主要功能以及工作原理导读

时间:2024-11-10 20:45:47浏览次数:6  
标签:EthSM 状态 AUTOSAR COMMUNICATION Manager ComMMode 以太网 currentState

在这里插入图片描述

AUTOSAR Ethernet State Manager(以下简称EthSM)规范的主要功能

在这里插入图片描述
AUTOSAR Ethernet State Manager(以下简称EthSM)规范的主要功能包括:

  • 通信控制
    • 网络模式管理:为通信管理器(ComM)提供API,用于请求以太网网络的通信模式,如ETHSM_FULL_COMMUNICATION(全通信)、ETHSM_SILENT_COMMUNICATION(静默通信)和ETHSM_NO_COMMUNICATION(无通信)等。根据ComM的请求,EthSM执行网络模式状态机的状态转换,以控制以太网网络的活动状态。
    • 状态输出与通知
      • 当前状态获取:提供API,允许ComM轮询获取以太网网络的当前通信模式。
      • 状态变化通知:通过回调通知机制,及时向ComM报告通信模式的变化,确保上层模块能够及时了解网络状态的动态调整。
  • 硬件控制
    • 以太网接口控制器管理:根据网络模式状态机的状态,控制每个以太网网络的以太网接口控制器(EthIfCtrl)的工作模式。例如,在从ETHSM_STATE_OFFLINE(离线)状态转换到ETHSM_STATE_WAIT_TRCVLINK(等待接收链路)状态时,EthSM会请求EthIfCtrl设置为ETH_MODE_ACTIVE(激活)模式,以准备接收以太网链路状态信息。
    • 外设控制:通过EthIf的API,对分配给以太网网络的以太网控制器和以太网收发器进行操作,包括设置工作模式、获取链路状态等。
  • 多网络支持
    • 网络分离与处理:能够处理多个独立的以太网网络,包括物理网络和同一物理网络上的不同VLAN。每个网络通过单独的网络句柄进行识别和管理,EthSM可以独立地控制每个网络的通信模式和状态。
  • 错误处理与状态报告
    • 错误分类与报告:定义了开发错误、运行时错误、瞬态故障、生产错误和扩展生产错误等错误类型,并提供相应的错误代码和报告机制。例如,当检测到以太网链路断开时,EthSM会报告ETHSM_E_LINK_DOWN生产错误,并通过与诊断事件管理器(DEM)的接口,将错误信息上报给上层进行处理。
    • 状态信息报告:EthSM会向基本软件模式管理器(BswM)报告其内部状态的变化,包括进入的子状态等信息,以便BswM进行整体的系统状态管理和决策。

以下是一个具体的例子来说明EthSM的功能和用途以及与其他相关模块的关系:

  • 场景描述
    • 假设在一辆汽车中,车载网络系统使用以太网进行通信,包括发动机控制单元(ECU)、仪表盘控制单元和多媒体娱乐系统等多个电子控制单元(ECU)。
    • 这些ECU通过以太网进行数据传输,以实现车辆的各种功能,如发动机状态监测、仪表盘显示和多媒体娱乐等。
  • 功能体现
    • 通信模式控制
      • 当驾驶员启动车辆时,ComM向EthSM发送请求,要求建立全通信模式,以确保所有ECU能够正常通信。EthSM接收到请求后,根据网络模式状态机的规则,将以太网网络的状态从ETHSM_NO_COMMUNICATION转换到ETHSM_FULL_COMMUNICATION。在这个过程中,EthSM会控制以太网接口控制器设置为ETH_MODE_ACTIVE模式,使以太网链路处于激活状态,并等待接收链路状态信息。
      • 当车辆处于行驶过程中,仪表盘控制单元需要进行一些紧急操作,如显示故障信息,此时ComM会向EthSM发送请求,将通信模式切换到静默通信模式,以减少网络通信量,确保紧急操作的优先级。EthSM接收到请求后,会将以太网网络的状态转换到ETHSM_STATE_WAIT_OFFLINE状态,并请求EthIfCtrl设置为ETH_MODE_ACTIVE_TX_OFFLINE模式,禁用以太网帧的传输,但仍保持接收处理功能。
    • 硬件控制与状态监测
      • 以太网收发器通过EthTrcv模块与EthSM进行交互。当以太网收发器的链路状态发生变化时,如从连接状态变为断开状态,EthTrcv会向EthSM发送EthSM_TrcvLinkStateChg通知消息,携带链路状态信息。EthSM接收到通知后,会根据当前的网络状态进行相应的处理。例如,如果当前网络处于ETHSM_STATE_WAIT_ONLINE状态,EthSM会根据链路状态的变化,决定是继续等待IP通信建立(如果链路重新激活),还是返回ETHSM_STATE_WAIT_TRCVLINK状态,重新等待链路状态稳定。
      • 同时,EthSM还会通过EthIf的API获取以太网接口控制器的状态信息,并与期望的状态进行比较。如果发现状态不匹配,EthSM会将硬件设备恢复到相应的状态,以确保网络通信的稳定性和可靠性。
    • 与其他模块协作
      • 与ComM协作:ComM作为上层的通信管理模块,负责协调各个ECU之间的通信。EthSM为ComM提供了以太网网络通信模式的控制接口,ComM通过调用EthSM的API来请求和获取以太网网络的通信状态。例如,ComM在接收到来自各个ECU的通信请求后,会根据系统的整体需求,向EthSM发送相应的通信模式请求,EthSM负责将这些请求转换为对以太网硬件的操作,并将网络状态的变化及时反馈给ComM,ComM再将这些状态信息传递给其他相关的ECU,实现整个车载网络系统的通信管理和控制。
      • 与Tcplp协作:Tcplp是AUTOSAR中的TCP/IP协议栈模块,负责处理网络数据包的传输和接收。EthSM与Tcplp通过相互调用API进行协作,以确保以太网网络与TCP/IP协议栈之间的协调工作。例如,当EthSM需要请求TCP/IP模块进行通信模式切换时,会调用Tcplp的Tcplp_RequestComModeAPI;当Tcplp的状态发生变化时,会通过EthSM_TcpIpModeIndication回调通知EthSM,EthSM根据这些状态信息来调整以太网网络的通信模式和状态。
      • 与DEM和BswM协作
        • 错误报告:当EthSM检测到错误事件,如以太网链路断开、无效的通信模式请求等,会通过与DEM的接口,将错误信息报告给DEM模块。DEM模块负责将这些错误信息进行记录和处理,可能会触发相应的错误指示灯或进行系统故障诊断。
        • 状态管理:EthSM会向BswM报告其内部状态的变化,包括网络模式的转换、状态机的进入和退出等信息。BswM根据这些状态信息进行系统整体的状态管理和决策,例如在系统出现故障时,BswM可以根据EthSM的状态信息,采取相应的恢复措施,如重新启动以太网网络、切换到备用通信模式等。

通过这个例子可以看出,EthSM在汽车以太网通信系统中起着至关重要的作用,它通过对以太网网络的通信模式和硬件状态进行管理和控制,确保了各个ECU之间的通信可靠性和稳定性,同时与其他相关模块紧密协作,实现了整个车载网络系统的高效运行。

使用C++ 源代码来说明EthSM工作原理

以下是一个使用C++ 源代码来说明EthSM工作原理的示例:

#include <iostream>
#include <string>
#include <vector>

// 模拟以太网状态相关的枚举类型
enum class EthSMState {
    OFFLINE,
    WAIT_TRCVLINK,
    WAIT_ONLINE,
    ONLINE,
    ONHOLD,
    WAIT_OFFLINE
};

// 模拟以太网网络模式
enum class ComMMode {
    NO_COMMUNICATION,
    FULL_COMMUNICATION,
    SILENT_COMMUNICATION
};

// 模拟以太网接口控制器状态
enum class EthIfCtrlMode {
    DOWN,
    ACTIVE,
    ACTIVE_WITH_WAKEUP_REQUEST
};

// EthSM类
class EthSM {
private:
    EthSMState currentState;
    std::vector<ComMMode> requestedModes;
    std::vector<EthIfCtrlMode> controllerModes;
    bool wakeupSleepOnDatalineEnabled;
    bool forwardSilentCommunicationEnabled;

    // 模拟向BswM报告状态的函数
    void reportToBswM(EthSMState newState) {
        std::cout << "EthSM: Entered state " << static_cast<int>(newState) << std::endl;
    }

    // 模拟与以太网接口控制器的交互函数
    void setEthIfCtrlMode(EthIfCtrlMode mode, int networkHandle) {
        std::cout << "EthSM: Set Ethernet Interface Controller " << networkHandle << " to mode " << static_cast<int>(mode) << std::endl;
    }

    // 模拟与通信管理器的交互函数
    void notifyComM(ComMMode mode) {
        std::cout << "EthSM: Notified ComM of mode change to " << static_cast<int>(mode) << std::endl;
    }

    // 根据请求模式进行状态转换
    void processRequest(ComMMode requestedMode, int networkHandle) {
        requestedModes.push_back(requestedMode);

        switch (currentState) {
            case EthSMState::OFFLINE:
                if (requestedMode == ComMMode::FULL_COMMUNICATION || requestedMode == ComMMode::FULL_COMMUNICATION_WITH_WAKEUP_REQUEST) {
                    controllerModes.push_back(EthIfCtrlMode::ACTIVE);
                    currentState = EthSMState::WAIT_TRCVLINK;
                    reportToBswM(currentState);
                }
                break;
            case EthSMState::WAIT_TRCVLINK:
                if (requestedMode == ComMMode::NO_COMMUNICATION) {
                    controllerModes.push_back(EthIfCtrlMode::DOWN);
                    currentState = EthSMState::OFFLINE;
                    reportToBswM(currentState);
                } else if (requestedMode == ComMMode::FULL_COMMUNICATION_WITH_WAKEUP_REQUEST && wakeupSleepOnDatalineEnabled) {
                    controllerModes.push_back(EthIfCtrlMode::ACTIVE_WITH_WAKEUP_REQUEST);
                } else if (requestedMode == ComMMode::FULL_COMMUNICATION && EthIfIsLinkActive(networkHandle)) {
                    controllerModes.push_back(EthIfCtrlMode::ACTIVE);
                    currentState = EthSMState::WAIT_ONLINE;
                    reportToBswM(currentState);
                }
                break;
            case EthSMState::WAIT_ONLINE:
                if (requestedMode == ComMMode::NO_COMMUNICATION) {
                    controllerModes.push_back(EthIfCtrlMode::DOWN);
                    currentState = EthSMState::OFFLINE;
                    reportToBswM(currentState);
                } else if (requestedMode == ComMMode::FULL_COMMUNICATION_WITH_WAKEUP_REQUEST && wakeupSleepOnDatalineEnabled) {
                    controllerModes.push_back(EthIfCtrlMode::ACTIVE_WITH_WAKEUP_REQUEST);
                } else if (EthTcpIpIsOnline(networkHandle)) {
                    controllerModes.push_back(EthIfCtrlMode::ACTIVE);
                    currentState = EthSMState::ONLINE;
                    notifyComM(ComMMode::FULL_COMMUNICATION);
                    reportToBswM(currentState);
                } else if (requestedMode == ComMMode::SILENT_COMMUNICATION && forwardSilentCommunicationEnabled) {
                    controllerModes.push_back(EthIfCtrlMode::ACTIVE_TX_OFFLINE);
                    currentState = EthSMState::WAIT_OFFLINE;
                    reportToBswM(currentState);
                }
                break;
            case EthSMState::ONLINE:
                if (requestedMode == ComMMode::NO_COMMUNICATION || requestedMode == ComMMode::SILENT_COMMUNICATION) {
                    controllerModes.push_back(EthIfCtrlMode::ACTIVE_TX_OFFLINE);
                    currentState = EthSMState::WAIT_OFFLINE;
                    reportToBswM(currentState);
                } else if (requestedMode == ComMMode::FULL_COMMUNICATION_WITH_WAKEUP_REQUEST && wakeupSleepOnDatalineEnabled) {
                    controllerModes.push_back(EthIfCtrlMode::ACTIVE_WITH_WAKEUP_REQUEST);
                } else if (EthTcpIpIsOffline(networkHandle)) {
                    controllerModes.push_back(EthIfCtrlMode::ACTIVE);
                    currentState = EthSMState::WAIT_ONLINE;
                    notifyComM(ComMMode::NO_COMMUNICATION);
                    reportToBswM(currentState);
                }
                break;
            case EthSMState::ONHOLD:
                if (requestedMode == ComMMode::FULL_COMMUNICATION_WITH_WAKEUP_REQUEST && wakeupSleepOnDatalineEnabled) {
                    controllerModes.push_back(EthIfCtrlMode::ACTIVE_WITH_WAKEUP_REQUEST);
                } else if (requestedMode == ComMMode::NO_COMMUNICATION) {
                    controllerModes.push_back(EthIfCtrlMode::DOWN);
                    currentState = EthSMState::OFFLINE;
                    reportToBswM(currentState);
                }
                break;
            case EthSMState::WAIT_OFFLINE:
                if (requestedMode == ComMMode::NO_COMMUNICATION) {
                    if (EthTcpIpIsOffline(networkHandle)) {
                        currentState = EthSMState::OFFLINE;
                        notifyComM(ComMMode::NO_COMMUNICATION);
                        reportToBswM(currentState);
                    }
                } else if (requestedMode == ComMMode::FULL_COMMUNICATION_WITH_WAKEUP_REQUEST) {
                    controllerModes.push_back(EthIfCtrlMode::ACTIVE_WITH_WAKEUP_REQUEST);
                }
                break;
        }
    }

    // 模拟以太网链路是否激活的函数
    bool EthIfIsLinkActive(int networkHandle) {
        // 这里可以根据实际情况进行实现,假设返回true表示链路激活
        return true;
    }

    // 模拟TCP/IP是否在线的函数
    bool EthTcpIpIsOnline(int networkHandle) {
        // 这里可以根据实际情况进行实现,假设返回true表示在线
        return true;
    }

    // 模拟TCP/IP是否离线的函数
    bool EthTcpIpIsOffline(int networkHandle) {
        // 这里可以根据实际情况进行实现,假设返回true表示离线
        return false;
    }

public:
    // 初始化函数
    void init() {
        currentState = EthSMState::OFFLINE;
        std::cout << "EthSM: Initialized to state " << static_cast<int>(currentState) << std::endl;
    }

    // 请求通信模式的函数
    void requestComMode(ComMMode mode, int networkHandle) {
        processRequest(mode, networkHandle);
    }

    // 获取当前通信模式的函数
    ComMMode getCurrentComMode(int networkHandle) {
        // 这里可以根据实际情况进行实现,返回当前的通信模式
        return ComMMode::FULL_COMMUNICATION;
    }
};

int main() {
    EthSM ethSM;
    ethSM.init();

    // 模拟请求通信模式
    ethSM.requestComMode(ComMMode::FULL_COMMUNICATION, 0);
    ethSM.requestComMode(ComMMode::SILENT_COMMUNICATION, 0);
    ethSM.requestComMode(ComMMode::NO_COMMUNICATION, 0);

    return 0;
}

以下是对上述代码的详细解释:

  • 类定义与成员变量
    • 类定义:定义了EthSM类来模拟EthSM的功能。
    • 成员变量
      • currentState:表示EthSM的当前状态。
      • requestedModes:存储ComM请求的通信模式。
      • controllerModes:存储根据请求模式设置的以太网接口控制器模式。
      • wakeupSleepOnDatalineEnabledforwardSilentCommunicationEnabled:用于配置EthSM的一些特性。
  • 函数实现
    • 主要函数
      • processRequest函数:根据ComM请求的通信模式和当前的EthSM状态,进行状态转换和控制器模式设置,并将状态变化报告给BswM。
      • requestComMode函数:调用processRequest函数来处理ComM的通信模式请求。
      • getCurrentComMode函数:模拟获取当前的通信模式,这里简单返回ComMMode::FULL_COMMUNICATION
    • 辅助函数
      • reportToBswM函数:用于向BswM报告EthSM进入的新状态。
      • setEthIfCtrlMode函数:模拟设置以太网接口控制器的模式。
      • notifyComM函数:用于通知ComM通信模式的变化。
      • EthIfIsLinkActiveEthTcpIpIsOnlineEthTcpIpIsOffline函数:用于模拟以太网链路状态和TCP/IP在线状态的检查,这里只是简单的示例,实际应用中需要根据具体的硬件和协议进行实现。
  • 主函数
    • main函数中,创建了EthSM对象并进行初始化,然后模拟了一些通信模式请求,并打印出相应的状态信息。

这个示例代码简单地模拟了EthSM的工作原理,实际的EthSM实现会更加复杂,需要与实际的硬件和其他模块进行交互,处理更多的错误情况和状态变化,并提供更完善的功能和接口。但通过这个示例,可以大致了解EthSM在处理以太网通信模式控制和状态管理方面的工作方式。

标签:EthSM,状态,AUTOSAR,COMMUNICATION,Manager,ComMMode,以太网,currentState
From: https://blog.csdn.net/gzjimzhou/article/details/143663143

相关文章

  • AUTOSAR AP在实际使用中有哪些问题和挑战?有什么好的解决办法?
    在实际使用AUTOSARAdaptivePlatform(AP)时,开发者和工程师会面临一系列问题和挑战。以下是一些常见的挑战以及相应的解决办法:主要问题与挑战:学习曲线陡峭:AUTOSARAP的标准和架构复杂,对于没有相关经验的开发者,学习和掌握所需的知识可能需要较长时间。工具链和生态系统的......
  • AUTOSAR解决方案 — INTEWORK-EAS-CP
        随着汽车电子技术的发展,汽车电子领域的嵌入式软件规模越来越庞大,AUTOSAR的软件架构和方法论已被越来越多的OEM和供应商认可。在国外市场,越来越多的AUTOSAR车型上市,各大OEM也已对其供应商提出了明确的符合AUTOSAR的要求。在国内,经过一阶段的积累和预研,各OEM也正式启动了......
  • 节能攻略,AUTOSAR PN局部网络管理技术!
        随着整车功能的不断演进,车上各类用电设备(控制器、执行机构、感知设备等)的用电功耗越来越大,为了降低整车能耗,国内外很多OEM及Tire1都在考虑相关的机制及方案,其中PN局部网络管理机制,以其简单、灵活的特点获得众多落地应用。    基于AUTOSAR方案的局部网络管理机......
  • Prometheus Alert Manager -- Difference between group_wait, group_interval, and r
    Definitiongroup_interval:group_interval dictateshowlongtowaitbeforesendingnotificationsaboutnewalertsthatareaddedtoagroupofalertsthathavebeenalertedonbefore。repeat_interval:IfthereisnothingchangeintheAlertGroup......
  • 一文轻松了解AUTOSAR系统开发步骤顺序
    目录往期推荐AUTOSAR方法论的典型开发步骤顺序1. 需求分析(RequirementAnalysis)2. 系统架构设计(SystemArchitectureDesign)3.软件组件设计与实现(SoftwareComponentDesignandImplementation)4.ECU配置与基础软件配置(ECUConfigurationandBasicSoftwareConfigu......
  • python webdriver-manager 实现selenium 免下载安装webdriver
    selenium在自动化测试中,通常需要使用浏览器驱动来与浏览器进行交互。然而,手动下载、安装、以及管理这些驱动非常麻烦,尤其是当驱动版本频繁更新时。为此,webdriver-manager库提供了一个极简的方案,自动帮我们下载、更新和管理驱动,使Selenium代码更简洁优雅。webdriver-managergit......
  • AUTOSAR解决方案 — INTEWORK-EAS-AP
        随着汽车智能化、网联化以及汽车电子电气架构发展,汽车功能需求越发复杂,越来越多的零部件及OEM采用性能更高的硬件平台以及多元化的软件架构。尤其是对于高级自动驾驶,智能座舱、高性能(异构)计算平台来说,仅依靠AUTOSARCP软件架构已经无法满足需求。    2017年,A......
  • start-all.sh脚本启动Hadoop的NameNode、DataNode、ResourceManager和NodeManager失败
    今天在做大数据实验时,在终端,start-all.sh脚本启动Hadoop的NameNode、DataNode、ResourceManager和NodeManager失败,出现下面的错误信息:[root@node1hadoop]#./sbin/start-all.shStartingnamenodeson[node1]ERROR:AttemptingtooperateonhdfsnamenodeasrootERROR:butt......
  • alertmanager: 查看日志
    一,在service文件中,指定日志的level编辑service文件[Unit]Description=AlertManagerwants=network-online.targetAfter=network-online.target[Service]Type=simpleUser=prometheusGroup=prometheusRestart=alwaysExecStart=/opt/alertmanager-0.27.0.linux-amd64/ale......
  • alertmanager源码:整体架构和流程分析
    alertmanager整体的架构,官方的这张图说的很清楚,本文从源码的角度,分析其各个模块,以及模块间的交互流程。alertmanager的代码使用v0.24.0版本。一.API接收alerts接口alerts的API为:POST/api/v2/alerts该API的handler如下:该handler先进行数据转换后,再进行数据校验,最后放入a......