AUTOSAR进阶图解==>AUTOSAR_SWS_TimeSyncOverFlexRay
AUTOSAR SWS TimeSyncOverFlexRay 详解文档
FlexRay时间同步模块详细技术规范与架构分析
目录
- 1. 概述
- 2. 模块架构
- 3. 时间同步机制
- 4. 消息格式
- 5. 状态管理
- 6. 配置参数
- 7. API接口
- 8. 错误处理
- 9. 总结
1. 概述
FrTSyn(FlexRay Time Synchronization)模块是AUTOSAR基础软件中的一个重要组件,负责在FlexRay网络上实现精确的时间同步。该模块通过分发同步时间信息,确保网络中的所有节点具有一致的时间基准。
1.1 主要功能
- 全局时间同步:在FlexRay网络上分发全局时间信息
- 偏移时间管理:处理时间偏移值的传输和接收
- 消息格式处理:支持SYNC和OFS两种消息格式
- CRC保护:提供可选的CRC校验功能
- 传输模式控制:支持动态开启/关闭传输功能
1.2 应用场景
- 汽车电子系统中的时间同步
- 分布式控制系统的协调
- 实时数据采集的时间戳对齐
- 网络诊断和监控
2. 模块架构
FrTSyn模块采用分层架构设计,与多个AUTOSAR模块进行交互,实现完整的时间同步功能。
FrTSyn模块架构图展示了模块的分层结构和依赖关系
2.1 架构层次
应用层
- BswM(基础软件模式管理器):负责协调网络访问,通过
FrTSyn_SetTransmissionMode()
控制传输模式
中间层
- FrTSyn(FlexRay时间同步):核心模块,包含以下子组件:
- 时间主控器:负责生成和发送时间同步消息
- 时间从控器:负责接收和处理时间同步消息
- 消息处理器:处理消息的格式化和验证
- StbM(同步时间基管理器):提供时间基管理功能,维护虚拟本地时间
底层
- FrIf(FlexRay接口):提供FlexRay通信功能
- DET(默认错误跟踪器):处理开发错误报告
- CRC(循环冗余校验):提供CRC计算功能
2.2 接口关系
- 传输接口:FrTSyn向FrIf提供传输服务
- 接收接口:FrTSyn向FrIf提供接收服务
- 时间管理接口:FrTSyn与StbM交互时间信息
- 错误报告接口:FrTSyn向DET报告错误
- CRC计算接口:FrTSyn使用CRC模块进行校验
2.3 代码示例
/* FrTSyn模块初始化示例 */
Std_ReturnType FrTSyn_Init(const FrTSyn_ConfigType* ConfigPtr)
{Std_ReturnType result = E_NOT_OK;/* 参数检查 */if (ConfigPtr == NULL) {DET_ReportError(FRTSYN_MODULE_ID, 0, FRTSYN_INIT_SID, FRTSYN_E_PARAM_POINTER);return E_NOT_OK;}/* 初始化内部变量 */FrTSyn_Internal_InitVariables();/* 设置序列计数器为0 */FrTSyn_Internal_SetSequenceCounter(0);/* 初始化时间同步状态 */FrTSyn_Internal_SetModuleState(FRTSYN_STATE_INITIALIZED);return E_OK;
}/* 传输模式控制示例 */
Std_ReturnType FrTSyn_SetTransmissionMode(uint8 Controller, FrTSyn_TransmissionModeType Mode)
{Std_ReturnType result = E_NOT_OK;/* 参数验证 */if (Controller >= FRTSYN_NUMBER_OF_CONTROLLERS) {DET_ReportError(FRTSYN_MODULE_ID, 0, FRTSYN_SETTRANSMISSIONMODE_SID, FRTSYN_E_PARAM_CONTROLLER);return E_NOT_OK;}if ((Mode != FRTSYN_TX_OFF) && (Mode != FRTSYN_TX_ON)) {DET_ReportError(FRTSYN_MODULE_ID, 0, FRTSYN_SETTRANSMISSIONMODE_SID, FRTSYN_E_PARAM_MODE);return E_NOT_OK;}/* 设置传输模式 */FrTSyn_Internal_SetTransmissionMode(Controller, Mode);return E_OK;
}
3. 时间同步机制
FrTSyn模块通过特定的消息序列实现时间同步,支持全局时间同步和偏移时间同步两种模式。
时间同步序列图展示了Time Master和Time Slave之间的交互流程
3.1 全局时间同步流程
时间主控器(Time Master)处理
- 获取当前时间:调用
StbM_GetCurrentVirtualLocalTime()
获取虚拟本地时间 - 计算时间值:计算下一周期0的时间值T0
- 组装SYNC消息:包含时间值、序列计数器、用户数据等
- 发送消息:通过FrIf发送到FlexRay网络
时间从控器(Time Slave)处理
- 接收SYNC消息:从FlexRay网络接收消息
- 验证消息:检查Type字段和CRC值
- 获取当前时间:调用
StbM_GetCurrentVirtualLocalTime()
- 计算时间元组:计算[T1; T1VLT]时间元组
- 更新全局时间:调用
StbM_BusSetGlobalTime()
更新时间
3.2 偏移时间同步流程
时间主控器处理
- 获取偏移时间:调用
StbM_GetOffset()
获取当前偏移时间 - 组装OFS消息:包含偏移时间值、序列计数器等
- 发送消息:通过FrIf发送到FlexRay网络
时间从控器处理
- 接收OFS消息:从FlexRay网络接收消息
- 验证OFS消息:检查消息格式和内容
- 计算偏移时间元组:计算偏移时间元组
- 更新偏移时间:调用
StbM_BusSetGlobalTime()
更新偏移时间
3.3 关键函数说明
StbM_GetCurrentVirtualLocalTime()
- 描述:获取当前虚拟本地时间值
- 参数:无
- 返回值:虚拟本地时间值(纳秒)
- 用途:用于时间同步计算
StbM_BusSetGlobalTime()
- 描述:设置总线全局时间
- 参数:
- TimeBaseId:时间基标识符
- TimeValue:时间值
- TimeBaseStatus:时间基状态
- 返回值:操作结果
- 用途:更新全局时间或偏移时间
3.4 代码示例
/* 全局时间同步处理示例 */
Std_ReturnType FrTSyn_ProcessGlobalTimeSync(void)
{uint64 currentTime;uint64 nextCycleTime;FrTSyn_SyncMessageType syncMsg;Std_ReturnType result;/* 获取当前虚拟本地时间 */currentTime = StbM_GetCurrentVirtualLocalTime();/* 计算下一周期0的时间值 */nextCycleTime = FrTSyn_Internal_CalculateNextCycleTime(currentTime);/* 组装SYNC消息 */syncMsg.Type = FRTSYN_SYNC_TYPE;syncMsg.TimeDomain = FrTSyn_Internal_GetTimeDomain();syncMsg.SyncTimeSec = (uint32)(nextCycleTime / 1000000000ULL);syncMsg.SyncTimeNSec = (uint32)(nextCycleTime % 1000000000ULL);syncMsg.SequenceCounter = FrTSyn_Internal_GetNextSequenceCounter();/* 计算CRC(如果启用) */if (FrTSyn_Internal_IsCrcEnabled()) {syncMsg.Crc = Crc_CalculateCRC8H2F(&syncMsg.Data, sizeof(syncMsg.Data));}/* 发送SYNC消息 */result = FrIf_Transmit(FRTSYN_CHANNEL_ID, &syncMsg, sizeof(syncMsg));return result;
}/* 偏移时间同步处理示例 */
Std_ReturnType FrTSyn_ProcessOffsetTimeSync(void)
{uint32 offsetTimeSec, offsetTimeNSec;FrTSyn_OffsetMessageType offsetMsg;Std_ReturnType result;/* 获取当前偏移时间 */result = StbM_GetOffset(FRTSYN_TIME_BASE_ID, &offsetTimeSec, &offsetTimeNSec);if (result != E_OK) {return result;}/* 组装OFS消息 */offsetMsg.Type = FRTSYN_OFS_TYPE;offsetMsg.TimeDomain = FrTSyn_Internal_GetTimeDomain() + 16; /* 偏移时间域 */offsetMsg.OfsTimeSec = offsetTimeSec;offsetMsg.OfsTimeNSec = offsetTimeNSec;offsetMsg.SequenceCounter = FrTSyn_Internal_GetNextSequenceCounter();/* 计算CRC(如果启用) */if (FrTSyn_Internal_IsCrcEnabled()) {offsetMsg.Crc = Crc_CalculateCRC8H2F(&offsetMsg.Data, sizeof(offsetMsg.Data));}/* 发送OFS消息 */result = FrIf_Transmit(FRTSYN_CHANNEL_ID, &offsetMsg, sizeof(offsetMsg));return result;
}
4. 消息格式
FrTSyn模块支持两种主要消息格式:SYNC消息(全局时间同步)和OFS消息(偏移时间同步),每种消息都支持CRC保护和非CRC保护两种模式。
消息格式类图展示了SYNC和OFS消息的结构和关系
4.1 SYNC消息格式
非CRC保护SYNC消息
- Type:0x10,标识SYNC非CRC保护消息
- UserByte2:用户数据字节2,默认值0
- D:时间域(0-15),表示全局时间域
- SGW:同步网关状态,设置为SyncToGTM
- UserByte0/UserByte1:用户数据字节,默认值0
- SyncTimeSec:48位时间值(秒部分)
- SyncTimeNSec:32位时间值(纳秒部分)
CRC保护SYNC消息
- Type:0x20,标识SYNC CRC保护消息
- CRC:8位CRC校验值
- 其他字段与非CRC保护消息相同
4.2 OFS消息格式
非CRC保护OFS消息
- Type:0x34,标识OFS非CRC保护消息
- UserByte2:用户数据字节2,默认值0
- D:时间域(16-31),表示偏移时间域
- SGW:同步网关状态,设置为SyncToSubDomain
- UserByte0/UserByte1:用户数据字节,默认值0
- reserved:保留字段,默认值0
- OfsTimeSec:32位偏移时间值(秒部分)
- OfsTimeNSec:32位偏移时间值(纳秒部分)
CRC保护OFS消息
- Type:0x44,标识OFS CRC保护消息
- CRC:8位CRC校验值
- 其他字段与非CRC保护消息相同
4.3 消息字段说明
消息类型(MessageType)
- 0x10:SYNC非CRC保护
- 0x20:SYNC CRC保护
- 0x34:OFS非CRC保护
- 0x44:OFS CRC保护
时间域(TimeDomain)
- 0-15:全局时间域,用于SYNC消息
- 16-31:偏移时间域,用于OFS消息
序列计数器(SequenceCounter)
- 0-15:4位序列计数器
- 独立于SYNC和OFS消息
- 每次传输递增1,15后回绕到0
4.4 代码示例
/* 消息格式定义 */
typedef struct {uint8 Type; /* 消息类型 */uint8 UserByte2; /* 用户数据字节2 */uint8 D; /* 时间域 */uint8 SGW; /* 同步网关状态 */uint8 UserByte0; /* 用户数据字节0 */uint8 UserByte1; /* 用户数据字节1 */uint8 SyncTimeSec[6]; /* 48位时间值(秒) */uint8 SyncTimeNSec[4]; /* 32位时间值(纳秒) */
} FrTSyn_SyncMessageType;typedef struct {uint8 Type; /* 消息类型 */uint8 UserByte2; /* 用户数据字节2 */uint8 D; /* 时间域 */uint8 SGW; /* 同步网关状态 */uint8 UserByte0; /* 用户数据字节0 */uint8 UserByte1; /* 用户数据字节1 */uint8 reserved[2]; /* 保留字段 */uint8 OfsTimeSec[4]; /* 32位偏移时间值(秒) */uint8 OfsTimeNSec[4]; /* 32位偏移时间值(纳秒) */
} FrTSyn_OffsetMessageType;/* 消息组装示例 */
Std_ReturnType FrTSyn_AssembleSyncMessage(FrTSyn_SyncMessageType* msg, uint64 timeValue, boolean crcEnabled)
{if (msg == NULL) {return E_NOT_OK;}/* 设置消息类型 */msg->Type = crcEnabled ? FRTSYN_SYNC_TYPE_CRC : FRTSYN_SYNC_TYPE_NO_CRC;/* 设置用户数据 */msg->UserByte2 = 0;msg->UserByte0 = 0;msg->UserByte1 = 0;/* 设置时间域和SGW */msg->D = FrTSyn_Internal_GetTimeDomain();msg->SGW = FRTSYN_SGW_SYNC_TO_GTM;/* 设置时间值(大端序) */uint32 secPart = (uint32)(timeValue / 1000000000ULL);uint32 nsecPart = (uint32)(timeValue % 1000000000ULL);FrTSyn_Internal_WriteUint48(msg->SyncTimeSec, secPart);FrTSyn_Internal_WriteUint32(msg->SyncTimeNSec, nsecPart);return E_OK;
}/* 消息验证示例 */
Std_ReturnType FrTSyn_ValidateSyncMessage(const FrTSyn_SyncMessageType* msg, boolean crcEnabled)
{if (msg == NULL) {return E_NOT_OK;}/* 验证消息类型 */uint8 expectedType = crcEnabled ? FRTSYN_SYNC_TYPE_CRC : FRTSYN_SYNC_TYPE_NO_CRC;if (msg->Type != expectedType) {return E_NOT_OK;}/* 验证时间域 */if (msg->D > 15) {return E_NOT_OK;}/* 验证CRC(如果启用) */if (crcEnabled) {uint8 calculatedCrc = Crc_CalculateCRC8H2F(&msg->Data, sizeof(msg->Data));if (calculatedCrc != msg->Crc) {return E_NOT_OK;}}return E_OK;
}
5. 状态管理
FrTSyn模块采用状态机设计,管理模块的初始化、运行和错误处理状态。
状态机图展示了FrTSyn模块的状态转换和业务流程
5.1 主要状态
未初始化状态
- 等待初始化:模块等待初始化调用
- 初始化中:正在执行初始化过程
- 初始化完成:初始化成功完成
- 初始化失败:初始化过程中出现错误
已初始化状态
- 空闲状态:模块正常运行,等待事件
- 处理时间同步:正在处理全局时间同步
- 处理偏移同步:正在处理偏移时间同步
- 处理错误:正在处理错误情况
严重错误状态
- 停止服务:模块停止提供服务
- 等待复位:等待复位信号
- 复位处理:正在执行复位操作
传输模式控制
- 传输开启:允许发送时间同步消息
- 传输关闭:禁止发送时间同步消息
5.2 状态转换
正常转换
- 未初始化 → 已初始化:
FrTSyn_Init()
成功调用 - 空闲状态 → 处理时间同步:收到时间同步请求
- 空闲状态 → 处理偏移同步:收到偏移同步请求
- 处理时间同步 → 空闲状态:同步完成
- 处理偏移同步 → 空闲状态:同步完成
错误转换
- 处理错误 → 空闲状态:错误恢复成功
- 处理错误 → 严重错误:错误恢复失败
- 严重错误 → 未初始化:复位完成
传输模式转换
- 传输开启 → 传输关闭:
FrTSyn_SetTransmissionMode(FRTSYN_TX_OFF)
- 传输关闭 → 传输开启:
FrTSyn_SetTransmissionMode(FRTSYN_TX_ON)
5.3 代码示例
/* 状态定义 */
typedef enum {FRTSYN_STATE_UNINITIALIZED, /* 未初始化 */FRTSYN_STATE_IDLE, /* 空闲状态 */FRTSYN_STATE_PROCESSING_SYNC, /* 处理时间同步 */FRTSYN_STATE_PROCESSING_OFS, /* 处理偏移同步 */FRTSYN_STATE_ERROR, /* 错误状态 */FRTSYN_STATE_CRITICAL_ERROR /* 严重错误 */
} FrTSyn_StateType;typedef enum {FRTSYN_TX_MODE_OFF, /* 传输关闭 */FRTSYN_TX_MODE_ON /* 传输开启 */
} FrTSyn_TransmissionModeType;/* 状态机处理函数 */
void FrTSyn_MainFunction(void)
{FrTSyn_StateType currentState;FrTSyn_TransmissionModeType txMode;/* 获取当前状态 */currentState = FrTSyn_Internal_GetCurrentState();txMode = FrTSyn_Internal_GetTransmissionMode();switch (currentState) {case FRTSYN_STATE_IDLE:/* 空闲状态处理 */if (txMode == FRTSYN_TX_MODE_ON) {/* 检查是否需要发送时间同步消息 */if (FrTSyn_Internal_IsTimeSyncRequired()) {FrTSyn_Internal_SetState(FRTSYN_STATE_PROCESSING_SYNC);FrTSyn_ProcessGlobalTimeSync();}/* 检查是否需要发送偏移同步消息 */if (FrTSyn_Internal_IsOffsetSyncRequired()) {FrTSyn_Internal_SetState(FRTSYN_STATE_PROCESSING_OFS);FrTSyn_ProcessOffsetTimeSync();}}break;case FRTSYN_STATE_PROCESSING_SYNC:/* 处理时间同步状态 */if (FrTSyn_Internal_IsSyncComplete()) {FrTSyn_Internal_SetState(FRTSYN_STATE_IDLE);} else if (FrTSyn_Internal_IsSyncError()) {FrTSyn_Internal_SetState(FRTSYN_STATE_ERROR);}break;case FRTSYN_STATE_PROCESSING_OFS:/* 处理偏移同步状态 */if (FrTSyn_Internal_IsOffsetSyncComplete()) {FrTSyn_Internal_SetState(FRTSYN_STATE_IDLE);} else if (FrTSyn_Internal_IsOffsetSyncError()) {FrTSyn_Internal_SetState(FRTSYN_STATE_ERROR);}break;case FRTSYN_STATE_ERROR:/* 错误状态处理 */if (FrTSyn_Internal_CanRecoverFromError()) {FrTSyn_Internal_RecoverFromError();FrTSyn_Internal_SetState(FRTSYN_STATE_IDLE);} else {FrTSyn_Internal_SetState(FRTSYN_STATE_CRITICAL_ERROR);}break;case FRTSYN_STATE_CRITICAL_ERROR:/* 严重错误状态处理 */FrTSyn_Internal_StopService();/* 等待外部复位 */break;default:/* 未知状态处理 */FrTSyn_Internal_SetState(FRTSYN_STATE_CRITICAL_ERROR);break;}
}/* 传输模式控制 */
Std_ReturnType FrTSyn_SetTransmissionMode(uint8 Controller, FrTSyn_TransmissionModeType Mode)
{Std_ReturnType result = E_NOT_OK;/* 参数验证 */if (Controller >= FRTSYN_NUMBER_OF_CONTROLLERS) {DET_ReportError(FRTSYN_MODULE_ID, 0, FRTSYN_SETTRANSMISSIONMODE_SID, FRTSYN_E_PARAM_CONTROLLER);return E_NOT_OK;}if ((Mode != FRTSYN_TX_MODE_OFF) && (Mode != FRTSYN_TX_MODE_ON)) {DET_ReportError(FRTSYN_MODULE_ID, 0, FRTSYN_SETTRANSMISSIONMODE_SID, FRTSYN_E_PARAM_MODE);return E_NOT_OK;}/* 设置传输模式 */FrTSyn_Internal_SetTransmissionMode(Controller, Mode);/* 如果关闭传输,停止所有传输请求 */if (Mode == FRTSYN_TX_MODE_OFF) {FrTSyn_Internal_StopAllTransmissions(Controller);}return E_OK;
}
6. 配置参数
FrTSyn模块支持多种配置参数,用于控制模块的行为和性能。
6.1 主要配置参数
时间同步配置
- FrTSynGlobalTimeTxPeriod:全局时间传输周期
- FrTSynGlobalTimeTxCrcSecured:全局时间传输CRC保护配置
- FrTSynGlobalTimeDebounceTime:全局时间防抖时间
- FrTSynImmediateTimeSync:立即时间同步配置
偏移时间配置
- FrTSynOffsetTimeTxPeriod:偏移时间传输周期
- FrTSynOffsetTimeTxCrcSecured:偏移时间传输CRC保护配置
- FrTSynOffsetTimeDebounceTime:偏移时间防抖时间
接收配置
- FrTSynRxCrcValidated:接收CRC验证配置
- FrTSynGlobalTimeSyncDataIDList:全局时间同步数据ID列表
- FrTSynGlobalTimeOfsDataIDList:全局时间偏移数据ID列表
6.2 配置结构定义
/* FrTSyn配置结构 */
typedef struct {uint8 ModuleId; /* 模块标识符 */boolean ModuleEnabled; /* 模块启用状态 */uint8 NumberOfControllers; /* 控制器数量 */uint8 NumberOfTimeDomains; /* 时间域数量 *//* 全局时间配置 */uint16 GlobalTimeTxPeriod; /* 全局时间传输周期 */boolean GlobalTimeTxCrcSecured; /* 全局时间CRC保护 */uint16 GlobalTimeDebounceTime; /* 全局时间防抖时间 */boolean ImmediateTimeSync; /* 立即时间同步 *//* 偏移时间配置 */uint16 OffsetTimeTxPeriod; /* 偏移时间传输周期 */boolean OffsetTimeTxCrcSecured; /* 偏移时间CRC保护 */uint16 OffsetTimeDebounceTime; /* 偏移时间防抖时间 *//* 接收配置 */FrTSyn_CrcValidationType RxCrcValidated; /* 接收CRC验证 */uint16* GlobalTimeSyncDataIDList; /* 全局时间同步数据ID列表 */uint16* GlobalTimeOfsDataIDList; /* 全局时间偏移数据ID列表 *//* 循环消息恢复配置 */uint16 CyclicMsgResumeTime; /* 循环消息恢复时间 */} FrTSyn_ConfigType;/* CRC验证类型 */
typedef enum {FRTSYN_CRC_NOT_VALIDATED, /* 不验证CRC */FRTSYN_CRC_VALIDATED, /* 验证CRC */FRTSYN_CRC_IGNORED, /* 忽略CRC */FRTSYN_CRC_OPTIONAL /* 可选CRC */
} FrTSyn_CrcValidationType;
6.3 配置初始化示例
/* 配置初始化函数 */
void FrTSyn_InitializeConfig(FrTSyn_ConfigType* config)
{if (config == NULL) {return;}/* 基本配置 */config->ModuleId = FRTSYN_MODULE_ID;config->ModuleEnabled = TRUE;config->NumberOfControllers = 1;config->NumberOfTimeDomains = 2;/* 全局时间配置 */config->GlobalTimeTxPeriod = 1000; /* 1秒周期 */config->GlobalTimeTxCrcSecured = TRUE; /* 启用CRC保护 */config->GlobalTimeDebounceTime = 100; /* 100ms防抖时间 */config->ImmediateTimeSync = TRUE; /* 启用立即同步 *//* 偏移时间配置 */config->OffsetTimeTxPeriod = 2000; /* 2秒周期 */config->OffsetTimeTxCrcSecured = TRUE; /* 启用CRC保护 */config->OffsetTimeDebounceTime = 100; /* 100ms防抖时间 *//* 接收配置 */config->RxCrcValidated = FRTSYN_CRC_VALIDATED;/* 数据ID列表配置 */config->GlobalTimeSyncDataIDList = FrTSyn_GlobalTimeSyncDataIDList;config->GlobalTimeOfsDataIDList = FrTSyn_GlobalTimeOfsDataIDList;/* 循环消息恢复配置 */config->CyclicMsgResumeTime = 5000; /* 5秒恢复时间 */
}/* 数据ID列表定义 */
static const uint16 FrTSyn_GlobalTimeSyncDataIDList[16] = {0x1000, 0x1001, 0x1002, 0x1003, 0x1004, 0x1005, 0x1006, 0x1007,0x1008, 0x1009, 0x100A, 0x100B, 0x100C, 0x100D, 0x100E, 0x100F
};static const uint16 FrTSyn_GlobalTimeOfsDataIDList[16] = {0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007,0x2008, 0x2009, 0x200A, 0x200B, 0x200C, 0x200D, 0x200E, 0x200F
};
7. API接口
FrTSyn模块提供丰富的API接口,支持模块的初始化、配置、控制和状态查询。
7.1 初始化接口
FrTSyn_Init()
- 功能:初始化FrTSyn模块
- 参数:
const FrTSyn_ConfigType* ConfigPtr
- 返回值:
Std_ReturnType
- 说明:初始化所有内部变量,设置模块为初始化状态
FrTSyn_GetVersionInfo()
- 功能:获取模块版本信息
- 参数:
Std_VersionInfoType* versioninfo
- 返回值:
void
- 说明:返回模块的版本信息
7.2 控制接口
FrTSyn_SetTransmissionMode()
- 功能:设置传输模式
- 参数:
uint8 Controller, FrTSyn_TransmissionModeType Mode
- 返回值:
Std_ReturnType
- 说明:控制时间同步消息的传输
FrTSyn_MainFunction()
- 功能:主函数,处理周期性任务
- 参数:无
- 返回值:
void
- 说明:处理时间同步、消息传输等周期性任务
7.3 状态查询接口
FrTSyn_GetState()
- 功能:获取模块状态
- 参数:
uint8 Controller, FrTSyn_StateType* StatePtr
- 返回值:
Std_ReturnType
- 说明:返回指定控制器的当前状态
7.4 代码示例
/* API接口实现示例 */
Std_ReturnType FrTSyn_Init(const FrTSyn_ConfigType* ConfigPtr)
{Std_ReturnType result = E_NOT_OK;/* 参数检查 */if (ConfigPtr == NULL) {DET_ReportError(FRTSYN_MODULE_ID, 0, FRTSYN_INIT_SID, FRTSYN_E_PARAM_POINTER);return E_NOT_OK;}/* 检查模块是否已初始化 */if (FrTSyn_Internal_IsInitialized()) {DET_ReportError(FRTSYN_MODULE_ID, 0, FRTSYN_INIT_SID, FRTSYN_E_ALREADY_INITIALIZED);return E_NOT_OK;}/* 保存配置 */FrTSyn_Internal_SaveConfig(ConfigPtr);/* 初始化内部变量 */FrTSyn_Internal_InitVariables();/* 设置序列计数器为0 */FrTSyn_Internal_SetSequenceCounter(0);/* 初始化时间同步状态 */FrTSyn_Internal_SetModuleState(FRTSYN_STATE_INITIALIZED);/* 初始化传输模式为关闭 */FrTSyn_Internal_SetTransmissionMode(0, FRTSYN_TX_MODE_OFF);return E_OK;
}void FrTSyn_GetVersionInfo(Std_VersionInfoType* versioninfo)
{if (versioninfo != NULL) {versioninfo->vendorID = FRTSYN_VENDOR_ID;versioninfo->moduleID = FRTSYN_MODULE_ID;versioninfo->sw_major_version = FRTSYN_SW_MAJOR_VERSION;versioninfo->sw_minor_version = FRTSYN_SW_MINOR_VERSION;versioninfo->sw_patch_version = FRTSYN_SW_PATCH_VERSION;}
}Std_ReturnType FrTSyn_GetState(uint8 Controller, FrTSyn_StateType* StatePtr)
{Std_ReturnType result = E_NOT_OK;/* 参数检查 */if (Controller >= FRTSYN_NUMBER_OF_CONTROLLERS) {DET_ReportError(FRTSYN_MODULE_ID, 0, FRTSYN_GETSTATE_SID, FRTSYN_E_PARAM_CONTROLLER);return E_NOT_OK;}if (StatePtr == NULL) {DET_ReportError(FRTSYN_MODULE_ID, 0, FRTSYN_GETSTATE_SID, FRTSYN_E_PARAM_POINTER);return E_NOT_OK;}/* 检查模块是否已初始化 */if (!FrTSyn_Internal_IsInitialized()) {DET_ReportError(FRTSYN_MODULE_ID, 0, FRTSYN_GETSTATE_SID, FRTSYN_E_UNINIT);return E_NOT_OK;}/* 获取状态 */*StatePtr = FrTSyn_Internal_GetCurrentState();return E_OK;
}/* 主函数实现 */
void FrTSyn_MainFunction(void)
{/* 检查模块是否已初始化 */if (!FrTSyn_Internal_IsInitialized()) {return;}/* 处理状态机 */FrTSyn_Internal_ProcessStateMachine();/* 处理周期性时间同步 */FrTSyn_Internal_ProcessCyclicTimeSync();/* 处理立即时间同步 */FrTSyn_Internal_ProcessImmediateTimeSync();/* 处理防抖计数器 */FrTSyn_Internal_ProcessDebounceCounters();/* 处理循环消息恢复计数器 */FrTSyn_Internal_ProcessCyclicMsgResumeCounter();
}
8. 错误处理
FrTSyn模块提供完善的错误处理机制,包括开发错误检测和运行时错误处理。
8.1 开发错误类型
参数错误
- FRTSYN_E_PARAM_POINTER:空指针参数
- FRTSYN_E_PARAM_CONTROLLER:无效控制器参数
- FRTSYN_E_PARAM_MODE:无效模式参数
状态错误
- FRTSYN_E_UNINIT:模块未初始化
- FRTSYN_E_ALREADY_INITIALIZED:模块已初始化
配置错误
- FRTSYN_E_INVALID_PDU_SDU_ID:无效PDU/SDU ID
- FRTSYN_E_INVALID_PDUID:无效PDU ID
8.2 错误处理机制
开发错误检测
- 使用DET模块报告开发错误
- 在API函数中进行参数验证
- 检查模块初始化状态
运行时错误处理
- 消息格式验证失败处理
- CRC校验失败处理
- 超时错误处理
8.3 代码示例
/* 错误处理宏定义 */
#define FRTSYN_E_OK 0x00
#define FRTSYN_E_NOT_OK 0x01
#define FRTSYN_E_PARAM_POINTER 0x02
#define FRTSYN_E_PARAM_CONTROLLER 0x03
#define FRTSYN_E_PARAM_MODE 0x04
#define FRTSYN_E_UNINIT 0x05
#define FRTSYN_E_ALREADY_INITIALIZED 0x06
#define FRTSYN_E_INVALID_PDU_SDU_ID 0x07
#define FRTSYN_E_INVALID_PDUID 0x08/* 错误处理函数 */
Std_ReturnType FrTSyn_HandleError(FrTSyn_ErrorType errorType, uint8 controller)
{Std_ReturnType result = E_NOT_OK;switch (errorType) {case FRTSYN_ERROR_INVALID_MESSAGE:/* 处理无效消息错误 */DET_ReportError(FRTSYN_MODULE_ID, controller, FRTSYN_MAINFUNCTION_SID, FRTSYN_E_INVALID_PDU_SDU_ID);FrTSyn_Internal_SetState(FRTSYN_STATE_ERROR);break;case FRTSYN_ERROR_CRC_FAILED:/* 处理CRC失败错误 */DET_ReportError(FRTSYN_MODULE_ID, controller, FRTSYN_MAINFUNCTION_SID, FRTSYN_E_INVALID_PDUID);FrTSyn_Internal_SetState(FRTSYN_STATE_ERROR);break;case FRTSYN_ERROR_TIMEOUT:/* 处理超时错误 */FrTSyn_Internal_HandleTimeout(controller);break;case FRTSYN_ERROR_CRITICAL:/* 处理严重错误 */FrTSyn_Internal_SetState(FRTSYN_STATE_CRITICAL_ERROR);FrTSyn_Internal_StopService();break;default:/* 未知错误处理 */result = E_NOT_OK;break;}return result;
}/* 消息验证错误处理 */
Std_ReturnType FrTSyn_ValidateMessage(const uint8* message, uint32 messageLength)
{if (message == NULL) {return FRTSYN_E_PARAM_POINTER;}if (messageLength < FRTSYN_MIN_MESSAGE_LENGTH) {return FRTSYN_E_INVALID_PDU_SDU_ID;}/* 验证消息类型 */uint8 messageType = message[0];if ((messageType != FRTSYN_SYNC_TYPE_NO_CRC) && (messageType != FRTSYN_SYNC_TYPE_CRC) &&(messageType != FRTSYN_OFS_TYPE_NO_CRC) &&(messageType != FRTSYN_OFS_TYPE_CRC)) {return FRTSYN_E_INVALID_PDUID;}/* 验证CRC(如果启用) */if ((messageType == FRTSYN_SYNC_TYPE_CRC) || (messageType == FRTSYN_OFS_TYPE_CRC)) {uint8 calculatedCrc = Crc_CalculateCRC8H2F(&message[2], messageLength - 2);if (calculatedCrc != message[1]) {return FRTSYN_E_INVALID_PDUID;}}return FRTSYN_E_OK;
}/* 超时错误处理 */
void FrTSyn_Internal_HandleTimeout(uint8 controller)
{/* 记录超时事件 */FrTSyn_Internal_LogTimeoutEvent(controller);/* 重新启动传输定时器 */FrTSyn_Internal_RestartTransmissionTimer(controller);/* 检查是否需要进入错误状态 */if (FrTSyn_Internal_GetTimeoutCount(controller) > FRTSYN_MAX_TIMEOUT_COUNT) {FrTSyn_Internal_SetState(FRTSYN_STATE_ERROR);}
}
9. 总结
FrTSyn模块作为AUTOSAR基础软件的重要组成部分,为FlexRay网络提供了可靠的时间同步功能。
9.1 主要优势
精确的时间同步
- 支持微秒级的时间同步精度
- 基于FlexRay网络的确定性传输
- 支持全局时间和偏移时间同步
灵活的配置选项
- 可配置的传输周期和防抖时间
- 可选的CRC保护机制
- 支持多种时间域配置
完善的错误处理
- 开发错误检测和报告
- 运行时错误恢复机制
- 状态机管理确保系统稳定性
9.2 应用场景
汽车电子系统
- 发动机控制系统时间同步
- 制动系统协调控制
- 车身电子系统同步
工业控制系统
- 分布式控制节点同步
- 实时数据采集时间戳对齐
- 多轴运动控制系统协调
网络通信系统
- 网络诊断和监控
- 数据包时间戳处理
- 网络性能分析
9.3 技术特点
标准化设计
- 遵循AUTOSAR标准规范
- 与其他AUTOSAR模块良好集成
- 支持多种配置和部署方式
高性能实现
- 优化的消息处理算法
- 高效的状态机设计
- 最小化CPU和内存占用
可靠性保证
- 完善的错误检测和处理
- 状态机确保系统稳定性
- 支持故障恢复和复位
FrTSyn模块通过其精确的时间同步能力、灵活的配置选项和完善的错误处理机制,为AUTOSAR系统提供了可靠的时间同步解决方案,满足了现代汽车电子系统对时间同步的严格要求。