autosar 时间同步

时间同步

Autosar就是让ECUs的软件架构标准化:

1.让软件和硬件分的清清楚楚

2.让不同功能的软件模块分的清清楚楚

3. 非常方便模块再利用

4. 减少开发成本,提高质量和效率

就像是统一了手机充电接口一样,管你三星苹果还是华为,随便插拔,随心所欲的充电,这就是标准化的力量。Autosar可以让主机厂(OEM, 比如大众宝马奥迪等),供应商(大陆,博世,Nvidia, Renesas等),开发工具供应商(Matlab, Vector, Electrobit等),以及新入市场的朋友(各路创业公司们),都可以收益。因为任何人都可以很方便的根据规范标准,开发自己的专长的功能或者工具,而不必浪费大量的人力物力去匹配那些根本没有意义的接口或者平台。类似于你开发一个简单实用的手机APP,你真的没有必要去开发苹果版本,安卓版本,太费神了,开发一次就够了,你的价值在于创意,而不是写代码!

https://pic4.zhimg.com/80/v2-e9c40e3395ccd9c7e6f24c4935fb5eb3_hd.jpg

AUTOSAR standardizes two software platforms –Classic and Adaptive

随着时代变迁,Autosar也不能落后于,过去主要是比较死板的Classic Autosar, 如今新的更灵活的Adaptive Autosar也横空出世。因为目前趋势是多核多Soc的硬件结构,所以基于性能和安全需求的考量,可以混合两种Autosar架构。

基于以上特点,Autosar注定不会只能在汽车上应用,电动车,无轨交通,游艇,轮船等等等等,都能用。但是注意,核电站,Autosar不宜,毕竟付不起那个责任。

https://pic2.zhimg.com/80/v2-df3d2f76b532b34bae3b6ccf48e2fe95_hd.jpg

吹了半天牛逼,该来点干货了,那么我试着从基于Autosar的时间同步功能,讲讲,Autosar到底是怎么标准化软件架构的。

~~~~~干货分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

师出有名,讲的就是做任何事情之前都要讲一个好的motivation。软件也是同样的道理。事实上,时间同步是非常重要的一个概念。可以想象,一首优美的交响乐,各种不同的乐器以及乐手要非常默契在节拍内准确的演奏自己的乐章,快一拍或者慢一拍都是非常刺耳的,甚至可能会扰乱整场演奏会。这其实就是智能驾驶实时系统的真实写照,各个模块及算法要准时准点的按照节奏执行自己的功能,不能快,也不能慢。所以,时间同步显得尤为重要,大家要有一个一致的时钟,这就是传说中的Global Time (GT).

为了统一控制时间,我们就需要一个全局时间软件模块(StbM, Synchronized Time-base Manager)。

功能只有两个:1. 同步各个软件模块实体,2. 提供绝对时间值。

它的功能显而易见就是作为一个中介,统一大家的时钟,已达到同步各个软件及算法模块。

啥都不说了,先来一张图体会一下StbM的作用对象们:

https://pic1.zhimg.com/80/v2-6e93dcfb4fa08d1012dcded389ef4b58_hd.jpg

StbM就是一个中介,来传递同步时钟信号

  1. StbM要能提供同步时钟信息给Triggered Customer, 比如操作系统。操作系统就好比乐队指挥,也需要看着表来指挥乐队演奏。
  2. StbM要能提供同步时钟信息给Active Customer, 比如有些算法或传感器。
  3. StbM要能提供同步时钟信息给Notification Customer, 想象一下国内浮夸的摩托车里面绚丽的内饰灯,他们可能要按照节奏闪动。
  4. StbM要能通过总线提供同步时钟信息,比如CAN, FlexRay或者Ethernet.

https://pic4.zhimg.com/80/v2-89739aedaa3b8bd745a2c3c1bde895c3_hd.jpg

全局时间如何通过CAN,FlexRay和ETH来传播

其实时间同步的难点在于,硬件时钟信号存在偏差。也就是说不同公司不同产品,即使产品说明书上写着相同的时钟频率,但实际上由于公差或者物理热效应,事实上是在时间维度上是存在偏差的。下图就是说真正的时钟信息是如何产生并且传递的:

https://pic3.zhimg.com/80/v2-be26712d271f0b7267686664721c6db6_hd.jpg

从下往上看

从下往上看上面这幅图。右下角就是硬件时钟,也是整个同步系统的基石。但是因为隔一段时间超过最大值后就会溢出,所以需要一个Software Counter来记录这种溢出,然后一起产生了一个虚拟本地时间 (Virtual Local Time). 这个时间就没有溢出和跳跃了,也就是说很平稳的表达时间的流逝。接下来就是技术核心,如何进行时间的矫正,这个下面会细讲(durchsprechen, 复习一下德语)。接下来就可以产生一个同步的本地时间信号,之后就可以传递给其他的软件模块了。

~~~~~干货中的干货分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

干货中的干货: 时间矫正算法

先上图,横轴代表全局时间,纵轴代表本地时间。虚线代表理想的时间关系,蓝线代表实际的时间关系。显而易见,实际上,是有偏差的。其中斜率代表时钟频率偏差,红色箭头代表绝对时间的偏差。

https://pic2.zhimg.com/80/v2-bc0f94f7aeb1149a607a51eba03e48d5_hd.jpg

Time Deviations Rate Correction

接下来注意了:

时间的矫正过程,并不改变各个在本地的运行时钟,而是动态改变本地时钟的实体变量。

It merely corrects the clock values on- the-fly when they are read.
---Autosar

接下来就是矫正的时序流程图: 先去测量,然后设置新的矫正值,然后读现在的本地时间并且矫正本地的时间,然后写回本地模块。

https://pic1.zhimg.com/80/v2-99fd64abf1353ca40c9d33cd571bbff4_hd.jpg

矫正时序图

https://pic1.zhimg.com/80/v2-afd8de1085f678c4c9b19abd0b9314bc_hd.jpg

 

动态误差图

上图就非常清楚地显示了时间误差的,其实也就是一种动态误差调整的过程。

接下来,简单介绍一下StbM如何通过CAN总线来同步其他的模块。依旧先上图:

https://pic4.zhimg.com/80/v2-ad0058ceeaa8207f1b49ac8289bdf023_hd.jpg

CAN Time Synchronization mechanism

过程就是两步(StbM模块实现这部分功能,提供接口StbM_GetCurrentTime从而获取Global Time):

  1. Master在t1r时刻先发送一个SYNC信号,但这个信号写的是之前要发送SYNC时的时间点(t0r),然后在t2r时刻Slave接收到了这个SYNC信号。
  2. Master再次发送一个FUP信号,这个信号的内容就是他t1r-t0r的值。
  3. 最后在Slave方,我们就可以计算出本地当下的同步时间值=(t3r-t2r)+t1r, so easy!

当然,以上都是一些简单的原理性概述,具体的规范和标准,还是要参见Autosar原文,里面非常详细定义了需求,功能,接口,时序,设置等。仿佛一本字典,需要的时候再去查阅吧。

实例:

STATIC u32_t TxData_GetDetectionGlobalTime(void)//获取检测到障碍物时的全局时间Global time
{
   STATIC CafDetectionList_t  DetMgr_Input;
   u8_t  TxData_GlobalTimestamp_Status = 0u;
   u32_t TxData_DetectionTimeStamp_100us = 0xFFFFFFFFU;
   u32_t Global_Timestamp = AppUtil_GetGlobalTime_100Usec(&TxData_GlobalTimestamp_Status);
   u32_t TxData_Temp_LocalTime_100us = (u32_t)(CAF_Get_Current_Time_usec() / 100u);

   FILL_HDR_INFO_STRUCT(DetMgr_Input, APPSTRUCTNAME2ENUM(CafDetectionList_t), CAF_GetDetectionList_VER);

   if (CAF_GetDetectionList(&DetMgr_Input) == TRUE)
   {
      u16_t crc = CAF_CalcCRC16(&DetMgr_Input, APPUTIL_OFFSETOF(CafDetectionList_t, crc16));
      if (DetMgr_Input.crc16 == crc)
      {
         if (DetMgr_Input.numEntries > 0u)
         {
            TxData_DetectionTimeStamp_100us = Global_Timestamp - ((TxData_Temp_LocalTime_100us - (u32_t)(DetMgr_Input.timeStamp_us / 100u)));

检测到障碍物时的全局时间 = 发送Timestamp报文时的全局时间 - (发送Timestamp报文时的局部时间 - 检测到障碍物时的局部时间)
         }
      }
   }
   return TxData_DetectionTimeStamp_100us;
}

u32_t AppUtil_GetGlobalTime_100Usec(u8_t * timeBaseStatus)
{
   StbM_TimeStampType timeStamp;
   StbM_UserDataType  userData;
   uint64   globalTime;
   u32_t retValue = 0U;

   if (StbM_GetCurrentTime(StbMConf_StbMSynchronizedTimeBase_StbMSynchronizedTimeBase, &timeStamp, &userData) == E_OK)
   {
      globalTime = ((uint64)timeStamp.seconds * 1000000u) + ((uint64)timeStamp.nanoseconds / 1000u);//全局时间
      retValue  = (uint32)(globalTime/100u);
   }

   *timeBaseStatus = timeStamp.timeBaseStatus;

   return retValue;
}

你可能感兴趣的:(Classic,AutoSAR详解,autosar,最小完成时间算法)