AUTOSAR进阶图解==>AUTOSAR_SWS_FlexRayNetworkManagement

AUTOSAR FlexRay网络管理模块详解

详解AUTOSAR中FlexRay网络管理的架构、状态机、配置与接口

目录


1. 概述

1.1 功能概览

AUTOSAR FlexRay网络管理(FrNm)是AUTOSAR标准中定义的一种硬件无关的协议,专门用于FlexRay通信网络。其主要目的是协调网络上各ECU(电子控制单元)在正常操作模式和总线休眠模式之间的转换。

FlexRay网络管理具有以下核心功能:

  • 协调网络状态转换:管理正常运行和低功耗休眠模式间的切换
  • 节点检测:可选功能,用于检测网络中所有在线节点
  • 预备睡眠状态检测:确保所有节点都准备好进入休眠状态
  • 网络唤醒管理:处理网络唤醒请求和响应

在这里插入图片描述

图1: FlexRay网络管理架构图

1.2 术语与缩写

  • ECU: 电子控制单元(Electronic Control Unit)
  • NM: 网络管理(Network Management)
  • FrNm: FlexRay网络管理(FlexRay Network Management)
  • ComM: 通信管理器(Communication Manager)
  • NmIf: 网络管理接口(Network Management Interface)
  • FrIf: FlexRay接口(FlexRay Interface)
  • CBV: 控制位向量(Control Bit Vector)
  • PDU: 协议数据单元(Protocol Data Unit)
  • NM-Vote: 网络管理投票信息
  • NM-Data: 网络管理相关数据

2. 架构设计

2.1 模块架构

FlexRay网络管理模块(FrNm)位于AUTOSAR通信服务层,通过网络管理接口(NmIf)向上提供服务给通信管理器(ComM),向下通过FlexRay接口(FrIf)与FlexRay驱动(Fr)通信。

模块 FlexRay网络管理(FrNm):

  • 职责: FrNm负责协调FlexRay网络的正常操作与总线休眠模式之间的转换,通过在网络中传递和处理网络管理信息实现这一功能
  • 功能点:
    • 管理ECU网络状态(请求/释放)
    • 协调网络范围内的唤醒与休眠
    • 支持节点检测和预备睡眠检测
    • 处理网络唤醒请求

模块 通信管理器(ComM):

  • 职责: 作为应用层与网络管理层之间的接口,处理通信请求
  • 功能点:
    • 接收应用层的通信请求
    • 通过NmIf向FrNm传递请求
    • 处理网络状态变化通知

模块 FlexRay接口(FrIf):

  • 职责: 提供FlexRay通信控制器的统一抽象接口
  • 功能点:
    • 提供硬件无关的通信服务
    • 处理PDU传输和接收
    • 管理FlexRay控制器的启动和停止
/* AUTOSAR FrNm模块使用示例 */
#include "Std_Types.h"
#include "FrNm.h"
#include "FrIf.h"
#include "NmIf.h"

/* 网络初始化函数 */
Std_ReturnType Network_Initialize(void)
{
    Std_ReturnType result;
    
    /* 初始化FrNm模块 */
    result = FrNm_Init(&FrNm_Configuration);
    if (result != E_OK) {
        /* 处理初始化错误 */
        return result;
    }
    
    /* 其他初始化操作 */
    
    return E_OK;
}

/* 网络唤醒函数 */
Std_ReturnType Network_WakeUp(NetworkHandleType NetworkHandle)
{
    Std_ReturnType result;
    
    /* 请求网络 */
    result = FrNm_NetworkRequest(NetworkHandle);
    if (result != E_OK) {
        /* 处理请求错误 */
        return result;
    }
    
    return E_OK;
}

2.2 依赖关系

FrNm模块具有以下依赖关系:

  1. 向上依赖:

    • 网络管理接口(NmIf):提供通用网络管理服务给上层模块
  2. 向下依赖:

    • FlexRay接口(FrIf):提供对FlexRay总线的访问
    • PDU路由器(PduR):用于PDU路由
  3. 水平依赖:

    • FlexRay状态管理器(FrSm):负责FlexRay通信控制器的状态管理
    • ECU状态管理器(EcuM):负责ECU的状态管理
  4. 服务依赖:

    • 操作系统(OS):使用操作系统服务
    • 默认错误追踪器(DET):用于错误检测和报告

3. 状态机设计

3.1 主要状态

FlexRay网络管理状态机由三个主要状态组成:

  1. 总线休眠模式(Bus-Sleep Mode):

    • 通信控制器处于休眠状态,功耗降至最低
    • 唤醒检测机制保持活跃
    • 初始化后默认进入此状态
  2. 同步模式(Synchronize Mode):

    • 等待与FlexRay通信周期同步
    • 不发送NM数据和NM投票
    • 网络请求或被动唤醒后进入此状态
  3. 网络模式(Network Mode):

    • 管理网络通信流程
    • 包含三个子状态:重复消息状态、正常操作状态、就绪睡眠状态

在这里插入图片描述

图2: FlexRay网络管理状态机

3.2 网络模式子状态

网络模式包含三个子状态:

  1. 重复消息状态(Repeat Message State):

    • 激活NM数据传输
    • 投票保持集群唤醒
    • 确保任何从总线休眠到网络模式的转换对其他节点可见
    • 启动重复消息计时器(FrNmRepeatMessageTime)
  2. 正常操作状态(Normal Operation State):

    • 继续传输NM数据
    • 投票保持集群唤醒
    • 处理常规通信
    • 网络请求活跃时维持此状态
  3. 就绪睡眠状态(Ready Sleep State):

    • 不传输NM数据
    • 发送负面NM投票
    • 等待所有节点也准备好睡眠
    • 网络释放后进入此状态

状态 总线休眠模式:

  • 描述: 在总线休眠模式下,通信控制器处于休眠状态,功耗降至最低,但唤醒检测机制仍然活跃。当网络请求被调用或被动启动时,FrNm将离开此状态进入同步模式。
  • 相关功能:
    • 降低功耗
    • 保持唤醒检测
    • 对网络请求或被动启动作出响应
  • 进入条件:
    • 初始化后默认进入
    • 就绪睡眠计数器超时后
    • 同步模式下接收到启动错误且网络已释放时
/* 总线休眠模式相关代码示例 */
void HandleBusSleepMode(NetworkHandleType NetworkHandle)
{
    Nm_StateType currentState;
    Nm_ModeType currentMode;
    
    /* 获取当前网络状态 */
    FrNm_GetState(NetworkHandle, &currentState, &currentMode);
    
    if (currentState == NM_STATE_BUS_SLEEP && currentMode == NM_MODE_BUS_SLEEP) {
        /* 总线处于休眠状态,执行低功耗操作 */
        ECU_EnterLowPowerMode();
        
        /* 配置唤醒源 */
        ECU_ConfigureWakeupSources(WAKEUP_SOURCE_FLEXRAY);
    }
}

3.3 状态转换条件

FlexRay网络管理状态机的主要转换条件包括:

  1. 总线休眠模式 → 同步模式:

    • FrNm_NetworkRequest()被调用
    • FrNm_PassiveStartUp()被调用
  2. 同步模式 → 网络模式:

    • 到达首个NM重复周期边界
    • 调用Nm_NetworkMode()通知上层
  3. 网络模式 → 总线休眠模式:

    • 就绪睡眠计数器(FrNmReadySleepCnt)超时
    • 调用Nm_BusSleepMode()通知上层
  4. 总线休眠模式 → 网络模式:

    • 检测到ClusterAwakeVote
    • 调用Nm_NetworkStartIndication()通知上层

此外,还有一个平行的网络请求状态,通过FrNm_NetworkRequest()FrNm_NetworkRelease()控制。


4. 交互流程

4.1 网络请求流程

当应用层需要通信时,会触发网络请求流程:

在这里插入图片描述

图3: FlexRay网络管理典型交互序列

  1. 应用层通过ComM请求通信
  2. ComM调用Nm_NetworkRequest()
  3. NmIf调用FrNm_NetworkRequest()
  4. FrNm设置FrNm_NetworkRequest = TRUE并从总线休眠模式转换到同步模式
  5. FrNm调用FrIf_StartCommunication()启动FlexRay通信
  6. FrNm向NmIf通知状态变化(Nm_SynchronizeMode())
  7. FrNm等待同步到重复周期边界
  8. FrNm进入网络模式,调用Nm_NetworkMode()
  9. FrNm开始发送NM消息(正面投票)

函数 FrNm_NetworkRequest:

  • 描述: 该函数用于请求网络通信,将使FrNm从总线休眠模式转换到同步模式,然后在同步到重复周期边界后进入网络模式
  • 参数:
    • NetworkHandle [输入]: 网络通道标识符, 类型: NetworkHandleType, 取值范围: 依据配置
  • 返回值:
    • E_OK: 网络请求成功处理
    • E_NOT_OK: 指定的网络句柄无效或模块未初始化
  • 相关函数:
    • 上层: Nm_NetworkRequest
    • 下层: FrIf_StartCommunication
    • 并列: FrNm_NetworkRelease, FrNm_PassiveStartUp
/* 网络请求流程代码示例 */
Std_ReturnType Application_RequestCommunication(NetworkHandleType NetworkHandle)
{
    Std_ReturnType result;
    
    /* 应用层请求通信 */
    result = ComM_RequestComMode(COMM_USER_ID, NetworkHandle, COMM_FULL_COMMUNICATION);
    if (result != E_OK) {
        /* 处理请求错误 */
        return result;
    }
    
    /* 通信管理器会调用Nm_NetworkRequest,进而调用FrNm_NetworkRequest */
    
    /* 等待网络进入完全通信模式 */
    Nm_StateType nmState;
    Nm_ModeType nmMode;
    uint8 retries = 0;
    
    do {
        /* 短暂延时 */
        OS_Sleep(10);
        
        /* 获取当前网络状态 */
        FrNm_GetState(NetworkHandle, &nmState, &nmMode);
        retries++;
    } while (nmMode != NM_MODE_NETWORK && retries < MAX_RETRY_COUNT);
    
    if (nmMode == NM_MODE_NETWORK) {
        return E_OK;
    } else {
        return E_NOT_OK;
    }
}

4.2 网络释放流程

当应用层不再需要通信时,会触发网络释放流程:

  1. 应用层通过ComM释放通信请求
  2. ComM调用Nm_NetworkRelease()
  3. NmIf调用FrNm_NetworkRelease()
  4. FrNm设置FrNm_NetworkRequest = FALSE
  5. FrNm在下一个重复周期边界切换到就绪睡眠状态
  6. FrNm开始发送NM消息(负面投票)
  7. FrNm等待就绪睡眠计数器超时
  8. 超时后FrNm进入总线休眠模式,调用Nm_BusSleepMode()
  9. FrNm调用FrIf_StopCommunication()停止FlexRay通信

函数 FrNm_NetworkRelease:

  • 描述: 该函数用于释放网络通信,设置FrNm_NetworkRequest为FALSE。在重复周期完成且没有活动的重复消息请求时,FrNm将从正常操作状态转换到就绪睡眠状态。
  • 参数:
    • NetworkHandle [输入]: 网络通道标识符, 类型: NetworkHandleType, 取值范围: 依据配置
  • 返回值:
    • E_OK: 网络释放成功处理
    • E_NOT_OK: 指定的网络句柄无效或模块未初始化
  • 相关函数:
    • 上层: Nm_NetworkRelease
    • 并列: FrNm_NetworkRequest

4.3 被动唤醒流程

当FlexRay总线上有其他节点发送正面投票时,处于总线休眠模式的节点可能会被动唤醒:

  1. FrIf调用FrNm_RxIndication()通知接收到NM消息
  2. FrNm检测到睡眠状态下接收到NM消息(正面投票)
  3. FrNm调用Nm_NetworkStartIndication()通知NmIf
  4. FrNm调用FrIf_StartCommunication()启动FlexRay通信
  5. FrNm从总线休眠模式转换到同步模式,然后进入网络模式

函数 FrNm_RxIndication:

  • 描述: 由FlexRay接口在接收到NM PDU时调用,处理接收到的NM消息并根据当前状态和消息内容执行相应操作
  • 参数:
    • RxPduId [输入]: 接收到的PDU标识符, 类型: PduIdType, 取值范围: 依据配置
    • PduInfoPtr [输入]: 指向包含PDU数据的结构体,类型: PduInfoType*, 取值范围: 有效指针
  • 相关函数:
    • 上层: FrIf接收处理函数
    • 并列: FrNm_TxConfirmation, FrNm_TriggerTransmit
/* 被动唤醒处理示例代码 */
void HandlePassiveWakeup(void)
{
    /* 此函数由FrNm_RxIndication触发的回调函数调用 */
    
    /* 总线被唤醒,退出低功耗模式 */
    ECU_ExitLowPowerMode();
    
    /* 准备处理网络通信 */
    InitializeCommunicationResources();
    
    /* 注册网络状态变化回调 */
    RegisterNetworkStatusCallback();
}

5. 接口与数据结构

5.1 主要接口

在这里插入图片描述

图4: FlexRay网络管理接口和数据结构

FlexRay网络管理模块提供以下主要接口:

  1. 初始化与配置接口:

    • FrNm_Init: 初始化FrNm模块
    • FrNm_PassiveStartUp: 被动启动网络
    • FrNm_GetVersionInfo: 获取版本信息
    • FrNm_GetState: 获取当前网络状态
    • FrNm_SetSleepReadyBit: 设置睡眠准备位
  2. 网络管理请求接口:

    • FrNm_NetworkRequest: 请求网络通信
    • FrNm_NetworkRelease: 释放网络通信请求
    • FrNm_RepeatMessageRequest: 请求重复消息
    • FrNm_RequestBusSynchronization: 请求总线同步
    • FrNm_CheckRemoteSleepIndication: 检查远程睡眠指示
  3. 数据访问接口:

    • FrNm_GetPduData: 获取PDU数据
    • FrNm_GetNodeIdentifier: 获取节点标识符
    • FrNm_GetLocalNodeIdentifier: 获取本地节点标识符
    • FrNm_SetUserData: 设置用户数据
    • FrNm_GetUserData: 获取用户数据

5.2 关键数据结构

FrNm模块使用以下关键数据结构:

  1. FrNm_StateType: FrNm状态枚举

    typedef enum {
        FRNM_STATE_UNINIT,
        FRNM_STATE_BUS_SLEEP,
        FRNM_STATE_SYNCHRONIZE,
        FRNM_STATE_NETWORK_MODE_REPEAT_MESSAGE,
        FRNM_STATE_NETWORK_MODE_NORMAL_OPERATION,
        FRNM_STATE_NETWORK_MODE_READY_SLEEP
    } FrNm_StateType;
    
  2. FrNm_ConfigType: FrNm配置结构体

    typedef struct {
        /* 集群配置 */
        uint8 FrNmClusterId;
        NetworkHandleType NetworkHandle;
        uint8 FrNmChannelActive;
        uint8 FrNmNodeId;
        
        /* 定时参数 */
        uint16 FrNmRepeatMessageTime;
        uint8 FrNmReadySleepCnt;
        uint8 FrNmRepetitionCycle;
        uint8 FrNmVotingCycle;
        
        /* 特性控制 */
        boolean FrNmNodeDetectionEnabled;
        boolean FrNmSourceNodeIdentifierEnabled;
        boolean FrNmPassiveModeEnabled;
        /* 更多配置参数... */
    } FrNm_ConfigType;
    
  3. FrNm_CBVType: 控制位向量结构体

    typedef struct {
        boolean RepeatMessageRequest;     /* 重复消息请求位 */
        boolean NmCoordinatorSleepReady;  /* 协调器睡眠准备位 */
        boolean ActiveWakeup;             /* 主动唤醒位 */
        boolean PartialNetworkInformation; /* 部分网络信息位 */
        boolean CarWakeUpBit;             /* 汽车唤醒位 */
    } FrNm_CBVType;
    
  4. FrNm_PDU: NM PDU结构体

    typedef struct {
        uint8 NmControlBits;             /* 控制位字节 */
        uint8* NmUserData;               /* 用户数据区域 */
        uint8 SourceNodeIdentifier;      /* 源节点标识符 */
    } FrNm_PDU;
    

5.3 回调函数

FrNm模块使用以下回调函数与其他模块交互:

  1. FrNm向上回调函数 (通过NmIf调用):

    • Nm_NetworkStartIndication: 通知网络启动
    • Nm_NetworkMode: 通知进入网络模式
    • Nm_BusSleepMode: 通知进入总线休眠模式
    • Nm_SynchronizeMode: 通知进入同步模式
    • Nm_CoordReadyToSleepIndication: 通知协调器睡眠准备
    • Nm_CoordReadyToSleepCancellation: 通知协调器睡眠准备取消
  2. FrNm被调用函数 (由FrIf调用):

    • FrNm_RxIndication: 接收NM PDU时的回调
    • FrNm_TriggerTransmit: 触发PDU传输时的回调
    • FrNm_TxConfirmation: PDU传输确认的回调
    • FrNm_StartupError: FlexRay启动错误的回调
/* FrNm回调函数使用示例 */
void FrIf_RxIndication_Wrapper(PduIdType RxPduId, const PduInfoType* PduInfoPtr)
{
    /* 验证参数 */
    if (PduInfoPtr == NULL) {
        return;
    }
    
    /* 检查是否是NM PDU */
    if (IsNmPdu(RxPduId)) {
        /* 调用FrNm接收回调 */
        FrNm_RxIndication(RxPduId, PduInfoPtr);
    } else {
        /* 其他PDU处理... */
    }
}

6. 配置与初始化

6.1 配置参数

在这里插入图片描述

图5: FlexRay网络管理配置流程

FlexRay网络管理模块需要配置以下关键参数:

  1. 模块级参数:

    • FrNm_DevErrorDetect: 开发错误检测开关
    • FrNm_VersionInfoApi: 版本信息API开关
    • FrNm_TimerStartValue: 计时器起始值
    • FrNm_MainFunctionPeriod: 主函数周期
    • FrNm_BusSynchronizationEnabled: 总线同步功能开关
  2. 通道配置参数:

    • FrNmNetworkHandle: 网络通道句柄
    • FrNmChannelId: 通道标识符
    • FrNmNodeId: 节点标识符
    • FrNmChannelActive: 通道激活标志
  3. 定时参数:

    • FrNmRepeatMessageTime: 重复消息时间
    • FrNmReadySleepCnt: 准备睡眠计数器
    • FrNmRepetitionCycle: 重复周期
    • FrNmVotingCycle: 投票周期
  4. 特性开关:

    • FrNmNodeDetectionEnabled: 节点检测功能开关
    • FrNmSourceNodeIdentifierEnabled: 源节点标识符功能开关
    • FrNmPassiveModeEnabled: 被动模式功能开关
    • FrNmCwuRxEnabled: 汽车唤醒接收功能开关
    • FrNmCarWakeUpFilterEnabled: 汽车唤醒过滤功能开关
    • FrNmCoordinatorSyncSupport: 协调器同步支持功能开关
    • FrNmPnEnabled: 部分网络功能开关

6.2 初始化流程

FrNm模块的初始化流程包括以下步骤:

  1. 配置文件生成:

    • 生成FrNm_Cfg.h配置头文件
    • 生成FrNm_PBcfg.c预编译配置文件
    • 生成FrNm_LCfg.c链接时配置文件
  2. 模块初始化:

    • 调用FrNm_Init函数初始化模块
    • 检查配置指针有效性
    • 初始化内部状态变量
    • 设置初始状态为总线休眠模式
    • 禁用NM消息传输
  3. 特性配置:

    • 根据配置启用/禁用被动模式
    • 根据配置启用/禁用节点检测功能
    • 根据配置启用/禁用部分网络功能
    • 配置NM消息PDU结构
    • 配置网络状态定时参数
/* FrNm初始化示例代码 */
#include "FrNm.h"
#include "FrNm_Cfg.h"

/* FrNm配置结构声明 */
extern const FrNm_ConfigType FrNm_Configuration;

void InitializeNetworkManagement(void)
{
    Std_ReturnType result;
    
    /* 初始化FrNm模块 */
    result = FrNm_Init(&FrNm_Configuration);
    
    if (result != E_OK) {
        /* 初始化失败,进行错误处理 */
        ReportError(NM_INIT_FAILED, result);
        return;
    }
    
    /* 初始化成功,可以继续其他操作 */
}

7. 总结

AUTOSAR FlexRay网络管理模块是AUTOSAR通信栈中的关键组件,负责协调网络上各ECU在正常操作和总线休眠模式之间的转换,提高了系统的能效和通信可靠性。

FlexRay网络管理的主要优势包括:

  • 硬件无关性: 提供硬件无关的协议,适用于各种FlexRay控制器
  • 低功耗管理: 通过协调网络休眠和唤醒降低系统功耗
  • 可扩展性: 提供多种可选功能,如节点检测、汽车唤醒等
  • 标准化接口: 符合AUTOSAR标准,确保不同供应商组件的互操作性

FlexRay网络管理适用于需要高速、确定性通信的汽车应用,如:

  • 动力传动系统控制
  • 底盘控制系统
  • 高级驾驶辅助系统(ADAS)
  • 任何需要可靠、低延迟网络管理的分布式系统

通过本文的详细介绍,我们可以全面了解AUTOSAR FlexRay网络管理的架构设计、状态机、交互流程、接口和配置,为开发和调试AUTOSAR FlexRay网络管理相关应用提供指导。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KaiGer666

慧眼~施主!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值