AUTOSAR——CAN时间同步
文摘
2024-11-08 07:36
上海
1.引言
时间同步在汽车嵌入式系统中扮演着非常重要的角色,尤其是在高级驾驶辅助系统(ADAS)中。它确保了不同组件之间的协调运作,对于提高车辆的安全性、可靠性和整体性能至关重要。智能网联汽车技术发展中,无论是传感器的数据融合、实时通讯、定位服务还是功能安全与冗余设计,对时间同步的要求也越来越高。CAN时间同步模块CANTSyn通过CAN总线分发时间信息。但是由于CAN特有的仲裁延迟以及BSW的接收方式,会导致主节点Time Master直接向从节点Time Slave广播的时间信息会不准确。Autosar提供了CanTSyn模块来提高时间同步的准确性,但是需要注意的时,只是提高精度,即使使用了CANTSync,还是会有时间的误差,仅仅只是提高精度。
主节点(Time Master)首先发送一个包含时间信息的报文,并记录当前时刻 t0r,之后主节点利用CAN驱动的机制(CAN在发送成功后会触发TxConfirmation机制,通知上层报文已经成功发送)来记录实际发送消息的时间点t1r;从节点(Time Slave)在接收到SYNC消息时,记录实际接收到该消息的时间点t2r;主节点(Time Master)将t1r-t0r的差值(SYNC报文从发送到发送确认之间的时间偏移量),当做FUP报文发出;从节点(Time Slave)在接收到FUP报文时,记录时间t3r。
即使存在网络延迟和其他通信相关的延迟,Time Slave也能相对准确地与Time Master保持时间同步。这种方法减少了单次消息传递带来的不确定性和误差,考虑到了消息从发送到接收过程中发生的延迟,从而提高了整个系统的时间同步精度。
3. 代码分析
时间同步通过CANIF层调用CANDRIVE层发送报文,接收反之亦然。ECU自身的时间戳通过STBM模块获取。主节点在SYNC消息需要发送的周期到时,通过stbm获取此时的时间节点t0r,调用CanTSyn_Prepare_Sync_Message()组包SYNC报文后调用CanIf_Transmit()发送报文;在中断接收到报文发送成功时,调用CanTSyn_TxConfirmation()获取此时的时间戳记录为t1r;在设定的deboucetime到时,获取此时的时间戳t1,t1-t0即获得FUP的纳秒时间差,并发送FUP报文;在接收到主节点发送过来的SYNC报文后,记录从节点的接收时间t2r,并调用CanTSyn_process_Sync_message和CanTSyn_unpack_store_sync解析SYNC报文的时间t0r;在接收到主节点发送的FUP报文时,记录从节点的接收时间t3r,并计算出偏移过的时间 = t0r+t1r+(t3r-t2r)4.ISOLAR配置
时间同步的配置比较少,黄框是主函数的周期,主函数是用于对主/从节点的报文状态机管理;蓝框是配置主/从节点的报文相关参数,周期、FUP报文贱哥、CRC选项、confirm超时周期;5. 其他
一些关于ETAS代码的思考或者疑问
(这里代码里的t5实际上是t3r,接收到FUP报文的时间戳)t3r与t2的差值是纳秒级别的直接想减,这里有没有可能会是负数呢?