- Autosar CP 基于CAN的时间同步规范主要用途
- 实现精确时间同步
- 提供了一种在CAN总线上准确分发时间信息的机制,确保连接到CAN网络的各个电子控制单元(ECU)能够共享精确的公共时间基准,对于需要精确时间协调的汽车系统功能(如发动机控制、制动系统、安全系统等)至关重要。
- 通过定义明确的消息格式和同步协议,处理时间戳的获取、传输和计算,能够有效减少CAN总线通信中的延迟和不确定性对时间同步精度的影响,保证系统内不同节点间的时间一致性。
- 支持多种时间同步模式
- 既可以作为时间主设备(Time Master)向其他ECU(作为时间从设备Time Slave)传播时间基准,也可以作为时间从设备接收并同步到主设备的时间基准,还支持时间网关(Time Gateway)功能,实现不同CAN总线或时间域之间的时间同步,满足复杂汽车网络架构中多样化的时间同步需求。
- 允许配置不同的时间同步参数,如同步消息的传输周期、传输模式(立即传输或循环传输)、去抖时间等,以适应不同应用场景和系统性能要求,提高时间同步的灵活性和可配置性。
- 确保数据完整性和安全性
- 支持对时间同步消息进行循环冗余校验(CRC)计算,验证消息在传输过程中是否发生错误,确保数据的完整性,防止因数据损坏导致的时间同步错误。
- 通过消息认证码(MAC)和完整性检查值(ICV)机制,提供了对时间同步消息的认证和完整性保护,防止消息被篡改或伪造,增强系统的安全性,尤其适用于对安全性要求较高的汽车应用场景,如自动驾驶、车联网通信等。
- 时间测量与监控功能
- 提供了时间记录功能,可用于测量时间同步的精度,帮助系统开发者和维护人员评估系统性能,及时发现并解决可能影响时间同步精度的问题。
- 支持时间验证功能,通过监测时间同步过程中的各种参数(如消息传输延迟、序列计数器连续性等),检测可能出现的错误或异常情况,如超时、消息顺序错误等,并采取相应的处理措施,确保时间同步的可靠性和稳定性。
- 实现精确时间同步
- 与其他相关模块的关系
- 依赖于其他模块的服务
- 同步时间基准管理器(StbM)
- 从StbM获取和设置当前时间值,包括获取当前时间戳(
StbM_GetCurrentTime
)、获取时间基状态(StbM_GetTimeBaseStatus
)、获取时间基更新计数器(StbM_GetTimeBaseUpdateCounter
)等操作,以实现准确的时间同步和相关计算。 - 在时间同步过程中,将计算得到的时间信息(如Rx Time Tuple)通过
StbM_BusSetGlobalTime
传递给StbM,使StbM能够管理和分发全局时间基准。
- 从StbM获取和设置当前时间值,包括获取当前时间戳(
- CAN接口(CanIf)
- 使用CanIf的服务来接收和发送CAN消息,通过
CanIf_Transmit
发送时间同步消息(如SYNC、FUP、OFS等消息),并在消息传输过程中,利用CanIf提供的时间戳获取功能(如CanIf_GetEgressTimeStamp
和CanIf_GetIngressTimeStamp
)获取准确的时间戳,用于时间同步计算和消息处理。 - 依赖CanIf通知的收发器链路状态变化(
CanIf_EnableEgressTimeStamp
)来管理时间同步消息的传输,确保在链路状态正常时进行消息传输,避免因链路故障导致的时间同步中断。
- 使用CanIf的服务来接收和发送CAN消息,通过
- 默认错误跟踪器(Det)
- 向Det报告开发错误和运行时错误,例如在模块初始化失败(
CanTSyn_Init
)、API调用参数错误(如无效的PDU ID、空指针等)或其他错误情况发生时,通过调用Det_ReportError
或Det_ReportRuntimeError
将错误信息传递给Det,以便进行错误记录和诊断。
- 向Det报告开发错误和运行时错误,例如在模块初始化失败(
- 加密服务管理器(CSM)
- 在时间主设备中,利用CSM生成消息认证码(MAC)和进行签名计算(
Csm_MacGenerate
、Csm_SignatureGenerate
),用于确保时间同步消息的完整性和真实性,保护时间同步过程免受恶意攻击。 - 在时间从设备中,通过CSM验证接收到的消息认证码(
Csm_MacVerify
、Csm_SignatureVerify
),确认消息在传输过程中未被篡改,保证时间同步数据的安全性。
- 在时间主设备中,利用CSM生成消息认证码(MAC)和进行签名计算(
- 入侵检测系统管理器(IdsM)
- 当检测到安全事件(如ICV生成或验证失败、FV不可用、消息序列错误等)时,通过
IdsM_SetSecurityEventWithContextData
向IdsM报告安全事件,使IdsM能够采取相应的安全措施,如记录安全事件、触发警报或采取防御机制,增强系统的整体安全性。
- 当检测到安全事件(如ICV生成或验证失败、FV不可用、消息序列错误等)时,通过
- 同步时间基准管理器(StbM)
- 为其他模块提供时间同步服务
- 为上层应用和其他需要精确时间信息的模块提供统一的时间同步接口,确保整个汽车电子系统能够基于准确的时间基准进行协同工作,例如,发动机控制模块、制动系统模块、传感器数据采集模块等可以依赖于该时间同步服务来保证数据采集、处理和控制操作的时间准确性和一致性。
- 依赖于其他模块的服务
- 使用场景举例
- 车辆动力系统控制
- 在现代汽车的动力系统中,发动机控制单元(ECU)、变速器控制单元和其他相关控制单元需要精确的时间同步来协调工作。例如,发动机的燃油喷射、点火时刻以及变速器的换挡操作等都必须在精确的时间点上进行,以确保发动机的高效运行和车辆的平稳驾驶。
- 时间主设备(如发动机控制单元)通过CanTSyn模块按照预定的时间间隔发送SYNC消息,包含当前时间的一部分信息(如秒数部分
SyncTimeSec
)。时间从设备(如变速器控制单元)接收SYNC消息,并记录接收时间戳。随后,时间主设备发送FUP消息,其中包含与之前SYNC消息相关的偏移信息(如T4
),用于时间从设备计算精确的时间。 - 所有控制单元基于同步后的时间基准进行操作,确保发动机的喷油和点火与变速器的换挡动作在正确的时间顺序和时间间隔内完成,避免因时间不一致导致的动力系统故障或性能下降。
- 自动驾驶系统
- 自动驾驶汽车依赖于多个传感器(如摄像头、雷达、激光雷达等)的数据来感知周围环境并做出决策。这些传感器的数据需要精确的时间同步,以便系统能够准确地融合数据,判断物体的位置、速度和运动轨迹。
- 各个传感器所在的ECU作为时间从设备,接收来自时间主设备(如中央控制单元)的时间同步消息,使传感器数据带有精确的时间戳。在数据处理阶段,系统可以根据时间戳对不同传感器的数据进行同步处理,确保数据的一致性和准确性。
- 例如,当摄像头检测到前方障碍物的同时,雷达也检测到相同位置的物体,通过精确的时间同步,系统可以准确判断这两个检测结果是否对应同一物体,并基于同步后的时间信息计算物体的运动参数,为自动驾驶决策提供可靠依据,提高自动驾驶的安全性和可靠性。
- 车辆动力系统控制
- C++ 代码解析工作原理
以下是一个简化的C++ 代码示例,用于解析AUTOSAR CP基于CAN的时间同步规范的工作原理:
#include <iostream>
#include <ctime>// 模拟StbM模块
class StbM {
public:void getCurrentTime(time_t& time) {// 模拟获取当前时间time = std::time(nullptr);}
};// 模拟CanIf模块
class CanIf {
public:void transmit(const char* message) {std::cout << "Transmitting: " << message << std::endl;}
};// 模拟Det模块
class Det {
public:void reportError(const char* error) {std::cout << "Error: " << error << std::endl;}
};// 模拟CanTSyn模块
class CanTSyn {
private:StbM* stbM;CanIf* canIf;Det* det;time_t syncTime;int sequenceCounter;public:CanTSyn(StbM* stbM, CanIf* canIf, Det* det): stbM(stbM), canIf(canIf), det(det), sequenceCounter(0) {}void init() {// 初始化,这里可以添加更多的初始化逻辑}void sendSyncMessage() {stbM->getCurrentTime(syncTime);char message[100];sprintf(message, "SYNC: %ld", syncTime);canIf->transmit(message);sequenceCounter++;if (sequenceCounter > 15) {sequenceCounter = 0;}}void receiveMessage(const char* message) {if (strcmp(message, "SYNC") == 0) {std::cout << "Received SYNC" << std::endl;} else {det->reportError("Invalid message");}}
};int main() {StbM stbM;CanIf canIf;Det det;CanTSyn canTSyn(&stbM, &canIf, &det);canTSyn.init();for (int i = 0; i < 20; i++) {canTSyn.sendSyncMessage();std::this_thread::sleep_for(std::chrono::milliseconds(500));}return 0;
}
以下是对这个示例的详细解释:
- 模块模拟
- StbM:提供获取当前时间的功能
getCurrentTime
,这里使用std::time(nullptr)
来模拟获取当前时间。 - CanIf:负责发送消息,通过
transmit
函数将消息打印到控制台。 - Det:用于报告错误,通过
reportError
函数将错误信息打印到控制台。 - CanTSyn
- 成员变量:维护了与StbM、CanIf和Det的指针,以及同步时间
syncTime
和序列计数器sequenceCounter
。 - 初始化:在
init
函数中可以添加更多的初始化逻辑,如果需要。 - 发送同步消息:
sendSyncMessage
函数获取当前时间,将其格式化为消息并通过CanIf发送,同时递增序列计数器,当计数器超过15时重新从0开始。 - 接收消息:
receiveMessage
函数根据接收到的消息内容进行处理,如果是SYNC
消息则打印接收信息,否则报告错误。
- 成员变量:维护了与StbM、CanIf和Det的指针,以及同步时间
- StbM:提供获取当前时间的功能
- 主函数
- 在
main
函数中,创建了StbM、CanIf和Det的实例,并将它们传递给CanTSyn的构造函数进行初始化。 - 然后调用CanTSyn的
init
函数进行初始化。 - 通过一个循环,多次调用CanTSyn的
sendSyncMessage
函数发送同步消息,并使用std::this_thread::sleep_for
函数模拟时间间隔。
- 在
这个示例简单地模拟了AUTOSAR CP基于CAN的时间同步规范中的一些基本概念,如时间获取、消息发送和接收以及错误处理。实际的时间同步规范会更加复杂,涉及更多的细节和功能,例如消息格式、序列计数器管理、时间验证、安全机制等。但这个示例可以帮助你理解时间同步的基本工作原理。