时间融合和使用
对于整车来说,Tsync模块需要将整车所有vehicle time和utc同步好,对于用户来说,开发者最好提供获取vehicle time和utc时间的接口,用户无需要关注时钟同步的过程和细节。
时间融合与utc同步
前面提到vehicle time和utc的精度不一样,所以使用场景各有不同,也就意味着同一个ecu内,应该同时存在上述两种时间,我们以网关(GW),座舱控制器(CDC),智驾控制器(ADC)以及TBOX为例分析。
如上图所示,vehicle time可以借助gptp以及can_tsync让所有ecu保持同步,而utc时间必须借助外部环境先同步TBOX。但是如何让GW, CDC ,ADC也能同步UTC时间呢?
针对上述拓扑,vehicle master和utc master不在同一个ecu,可以借助当前最火的SOA思想,在TBOX上部署UtcServiceProvider,提供GetUtc和PubUtc两种接口,而GW, ADC, CDC则可以部署UtcServiceConsumer。为了消除SOA传输带来的延迟,我们可以将TBOX的utc和vehicle time一同给到consumer端,这样的话,UTCconsumer=UTC(provider)+(vehicle_time(consumer)-vehicle_time(provider))。
如果vehicle master和utc master在同一个ecu,如下图,这种方式相对来说,会更加简单一点。比如我们可以将utc的时间在tbox上于vehicle time同步,然后通过gptp的报文,简介的同步所有的ecu的utc时间。
不管上述任何一种情况,实际并不复杂,前一种让架构部门输出soa的描述语言(arxml,idl),由下游直接生成服务和实现服务即可;而后一种情况从方式较为简单了,但是需要考虑时间跳变的问题。
对外接口
针对使用者来说,期望能够直接获取utc时间或者vehicle time,所以开发者理应再提供接口直接获取,屏蔽使用者无需关心的细节。代码示例如下:
复制
C++
class JinbaoClock {
public:
static struct timespec GetVehicleTime()
{
struct timespec ts_ptp;
if (clock_gettime(clk_id_, &ts_ptp)) {
return {};
}
return ts_ptp;
}
static struct timespec GetUtc()
{
struct timespec ts_utc;
if (clock_gettime(CLOCK_REALTIME, &ts_utc)) {
return {};
}
return ts_utc;
}
};