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模块具有以下依赖关系:
-
向上依赖:
- 网络管理接口(NmIf):提供通用网络管理服务给上层模块
-
向下依赖:
- FlexRay接口(FrIf):提供对FlexRay总线的访问
- PDU路由器(PduR):用于PDU路由
-
水平依赖:
- FlexRay状态管理器(FrSm):负责FlexRay通信控制器的状态管理
- ECU状态管理器(EcuM):负责ECU的状态管理
-
服务依赖:
- 操作系统(OS):使用操作系统服务
- 默认错误追踪器(DET):用于错误检测和报告
3. 状态机设计
3.1 主要状态
FlexRay网络管理状态机由三个主要状态组成:
-
总线休眠模式(Bus-Sleep Mode):
- 通信控制器处于休眠状态,功耗降至最低
- 唤醒检测机制保持活跃
- 初始化后默认进入此状态
-
同步模式(Synchronize Mode):
- 等待与FlexRay通信周期同步
- 不发送NM数据和NM投票
- 网络请求或被动唤醒后进入此状态
-
网络模式(Network Mode):
- 管理网络通信流程
- 包含三个子状态:重复消息状态、正常操作状态、就绪睡眠状态
图2: FlexRay网络管理状态机
3.2 网络模式子状态
网络模式包含三个子状态:
-
重复消息状态(Repeat Message State):
- 激活NM数据传输
- 投票保持集群唤醒
- 确保任何从总线休眠到网络模式的转换对其他节点可见
- 启动重复消息计时器(
FrNmRepeatMessageTime
)
-
正常操作状态(Normal Operation State):
- 继续传输NM数据
- 投票保持集群唤醒
- 处理常规通信
- 网络请求活跃时维持此状态
-
就绪睡眠状态(Ready Sleep State):
- 不传输NM数据
- 发送负面NM投票
- 等待所有节点也准备好睡眠
- 网络释放后进入此状态
状态 总线休眠模式:
- 描述: 在总线休眠模式下,通信控制器处于休眠状态,功耗降至最低,但唤醒检测机制仍然活跃。当网络请求被调用或被动启动时,FrNm将离开此状态进入同步模式。
- 相关功能:
- 降低功耗
- 保持唤醒检测
- 对网络请求或被动启动作出响应
- 进入条件:
- 初始化后默认进入
- 就绪睡眠计数器超时后
- 同步模式下接收到启动错误且网络已释放时
/* 总线休眠模式相关代码示例 */
void HandleBusSleepMode(NetworkHandleType NetworkHandle)
{
Nm_StateType currentState;
Nm_ModeType currentMode;
/* 获取当前网络状态 */
FrNm_GetState(NetworkHandle, ¤tState, ¤tMode);
if (currentState == NM_STATE_BUS_SLEEP && currentMode == NM_MODE_BUS_SLEEP) {
/* 总线处于休眠状态,执行低功耗操作 */
ECU_EnterLowPowerMode();
/* 配置唤醒源 */
ECU_ConfigureWakeupSources(WAKEUP_SOURCE_FLEXRAY);
}
}
3.3 状态转换条件
FlexRay网络管理状态机的主要转换条件包括:
-
总线休眠模式 → 同步模式:
FrNm_NetworkRequest()
被调用FrNm_PassiveStartUp()
被调用
-
同步模式 → 网络模式:
- 到达首个NM重复周期边界
- 调用
Nm_NetworkMode()
通知上层
-
网络模式 → 总线休眠模式:
- 就绪睡眠计数器(
FrNmReadySleepCnt
)超时 - 调用
Nm_BusSleepMode()
通知上层
- 就绪睡眠计数器(
-
总线休眠模式 → 网络模式:
- 检测到
ClusterAwakeVote
- 调用
Nm_NetworkStartIndication()
通知上层
- 检测到
此外,还有一个平行的网络请求状态,通过FrNm_NetworkRequest()
和FrNm_NetworkRelease()
控制。
4. 交互流程
4.1 网络请求流程
当应用层需要通信时,会触发网络请求流程:
图3: FlexRay网络管理典型交互序列
- 应用层通过ComM请求通信
- ComM调用
Nm_NetworkRequest()
- NmIf调用
FrNm_NetworkRequest()
- FrNm设置
FrNm_NetworkRequest = TRUE
并从总线休眠模式转换到同步模式 - FrNm调用
FrIf_StartCommunication()
启动FlexRay通信 - FrNm向NmIf通知状态变化(
Nm_SynchronizeMode()
) - FrNm等待同步到重复周期边界
- FrNm进入网络模式,调用
Nm_NetworkMode()
- 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 网络释放流程
当应用层不再需要通信时,会触发网络释放流程:
- 应用层通过ComM释放通信请求
- ComM调用
Nm_NetworkRelease()
- NmIf调用
FrNm_NetworkRelease()
- FrNm设置
FrNm_NetworkRequest = FALSE
- FrNm在下一个重复周期边界切换到就绪睡眠状态
- FrNm开始发送NM消息(负面投票)
- FrNm等待就绪睡眠计数器超时
- 超时后FrNm进入总线休眠模式,调用
Nm_BusSleepMode()
- FrNm调用
FrIf_StopCommunication()
停止FlexRay通信
函数 FrNm_NetworkRelease:
- 描述: 该函数用于释放网络通信,设置FrNm_NetworkRequest为FALSE。在重复周期完成且没有活动的重复消息请求时,FrNm将从正常操作状态转换到就绪睡眠状态。
- 参数:
- NetworkHandle [输入]: 网络通道标识符, 类型: NetworkHandleType, 取值范围: 依据配置
- 返回值:
- E_OK: 网络释放成功处理
- E_NOT_OK: 指定的网络句柄无效或模块未初始化
- 相关函数:
- 上层: Nm_NetworkRelease
- 并列: FrNm_NetworkRequest
4.3 被动唤醒流程
当FlexRay总线上有其他节点发送正面投票时,处于总线休眠模式的节点可能会被动唤醒:
- FrIf调用
FrNm_RxIndication()
通知接收到NM消息 - FrNm检测到睡眠状态下接收到NM消息(正面投票)
- FrNm调用
Nm_NetworkStartIndication()
通知NmIf - FrNm调用
FrIf_StartCommunication()
启动FlexRay通信 - 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网络管理模块提供以下主要接口:
-
初始化与配置接口:
FrNm_Init
: 初始化FrNm模块FrNm_PassiveStartUp
: 被动启动网络FrNm_GetVersionInfo
: 获取版本信息FrNm_GetState
: 获取当前网络状态FrNm_SetSleepReadyBit
: 设置睡眠准备位
-
网络管理请求接口:
FrNm_NetworkRequest
: 请求网络通信FrNm_NetworkRelease
: 释放网络通信请求FrNm_RepeatMessageRequest
: 请求重复消息FrNm_RequestBusSynchronization
: 请求总线同步FrNm_CheckRemoteSleepIndication
: 检查远程睡眠指示
-
数据访问接口:
FrNm_GetPduData
: 获取PDU数据FrNm_GetNodeIdentifier
: 获取节点标识符FrNm_GetLocalNodeIdentifier
: 获取本地节点标识符FrNm_SetUserData
: 设置用户数据FrNm_GetUserData
: 获取用户数据
5.2 关键数据结构
FrNm模块使用以下关键数据结构:
-
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;
-
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;
-
FrNm_CBVType: 控制位向量结构体
typedef struct { boolean RepeatMessageRequest; /* 重复消息请求位 */ boolean NmCoordinatorSleepReady; /* 协调器睡眠准备位 */ boolean ActiveWakeup; /* 主动唤醒位 */ boolean PartialNetworkInformation; /* 部分网络信息位 */ boolean CarWakeUpBit; /* 汽车唤醒位 */ } FrNm_CBVType;
-
FrNm_PDU: NM PDU结构体
typedef struct { uint8 NmControlBits; /* 控制位字节 */ uint8* NmUserData; /* 用户数据区域 */ uint8 SourceNodeIdentifier; /* 源节点标识符 */ } FrNm_PDU;
5.3 回调函数
FrNm模块使用以下回调函数与其他模块交互:
-
FrNm向上回调函数 (通过NmIf调用):
Nm_NetworkStartIndication
: 通知网络启动Nm_NetworkMode
: 通知进入网络模式Nm_BusSleepMode
: 通知进入总线休眠模式Nm_SynchronizeMode
: 通知进入同步模式Nm_CoordReadyToSleepIndication
: 通知协调器睡眠准备Nm_CoordReadyToSleepCancellation
: 通知协调器睡眠准备取消
-
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网络管理模块需要配置以下关键参数:
-
模块级参数:
FrNm_DevErrorDetect
: 开发错误检测开关FrNm_VersionInfoApi
: 版本信息API开关FrNm_TimerStartValue
: 计时器起始值FrNm_MainFunctionPeriod
: 主函数周期FrNm_BusSynchronizationEnabled
: 总线同步功能开关
-
通道配置参数:
FrNmNetworkHandle
: 网络通道句柄FrNmChannelId
: 通道标识符FrNmNodeId
: 节点标识符FrNmChannelActive
: 通道激活标志
-
定时参数:
FrNmRepeatMessageTime
: 重复消息时间FrNmReadySleepCnt
: 准备睡眠计数器FrNmRepetitionCycle
: 重复周期FrNmVotingCycle
: 投票周期
-
特性开关:
FrNmNodeDetectionEnabled
: 节点检测功能开关FrNmSourceNodeIdentifierEnabled
: 源节点标识符功能开关FrNmPassiveModeEnabled
: 被动模式功能开关FrNmCwuRxEnabled
: 汽车唤醒接收功能开关FrNmCarWakeUpFilterEnabled
: 汽车唤醒过滤功能开关FrNmCoordinatorSyncSupport
: 协调器同步支持功能开关FrNmPnEnabled
: 部分网络功能开关
6.2 初始化流程
FrNm模块的初始化流程包括以下步骤:
-
配置文件生成:
- 生成
FrNm_Cfg.h
配置头文件 - 生成
FrNm_PBcfg.c
预编译配置文件 - 生成
FrNm_LCfg.c
链接时配置文件
- 生成
-
模块初始化:
- 调用
FrNm_Init
函数初始化模块 - 检查配置指针有效性
- 初始化内部状态变量
- 设置初始状态为总线休眠模式
- 禁用NM消息传输
- 调用
-
特性配置:
- 根据配置启用/禁用被动模式
- 根据配置启用/禁用节点检测功能
- 根据配置启用/禁用部分网络功能
- 配置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网络管理相关应用提供指导。