AutoSar CP中的时间同步部分主要由Stbm,TimeSyncOverEth和底层的以太网模块组成。 底层的以太网模块主要负责收发报文和时间戳。 如果系统设计决定使用网卡NIC的时钟作为全局的时钟源,则网卡硬件需要在Sync等报文进出网口的时候,使用自身的时钟给这些报文打时间戳,并把这些时间戳提供给上层的TimeSyncOverEth。 要注意这里打时间戳不是说把时间戳打到Sync等报文上。而是记录下这个时间点,并通过别的接口单独提供给TimeSyncOverEth 系统设计不使用网卡NIC的时钟作为全局时钟源的情况暂时不讨论。 Stbm和TimeSyncOverEth模块共同完成1588或802.1as协议。总的来说,TimeSyncOverEth偏重于报文的收发和从报文中计算出时间值。Stbm偏重于将TimeSyncOverEth计算出来的时间和ECU的具体结合。 Fig 1展示了这些模块之间的关系,Eth NIC负责通信和使用自身的HwClock对报文打时间戳。同时VirtualLocalTime也可以使用Eth NIC中的HwClock作为时钟来源。Virtual Local Time中的HwCounter会从Eth NIC中读取HwClock的值。SwCounter的作用就是扩展HwCounter的计数范围,所以基本上将Virtual Local Time中的SwCounter和HwCounter一起看作一个大寄存器就好了。 注意VirtualLocalTime和NIC中的HwClock都没有具体的UTC时间信息,只是简单的timer读数。 TimeSyncOverEth模块收到各个报文后,根据Sync中的时间值,FollowUp中的correction和相应的Pdelay值,计算出真实的时间值,并把这个时间值和相应的时间戳(即相应的Sync报文到达网口的时候NIC记录下的timer读数)给到Stbm。计算过程详见1588/802.1AS。 Fig 2 Stbm的内部逻辑可综合参考Fig 1和Fig 2。我觉得我画的Fig 1比autosar的Fig 2更容易理解一点。 Stbm内部主要的概念有三个,一个是Virtual Local Time,一个是Synchronized Time Base,一个是Offset Time Base。 上面已经说过,Virtual Local Time没有具体的UTC时间,只是一个软硬结合的大计时器,只能用来记录时间的流逝(也就是计时器读数的增长),而不能表示具体的时间。 具体的UTC时间的表示是Synchronized Time Base和Offset Time Base维护的。其中Offset Time Base的时间是从Synchronized Time Base的时间加上一个offset得到的,其余没有什么特别。所以初步理解的时候主要看Synchronzied Time Base。下面简称Time Base。 Autosar的Stbm允许维护32个不同的Time base,主要是备份用。在系统层面,一个Timebase会对应系统中的一个Time domain。 各个Timebase的主要任务就是维护Virtual Local Time和具体的UTC时钟之间的关系。不同的time base会和不同的time master同步,不同的time master频率不一样,所以不同time base对时间的“理解”也不一样。这里的“理解”包含两个意思,一个是时间的绝对值,一个是时间走的快慢。比如,time base 1认为virtual local time +10,UTC时间就+1ms,time base 2认为virtual local time +12,UTC时间+1ms。这样的区别是因为time base 1和time base 2同步到了不同的time master上了。 Fig 3 Fig 3对于理解Stbm的工作原理更有帮助。 在Fig 3中可以看到,NIC在timer读数=8的时候收到了Sync报文,最终TimeSyncOverEth将“time = 10.11,LocalTime = 8”这样的信息给到了Stbm。所以现在Stbm的TimeBase1知道,“在Virtual Local Time =8(同时NIC HwClock也是8)的时候,实际时间是10.11” 当App向TimeBase1查询时间(Stbm_GetCurrentTime())时,TimeBase1发现现在Virtual Local Time是19(19要怎么读到autosar没定义,我理解是非标的操作)。 所以current time = 10.11 + (19-8)* factor。这就是autosar时间同步机制的基本思路。AP和CP一样的。 在autosar的设计中,时钟的调谐其实就是调上面公式的factor,也就是说autosar的设计是通过微调factor来使slave的频率和master一致。但是如果某个ECU选用的时钟源是可调的,比如PLL,那也可以在硬件层面调整频率。但那样的话就不能支持多time domain的系统设计了。 |
|