zoukankan      html  css  js  c++  java
  • 精确时间协议PTP研究【转】

    转自:http://www.coinv.com/page/pid/492.html

    摘要:PTP(Precision Time Protocol)协议基于以太网,能够达到亚微妙级的对时精度,在模态分析和振动测试等领域将有着广阔的应用前景。首先介绍了PTP协议的基本原理及工作流程,接着剖析了关键数据结构及模块,最后给出了测试结果和下一步要作的工作。

    关键词:精确时间同步,以太网,IEEE 1588,嵌入式系统

    1、引言

    随着网络技术的不断增加和发展,尤其是以太网在测量和控制系统中应用越来越广泛,计算机和网络界也在致力于解决以太网的定时同步能力不足的问题,开发了网络时间协议(NTP),但其同步准确度只能达到200μs,仍然不能满足测量仪器和工业控制所需的准确度。为了解决这个问题,网络精密时钟同步委员2002年推出了IEEE1588标准,即“网络测量和控制系统精密时钟同步协议标准”, 其基本功能是使分布式网络内的所有时钟与最精确时钟保持同步,它定义了一种精确时间协议PTP(Precision Time Protocol),用于对标准以太网或其他采用多播技术的分布式总线系统中的传感器执行器以及其他终端设备中的时钟进行亚微秒级同步,2008年又推出了更加高效、简洁的第二版。IEEE 1588可以以纯软件的方式实现,也可以用能够提供更精确的时间同步的专门的硬件实现。时间的精度和不确定性主要依模块和IEEE 1588执行的情况而定,一般期望在几十纳秒到几十亚微秒间。IEEE 1588用于需要时间精度比NTP高的局域分布系统,也用于一些不能接受GPS高成本或者不能接收到GPS信号的应用场合。由于其精度高、成本低、设备布置灵活,国外许多高端测量仪器中已广泛采用,而我国在这方面的研究与开发相对比较落后,但测量设备采用PTP同步方式已成为大事所趋,尤其是模态分析和振动测试等领域将有着广阔的应用前景。

    2、PTP原理及工作流程

    PTP协议通过以太网同步各设备的时钟,可以提供亚微妙级的对时精度,其对时过程包含两步:

    第一步:通过最佳主时钟(Best Master Clock)算法确定网络中最精确的时钟,作为主时钟master,其余所有时钟都作为slave,并与master同步。

    第二步:通过计算主从时钟偏移量和网络延时修正从设备时钟。同步的过程中需要计算主从时间差异,其中包含主从钟的偏移量和网络传输时延。因此从时钟的修正也包含偏移量的修正和传输时延的修正。

    2.1 主从消息交换流程

    主从设备主要通过消息交换,完成对时,为保持长期一致,需要不断对时,消息交换模式如图1所示:

    a、主节点发送一个Sync消息到从节点,并记住消息发送时间t1。

    b、从端接收Sync消息,并记下接收时间t2。

    c、主端通过把t1嵌入到Sync消息中或随后的Follow_Up消息中,将时间戳t1发送给从端。

    d、从端发送Delay_Req消息给主端,并记录发送时间t3。

    e、主端接收Delay_Req消息并记下接收时间t4。

    f、主通过把时间戳t4嵌入Delay_Resp消息发送给从端。

     image001.jpg

                    图1  主从消息交换流程

    消息交换结束后,从端拥有了所有4个时间戳,用它们可以计算主从端时间差和平均消息传输延时。

    Tmsd = t2 + Tms – t1

    Tsmd = t4 –( Tms + t3)

    由于通信路径的对称性,

    路径延时Td = Tmsd = Tsmd = 1/2 *(t2 – t1 + t4 – t3)

    主从时差 Tms = 1/2*(t2 – t1 + t4 - t3)

    2.2调整从设备时钟的原则

    如果时间差Tms过大,则应用绝对时间调整,从设备时钟要加上时间差以调整绝对时间,使其时间在此刻与主时钟时间完全一致;

    如果时间差Tms较小,则使从时钟的频率改变某一百分比,从时钟设备需要调整各自的时钟频率,与主时钟频率保持一致。

    一般来说,PC机可以通过设置系统时间来调整主从时间差,但不能调整时钟的频率。为了能够调整时钟频率,需要1588时钟芯片或内置1588时钟的PHY芯片支持,如美国NS的DPS83640。系统各时钟对时时,如果没有硬件支持,只能达到亚毫秒级的同步精度;如果有专用硬件支持时,可以达到亚微妙级的同步精度。

    2.3 消息类型

    PTP中消息分为事件消息和通用消息两种。其中,事件消息在离开和到达一台设备时必须打时标(记录本地时间),包括Sync、Delay_Req、Pdelay_Req、Pdelay_Resp;通用消息不需要打时间戳,包括Announce、Follow_Up、Delay_Resp、Delay_Resp_Follow_Up、

    Management和Signaling。

    3、关键数据结构

    关键数据结构对于PTP协议的理解和分析至关重要,现列出一些主要的数据结构。

    3.1 时间戳类型,表示相对于1970年1月1日0时0分0秒的时间。

    struct Timestamp {

        u48 seconds;    //秒

        u32 nanoseconds;   //纳秒 (<10^9)

        u16 frac_nanoseconds;  //分数纳秒

    };

    3.2  端口上下文,作为每个端口相关函数的参数。

    struct ptp_port_ctx {

        struct ptp_port_ctx *next;  //内部列表指针

        bool port_state_updated;    //端口状态修改标志

        int timer_flags;            //各定时器使能标志

        struct Timestamp announce_timer; // announce报文超时时间戳

        struct Timestamp sync_timer;        //sync报文发送超时时间戳

        struct Timestamp delay_req_timer;   //delay_req 报文发送超时时间戳

        struct Timestamp pdelay_req_timer;  // pdelay_req报文发送超时时间戳

        struct Timestamp announce_recv_timer; // announce报文接收超时时间戳

        bool announce_recv_timer_expired; // announce报文接收超时标志

        u16 sync_seqid;             //sync报文序号

        u16 delay_req_seqid;        //delay_req 报文序号

        u16 announce_seqid;         // announce 报文序号

        struct Timestamp sync_recv_time;    //sync报文接收时间戳

        u64 sync_recv_corr_field;   // sync报文中的校正字段

        struct Timestamp delay_req_send_time; /// delay_req报文发送时间戳

        struct ForeignMasterDataSetElem *foreign_master_head;

       ClockIdentity current_master;       //当前主时钟ID

        bool unicast_port;          //单播端口标志

        struct PortDataSet port_dataset;    //端口数据集     

    };

    3.3 PTP报文头格式

    struct ptp_header {

        u8 msg_type; // ptp 消息类型 (bits 3-0), 传输相关 (bits 7-4)

        u8 ptp_ver;                 //ptp版本 (bits 3-0)

        u16 msg_len;                //消息长度

        u8 domain_num;              //域号

        u8 res;                     //预留

        u16 flags;                  //标志

        u64 corr_field;             //校正值

        u32 res1;                   //预留

        struct PortIdentity src_port_id;    // 源端口Id

        u16 seq_id;                 //序号

        u8 control;                 //控制

        u8 log_mean_msg_interval;   //对数平均间隔

    } __attribute__ ((packed));

    4、主要模块

    系统由主控、配置、端口收发、最佳主时钟算法、端口状态机和时钟接口等模块组成。其调用关系如图2所示。

    Catch.jpg

                        图2  模块调用关系

    4.1 PTP主控模块

    1)初始化:分配存储器,各种上下文,各种数据集,包交换、操作系统和时钟接口等。

    然后,循环进行以下4步:

    2)检查各端口Announce报文接受定时器是否超时

    3)运行BMC最佳主时钟算法

    4)运行各端口的状态机

    5)等待新消息到达或某些定时器超时

    4.2 PTP配置模块

    主要功能包括:读取xml格式的配置文件放入相应的数据结构,分析各项配置的合法性,

    配置各网络端口。

    4.3 PTP端口收发模块

    发送模块主要负责创建、关闭新PTP端口,创建SYNC、FOLLOW_UP、ANNOUNCE、DELAY_REQ和DELAY_RESP消息,并由端口发事件消息包。

    接收模块负责接收处理所有的PTP消息,包括sync、follow_up、announce、delay_req和delay_resp。

    操作系统相关包模块负责底层的网络端口socket(事件消息和通用消息各占一个socket)的初始化与关闭,PTP帧的发送与接收。

    4.4 PTP最佳主时钟选择算法和端口状态机

    PTP端口有initializing、faulty、disabled、listening、pre_master、master、passive、uncalibrated和slave九种状态。随着网络上设备及收发消息的变化,经最佳主时钟算法计算,可以改变端口状态。

    4.5 PTP时钟接口模块

    主要初始化时钟接口,获取时钟特性,记录收到事件消息时的时间戳,并调整主从时钟时间差及时钟频率。

    5、结束语

       本文设计实现了PTP协议第2版,首先基于PC机平台Ubuntu10.04 Linux操作系统进行了测试,测试结果表明已达到。下一步,将在Omap-L138双核嵌入式平台上进行更深入的实验,并采用专用的1588 PHY芯片,以达到更精确的同步效果,并应用到多种测量仪器上。

     参考文献

    [1] IEEE Std 1588TM-2008, IEEE Standard for a Precision Clock Synchonization Protocol for Networked Measurement and Control System[S].July 2008.

    [2] [美]W.Richard Stevens 网络编程[M].施振川 周利民 孙宏晖,译.北京:清华大学出版社,2010.

    [3]陈兴敏,康国钦.LXI的精准时间同步触发方式分析[J].测试测量技术,2008.

    【作者】张昺华
    【大饼教你学系列】https://edu.csdn.net/course/detail/10393
    【新浪微博】 张昺华--sky
    【twitter】 @sky2030_
    【微信公众号】 张昺华
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    [NOI2019]回家路线(最短路,斜率优化)
    LOJ6686 Stupid GCD(数论,欧拉函数,杜教筛)
    Codeforces Global Round 4 题解
    CF908G New Year and Original Order(DP,数位 DP)
    [BJOI2019]光线(DP)
    CF1194F Crossword Expert(数论,组合数学)
    SPOJ31428 FIBONOMIAL(斐波那契数列)
    Codeforces Round 573 (Div.1) 题解
    [THUPC2018]弗雷兹的玩具商店(线段树,背包)
    数学基础
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/14858072.html
Copyright © 2011-2022 走看看