写在前面入行一段时间了基于个人理解整理一些东西如有错误欢迎各位大佬评论区指正ok,时间同步离不开Tsyn模块。以CanTsyn模块代码为研究对象梳理下它都实现了什么功能。0.时间同步原理因为报文填充到报文发送出去是需要时间的上图目的是为了将额外所需的时间计算出来尽可能减少Master和Slave之间的偏差。上图怎么理解呢我也不清楚为啥T3 T4是反着的T0时刻Master通过StbM模块获取此时全局时间t0,填充到Sync报文里。我想立即发送但我做不到。)T1时刻这条Sync报文被Master发送出去了,此时全局时间是t1。T2时刻Slave接收到这条Sync报文报文中包含信息t0。同时Slave也能获得此刻本地时间t2。T4时刻Master将本地计算的t1-t0通过Fup报文发出去。T3时刻Slave接收到这条Fup报文,报文中包含信息t1-t0。同时Slave也能获得此刻本地时间t3。那么如果此刻作为Slave以上信息是足够我计算了。在不考虑报文传输时间的情况下T2时刻全局时间 t1 t0(t1-t0)T3时刻全局时间 T2时刻全局时间 t3-t2 t0(t1-t0) t3-t2 t3-t2t1。1.Sync和Fup报文格式2.作为Master应该做什么基于上图流程作为Master我应该按一定时间间隔依次发送Sync、Fup报文并通过StbM模块获取所需的时间填充到报文中。这时我们知道如果想要Slave能够计算得到全局时间同时需要Sync报文和Fup报文那么就有必要规定下他俩之间的时间间隔。以及需要考虑当Sync报文发出后一定时间内若Fup报文没有发生成功是否需要重新发生Sync报文。我们通过CanTSynGlobalTimeTxPeriod来定义Sync和Fup报文的时间间隔通过TxConfirmationTimeoutCounterOfMasterState来定义Fup报文发送超时时间。那么看代码实现通过CanTSyn_Tx_Update实现Master发送Sync、Fup报文。2.1Master状态机作为Master会存在一个状态机2.2如何发送Sync报文2.2.1TxPeriodCounterOfMasterState由于Sync、Fup报文使用同一个CAN ID那么需要保证单一类型报文发送周期是固定的。代码中使用TxPeriodCounterOfMasterState判断TxPeriodCounterOfMasterState 0决定是否发送Sync报文。当每次周期函数调用CanTSyn_Tx_Update时会将TxPeriodCounterOfMasterState--。同时当Sync报文发送成功后会调用CanTSyn_Tx_ResetTxPeriodCounter函数重置TxPeriodCounterOfMasterState。只要当上次成功发送Sync报文距离现在时间间隔超过规定时间时才会允许发送下一帧Sync报文。2.2.2获取CurrentTime解决完报文发送周期接下来看一下报文是怎么填充的。在函数CanTSyn_Tx_GetTimeSync中调用StbM_BusGetCurrentTime获取当前时刻的全局时间t0,以及当前时刻VirtualLocalTime:localTimeT0Vlt储存起来。2.2.3更新SequenceCounter为了Slave判断接受到的Sync、Fup是否是同一对。每一对Sync、Fup报文中SequenceCounter是一致的。在CanTSyn_Tx_IncrementTxSequenceCounter中实现SequenceCounter递增。2.2.4发送报文赋值TxConfirmationTimeoutCounterOfMasterState函数CanTSyn_Tx_AssembleSyncMsg完成bit填充CanIf_Transmit发送Can报文。之后会赋值参数TxConfirmationTimeoutCounterOfMasterState判断Fup报文是否会在规定时间内发送出去。若发送失败则状态机跳转重新发送Sync报文。2.2.5CanTSyn_TxConfirmation报文发送成功后会进入回调函数CanTSyn_TxConfirmation当Sync报文发送成功会调用StbM_GetCurrentVirtualLocalTime再次读取当前时刻VirtualLocalTime:localTimeT1Vlt由此可以计算localTimeT1Vlt-localTimeT0Vlt.2.3如何发送Fup报文2.3.1填充报文内容状态机跳转到CANTSYN_STATE_SEND_WAITING_FOR_FOLLOW_UP_SEND后开始进入Fup报文发送工作。填充localTimeT1Vlt-localTimeT0Vlt以及SequenceCounter并发送报文。2.3.2CanTSyn_TxConfirmation发送成功后在函数内切换状态机。3.作为Slave应该做什么todo