易勝藍
(中國西南電子技術研究所, 成都610036)
目前,用于時間同步的協議中使用得較多的是網絡時間協議(Network Time Protocol,NTP),這是一種低成本的網絡對時協議。但是,由于網絡時間協議的時間標記(Time Stamp)是在協議的應用層中獲得的,無法滿足太高的時間精度要求,只能提供毫秒級別的對時精度[1]。與NTP 協議不同的是,IEEE 1588精確時鐘同步協議(Precision Time Synchronization Protocol,PTP)可以在不增加硬件成本的條件下,達到幾微秒到幾十微秒級別的時間同步精度[2],通過網絡接口在協議的底層獲取時間標記,達到時鐘同步的效果。如果需要更高的精度要求,可以使用專門的硬件模塊獲取時間標記,將時間戳的獲取點移至物理層,由硬件完成時間戳的獲取,則可以將時鐘同步精度提高到亞微秒級[3]。本文在對IEEE 1588 的同步原理詳細分析的基礎上,提出一種在嵌入式Linux 系統中以軟件方式實現精準時間協議(PTP)的方法,并給出了相應的應用平臺實現。
IEEE 1588 通過時間報文交換的方法實現分布式系統中各節點的時間同步。在系統中往往會有一個主時鐘(master),它提供整個系統的時間基準,而系統中的其他時鐘則為從時鐘(或叫做子時鐘,slave)。在系統中,每個時鐘狀態的確定是通過最佳時鐘算法確定的。主時鐘和從時鐘通過交換報文的方式來確定主從時鐘之間的時間偏移以及報文傳輸的網絡延遲,PTP 協議通過兩次包含有時間戳的報文的發送,真正精確的發送時間被正確記錄了下來,用來最終計算出主時鐘和從時鐘之間的時間差。主時鐘每隔一段時間將本地時間發布到網絡上,從時鐘進行時間戳的接收并更新本地時鐘,同時從時鐘不斷地進行線路延時的計算,以保證時鐘的精確[4]。
如圖1 所示,主時鐘節點按照定義好的時間間隔,將時間同步報文(Sync)發送給網絡上所有的從時鐘節點,該時間同步報文發送的精確時間戳TM1被同時記錄了下來,該同步時間戳在隨后發送的跟進報文(Follow -up)中被發送給從時鐘節點。從時鐘節點在收到該時間同步報文后,接收時間戳TS1被記錄了下來, TM 1、TS1這兩者的時間偏差包括傳輸線路中的報文傳輸延遲和主從時鐘的偏差。由于分布式系統中各個節點的布線長度、布線方式和該節點在網絡中位置的不同,時鐘報文的傳輸延遲也將會變得不同。為了提高時鐘同步的精度,必須通過測量的方式消除該時鐘傳輸延遲。從時鐘節點以固定的時間間隔將延遲請求(Delay Request)報文發送給主時鐘節點,同時將該報文的發送時間戳TS2記錄下來,主時鐘節點在收到該延遲請求報文的同時,將接收時間戳TM2記錄下來,然后主時鐘節點在隨后的延遲響應(Delay Response)報文中將該時間戳發送給相應的從時鐘節點。

圖1 主從時鐘同步原理Fig.1 Time synchronization principle of master and slave
在計算延遲的過程中,假設網絡傳輸介質是對稱均勻的,因此可以認為主時鐘到從時鐘的時間延遲跟從時鐘到主時鐘的時間延遲是對稱相等的。因此,可以得出以下兩個式子:

式中,T Δ為從時鐘相對主時鐘的偏差, Td為報文的網絡傳輸延遲。
由式(1)和式(2)可以求得:

根據計算出來的偏差TΔ,調節從時鐘,即可實現時間同步的功能。
在IEEE 1588 精確時鐘同步協議中,首先要從眾多時鐘當中找出一個時鐘,作為系統的主時鐘,其余時鐘為從時鐘。這個功能需要使用最佳主時鐘算法來實現,最佳主時鐘算法模塊主要用于選擇本地網絡中的最佳時鐘作為主時鐘,同時決定本地時鐘所應處的狀態。最佳主時鐘算法(Best Master Clock A lgorithm)由狀態定斷算法和數據集比較算法[1]這兩部分算法組成。
數據集比較算法首先在所有同步報文的不同數據集中挑選出合格的同步報文,然后對這些同步報文進行篩選,以選出可用的最佳報文。其實現的流程如圖2 所示:它的作用是根據同步報文的不同數據集,通過從合格的同步報文里篩選,獲得最佳的報文。在收到報文的時候,首先判斷該報文是否是同步報文,是的話則繼續運行;接著使用Identifier-Compare()函數對時鐘層和時鐘標志位進行比較,如果這兩種屬性不同,則可以由此得出較好的時鐘,如果這兩者屬性相同,則需要繼續往下運行;進行時鐘屬性比較,如果時鐘屬性不同,可以得到較好的時鐘,如果時鐘屬性也相同,則繼續往下運行,使用UUID-comparision()函數對不同的UUID 進行比較,這樣經過層層比較,所有端口都運行該算法,最終可以選出最佳的時鐘。

圖2 數據集比較算法流程Fig.2 Data set comparation algorithm flow
狀態定斷算法主要進行狀態的判斷和數據集的更新,在確定最佳主時鐘后,狀態定斷算法根據不同數據集的信息計算出系統中每個時鐘的各個PTP 端口的推薦狀態,具體共有8 種推薦狀態:未校正、從時鐘、待機、主時鐘、監聽、禁止、故障和初始化等狀態,本地時鐘將根據結果相應地調整狀態。狀態定斷算法根據運算分析的結果,動態調整各個時鐘和端口的狀態,所以當主時鐘出現性能下降或產生故障的時候,系統能夠自動選擇其他更合適的時鐘作為主時鐘。
系統的應用平臺選用基于ARM9 的嵌入式系統,處理器芯片為三星的ARM9 芯片S3C2440,應用平臺帶有一塊256MB 的Nand Flash 芯片用于存儲Bootloader、Linux 內核和根文件系統。嵌入式Linux操作系統是文中IEEE 1588 協議實現的基礎,為協議的運行提供運行的基礎。
首先,根據應用平臺的特性移植Bootloader,本系統使用的Bootloader 為u-boot 1.1.6,其完成的主要任務有:為Flash 分區,分配好系統的存儲空間,分別為u-boot 區、Linux 內核分區和根文件系統分區;初始化處理器和外設的硬件資源配置;傳遞啟動參數給Linux 內核,調用Linux 操作系統。U-boot 的實現非常依賴于具體硬件,需要根據硬件配置將U-boot 移植到嵌入式系統中。然后,根據應用平臺的硬件特性配置Linux 內核,并將Linux 內核編譯為zImage 格式,應用系統選用的內核版本為2.6.30.4,可以提供最新的應用特性。最后,使用BusyBox 工具制作所需要的根文件系統。BusyBox 將系統中的許多功能模塊集成到一個名叫BusyBox 的可執行文件中,并通過使用不同的命令名稱來調用相應的功能模塊,十分容易定制自己的根文件系統。
將Bootloader、Linux 內核和根文件系統編譯完成后,即可通過JTAG 工具燒寫到Nand Flash 的對應分區中。
如圖3 所示為所設計網絡時間同步系統的結構圖,主要包含PTP 協議處理模塊、PTP 發送模塊、PTP接收模塊和時間戳添加模塊。其中PTP 協議處理模塊位于應用層中,使用Linux 操作系統的網絡API 實現。PTP 發送模塊和PTP 接收模塊使用UDP 傳輸協議進行時間同步報文的發送和接收工作,時間戳的添加和讀取工作在驅動層完成。

圖3 網絡時間同步結構圖Fig.3 Network time synchronization structure
PTP 協議處理模塊是實際的運行模塊,是整個精確時間同步協議實現部分的核心,它針對主從時鐘節點的運行狀態不同執行不同的任務。PTP 協議的接收、發送控制部分運行于UDP 傳輸協議之上以實現PTP 報文的接收和發送,主程序模塊在應用層需要完成協議狀態機的轉化、報文計算、時鐘同步計算、幾個數據集和接收發送模塊的控制。
為了在不使用專門硬件的情況下,能夠達到最高的時間記錄精度,記錄時間戳的功能被添加在網絡接口的驅動程序中,在網絡接口的驅動程序中實現時間戳的精確添加。其中,主時鐘節點按照定義好的時間間隔將同步時間報文(Sync)和Follow-Up報文發送給網絡上所有的從時鐘節點,并且對從時鐘節點的延遲請求做出響應。同樣,從時鐘節點需要按照固定時間間隔將延遲請求報文發送給主時鐘節點并接收來自主時鐘節點的響應報文,根據該響應報文中的時間戳計算主從時鐘的時間偏移和主從時鐘節點間網絡傳輸延遲,并根據時間偏移和傳輸延遲更新本地時鐘。其中時間同步報文(Sync)和延遲請求報文(Delay-Request)采用組播方式發送,跟進報文(Follow -Up)和延遲相應報文(Delay -Response)采用廣播方式發送。
PTP 協議處理模塊實現的精度主要受到時間戳精度的影響,而報文時間戳的精確程度又主要是受同步算法、系統硬件等因素的影響。在與硬件特性相關的方面,網卡芯片的效率、晶振穩定程度、內存訪問速度和CPU 主頻等都會對時間戳精度造成影響。在特定的硬件平臺基礎上,時間戳獲取的位置又很大程度上影響了時間戳的準確性,時間戳可以在應用層、驅動層或者Mac 與PHY 之間獲取。通過前面的報文傳輸過程分析可以看出,時間戳的獲取越接近硬件底層, 時間戳獲取的時間誤差就越小。因此,在精確時間協議實現的時候,時間戳的標記應該做到盡量接近硬件底層。
本文通過添加Linux 操作系統的網絡驅動層函數的方法來獲取和添加時間戳。在同步報文發送的出口幀交給MAC 控制器的時刻加上出口時間戳并保存起來,在同步報文接收的入口幀到達網絡接口中斷服務子程序的入口處加上時間戳并保存起來。

圖4 以太網幀結構Fig.4 Ethernet frame structure
以太網幀的典型結構如圖4 所示,包括源地址、目的地址、類型、數據、校驗碼和前導碼。以太網幀是OSI 參考模型數據鏈路層的封裝,網絡層的數據包加上以太網幀頭和幀尾,構成可由數據鏈路層識別的數據幀。因此可以在收到本機網絡層傳遞過來的數據后,在網絡數據報頭部加上時間戳的標記,在收到對方的以太網幀的時候,獲取對方發送的時間戳參數。接收和發送時間戳任務的實現主要通過add-stamp 和get-stamp 這兩個函數完成。add-stamp為添加時間戳的函數,用于在發送同步報文的時候添加時間戳;add-stamp 的關鍵實現部分如下所示:
a=get-utime();
add-to-frame(time-t a,frame);
其中,get-utime 函數用于從系統中獲得以μs 為單位的時間,add-to-frame 函數將獲得的時間參數以時間戳的方式添加到以太網幀中。
get-stamp 為獲取時間戳的函數,在網絡驅動層接收到同步報文的時候,用于從同步報文中獲取對方發來的時間戳。其關鍵實現的函數為utimefrom-frame,該函數用于將從收到的以太網幀中獲得的時間參數提取出來。
實際的測試表明,通過在網絡驅動層添加時間戳的方法能夠達到10 μs量級的同步精度。
本文從IEEE 1588 協議出發,在嵌入式Linux 操作系統中,對時鐘同步協議進行詳細分析,設計實現了最佳時鐘選擇算法和PTP 協議處理模塊,并對如何在網絡驅動層添加時間戳進行了介紹。實驗結果表明,通過該方法能夠達到10 μs量級的同步精度,較好地實現了時鐘同步的效果。
[1] 王曉冬, 闞德濤, 張志武.以太網的時鐘同步技術[ J] .電子工程師,2008,34(9):47-50.
WANG Xiao -dong, KAN De -tao, ZHANG Zhi-wu.Clock synchronization technology for ethernet[ J] .Electronics Engineer, 2008, 34(9):47-50.(in Chinese)
[2] 魯駿, 張向利,范曉峰.嵌入式Linux 下時鐘同步系統的分析與實現[ J] .儀表技術與傳感器,2009(3):64-66.
LU Jun, ZHANG Xiang-li, FAN Xiao-feng.Analysis and realize of clock synchronization under embedded Linux[J] .Instrument Technology and Sensor,2009(3):64-66.(in Chinese)
[3] IEEE 1588-2002, IEEE standard for a precision clock synchronization protocol for networked measurement and control systems[S] .
[4] 李聰,高麗.基于IEEE 1588 的時鐘同步技術在分布式系統中的應用[J] .電子設計工程,2009,17(12):54-56.
LI Cong, GAO Li.Application of time synchronization technology based on IEEE1588 in distributed system[J] .Electronic Design Engineering,2009,17(12)54-56.(in Chinese)
[5] 戴寶峰, 崔少輝, 常健.IEEE 1588 最佳主時鐘算法的分析與實現[ J] .儀表技術,2008(2):29-31.
DAI Bao-feng, CUI Shao-hui, CHANG Jian.Analysis and realize of IEEE 1588 best main clock algorithm[ J] .Instrument Technology, 2008(2):29-31.(in Chinese)