亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        如何在VxWorks下實(shí)現(xiàn)SNTP同步對時(shí)功能

        2012-12-31 00:00:00陳利葉順流

        摘要:本文闡述了在VxWorks嵌入式實(shí)時(shí)操作系統(tǒng)下如何實(shí)現(xiàn)SNTP(Simple Network Time Protocol)網(wǎng)絡(luò)時(shí)間協(xié)議的服務(wù)器端和客戶端的功能的開發(fā),關(guān)鍵點(diǎn)為服務(wù)器端獲取可靠時(shí)鐘源的鉤子函數(shù)sntpsClockHook()的編寫。

        關(guān)鍵詞:VxWorksSNTP服務(wù)器SNTP客戶端鉤子函數(shù)

        中圖分類號:TP399 文獻(xiàn)標(biāo)識碼:A 文章編號:1674-098X(2012)03(c)-0000-00

        1 前言

        SNTP是簡單網(wǎng)絡(luò)時(shí)間協(xié)議(Simple Network Time Protocol)的簡稱,是由網(wǎng)絡(luò)時(shí)間協(xié)議NTP(Network Time Protocol)簡化而來,是一種使Internet上的計(jì)算機(jī)保持時(shí)間同步的一種通信協(xié)議,可通過提供完全的機(jī)制來訪問國際標(biāo)準(zhǔn)時(shí)間,廣泛用于需要精確時(shí)間同步的場合。

        VxWorks嵌入式實(shí)時(shí)操作系統(tǒng)的網(wǎng)絡(luò)組件(network components)支持SNTP網(wǎng)絡(luò)對時(shí)協(xié)議,用戶要在該系統(tǒng)下實(shí)現(xiàn)SNTP對時(shí)功能,并不需要關(guān)心協(xié)議本身,只需把SNTP客戶端和SNTP服務(wù)器端這兩個(gè)組件分別包括進(jìn)來,再調(diào)用相應(yīng)的VxWorks API函數(shù),即可分別實(shí)現(xiàn)SNTP客戶端和服務(wù)器端的對時(shí)功能。

        2 SNTP服務(wù)器的實(shí)現(xiàn)

        SNTP 服務(wù)器端有兩種工作模式,主動模式(SNTP_ACTIVE)和被動模式(SNTP_PASSIVE),VxWorks操作系統(tǒng)啟動時(shí)會自動調(diào)用SNTP初始化函數(shù)sntpsInit( ),設(shè)置服務(wù)器的工作模式(SNTPS_MODE)、廣播時(shí)間間隔(SNTPS_INTERVAL)、目標(biāo)IP地址(SNTPS_DSTADDR)和SNTP端口號(SNTP_PORT)等。

        如果服務(wù)器工作模式選為被動模式(SNTP_PASSIVE),則服務(wù)器將等待來自客戶端的請求,并發(fā)送包含NTP時(shí)間戳的回應(yīng)幀。如果選擇主動模式(SNTP_ACTIVE),則服務(wù)器端在固定的時(shí)間間隔周期性的發(fā)送NTP時(shí)間戳信息。

        當(dāng)采用主動模式時(shí),SNTP服務(wù)器根據(jù)SNTPS_DSTADDR 和 SNTPS_INTERVAL的值來決定目標(biāo)的IP地址和廣播的時(shí)間間隔。默認(rèn)情況下,服務(wù)器每隔64秒廣播發(fā)送一次時(shí)間戳信息。SNTPS_DSTADDR 和 SNTPS_INTERVAL的值可以通過sntpsConfigSet()函數(shù)來進(jìn)行設(shè)置。SNTP服務(wù)器工作在主動模式下時(shí)仍然響應(yīng)客戶端的請求。

        SNTP服務(wù)器需要獲得一個(gè)外部可靠的時(shí)鐘源,可通過調(diào)用API函數(shù)sntpsClockSet( )來獲取,其聲明為:

        STATUS sntpsClockSet

        (

        FUNCPTRpClockHookRtn /* new interface to reference clock */

        )

        也就是說,sntpsClockSet( )通過安裝一個(gè)鉤子函數(shù)來獲取參考時(shí)鐘的值,該鉤子函數(shù)必須采用如下的接口方式:

        STATUS sntpsClockHook (int request, void *pBuffer);

        這個(gè)鉤子函數(shù)需要用戶自己編寫來獲取參考時(shí)鐘的值:如果request的值為SNTPS_ID,則pBuffer區(qū)域填寫根據(jù)RFC1769標(biāo)準(zhǔn)格式定義的32位參考標(biāo)識符;如果request的值為SNTPS_RESOULTION,則pBuffer區(qū)域填寫32位的時(shí)鐘精度;如果request的值為SNTPS_TIME,則pBuffer區(qū)域填寫64位的NTP時(shí)間戳。最后還需調(diào)用API函數(shù)sntpsNsecToFraction( )將納秒級的時(shí)間戳轉(zhuǎn)化為NTP協(xié)議格式需要的小數(shù)部分。

        sntpsClockHook()函數(shù)的正確編寫是實(shí)現(xiàn)SNTP時(shí)間服務(wù)器功能的關(guān)鍵,需要實(shí)現(xiàn)SNTPS_ID, SNTPS_RESOLUTION和SNTPS_TIME三個(gè)請求類型,客戶端決定用哪個(gè)類型進(jìn)行請求,在系統(tǒng)啟動時(shí)應(yīng)通調(diào)用API函數(shù)sntpsClockSet( )來掛接sntpsClockHook()函數(shù)。以下為sntpsClockHook函數(shù)的實(shí)現(xiàn)以及掛接方式:

        STATUS sntpsClockHook(int request, void *buffer)

        {

        struct timespec timeval;

        long value;

        ULONG *pTime;

        if (request == SNTPS_ID)

        {

        strcpy ((char *)buffer, \"pps\");

        return (OK);

        }

        if (request == SNTPS_RESOLUTION)

        {

        if (clock_getres (CLOCK_REALTIME, timeval) == -1)

        return (ERROR);

        value = timeval.tv_nsec;

        *((ULONG *)buffer) = (ULONG)value;

        }

        if (request == SNTPS_TIME)

        {

        if (clock_gettime (CLOCK_REALTIME, timeval) == -1)

        return (ERROR);

        pTime = (ULONG *)buffer;

        /* Copy number of seconds since 1900 to timestamp. */

        *pTime++ = timeval.tv_sec + SNTP_UNIX_OFFSET;

        /* Convert nanoseconds to fractional part and copy to timestamp */

        *pTime = sntpsNsecToFraction (timeval.tv_nsec);

        }

        return (OK);

        }

        STATUS sntpsConfig (void)

        {

        if (sntpsClockSet ((FUNCPTR)sntpsClockHook) != OK)

        return(ERROR);

        return(OK);

        }

        其中,clock_getres()是獲取系統(tǒng)相對時(shí)間精度的API函數(shù),clock_gettime()是獲取系統(tǒng)相對時(shí)間的API函數(shù),sntpsNsecToFraction()是將單位為納秒的時(shí)間轉(zhuǎn)換成NTP時(shí)間戳格式所需要的小數(shù)部分。

        SNTP服務(wù)器端的時(shí)間精度取決于時(shí)鐘源的時(shí)鐘精度,在此由于采用的時(shí)鐘源為操作系統(tǒng)時(shí)間,故取決于操作系統(tǒng)的時(shí)間精度。對于VxWorks嵌入式操作系統(tǒng),這個(gè)精度由硬件上時(shí)鐘芯片的精度來決定。

        3 SNTP客戶端的實(shí)現(xiàn)

        SNTP客戶端的實(shí)現(xiàn)相對要簡單一些,只需調(diào)用API函數(shù)sntpcTimeGet()即可,其函數(shù)聲明為:

        STATUS sntpcTimeGet

        (

        char *pServerAddr, /* server IP address or hostname */

        u_int timeout, /* timeout interval in ticks */

        struct timespec * pCurrTime/* storage for retrieved time value */

        )

        SNTP服務(wù)器發(fā)送的時(shí)間首先被轉(zhuǎn)化為格林尼治標(biāo)準(zhǔn)時(shí)間1970年1月1日0時(shí)0分以來所經(jīng)過的時(shí)間,再存放在該函數(shù)的參數(shù)pCurrTime指針指向的地址區(qū)域。參數(shù)pServerAddr為服務(wù)器的IP地址,如果該參數(shù)為NULL,則sntpcTimeGet()函數(shù)偵聽來自SNTP服務(wù)器以廣播模式發(fā)送的時(shí)間消息,否則,該函數(shù)向指定的服務(wù)器發(fā)送請求,并將服務(wù)器返回的時(shí)間信息提取出來,存放在pCurrTime指針指向的地址區(qū)域。如果客戶端在參數(shù)timeout規(guī)定的時(shí)間內(nèi)未接收到時(shí)間消息,則該函數(shù)返回ERROR值,否則返回OK。一般來說,SNTP服務(wù)器在廣播方式下每隔64秒到1024秒發(fā)送一次對時(shí)消息。

        以下為API函數(shù)sntpcTimeGet()的使用方法:

        struct timespec tspec;

        STATUS sntpc_status= ERROR;

        STATUS settime_status= ERROR;

        time_t li_curr_time = 0;

        sntpc_status = sntpcTimeGet(NULL, SNTP_TIMEOUT, tspec);

        if (sntpc_status != OK)

        {

        printf(\"sntpcTimeGet failed\\");

        printf(\"Returned sntpc_status: %i errno: %s\\", sntpc_status, strerror(errno));

        }

        else

        {

        /*Set clock to received date and time*/

        settime_status = clock_settime(CLOCK_REALTIME, tspec);

        if (settime_status != OK)

        {

        printf(\"clock_settime failed\\");

        printf(\"Returned settime_status: %i errno: %s\\", settime_status, strerror(errno));

        }

        else

        {

        printf(\"Successfull set the system clock.\\");

        }

        }

        其中,clock_settime()為設(shè)置VxWorks系統(tǒng)時(shí)間的API函數(shù)。

        4 結(jié)語

        本文從客戶端和服務(wù)器端兩方面詳細(xì)介紹了在嵌入式實(shí)時(shí)操作系統(tǒng)VxWorks下如何實(shí)現(xiàn)SNTP同步對時(shí)功能,著重闡述了服務(wù)器端獲取可靠時(shí)鐘源的鉤子函數(shù)sntpsClockHook()的編寫方法,供大家參考。總的來說,用戶通過調(diào)用VxWorks系統(tǒng)提供的API函數(shù),即可輕松實(shí)現(xiàn)VxWorks下的SNTP對時(shí),避免直接編寫相對比較繁瑣的SNTP協(xié)議。

        參考文獻(xiàn)

        [1] VxWorks API Reference: OS Libraries.

        [2] 張揚(yáng),于銀濤,VxWorks 內(nèi)核、設(shè)備驅(qū)動與BSP開發(fā)詳解,人民郵電出版社,2009.

        国产无遮挡a片又黄又爽| 91日韩东京热中文字幕| av无码电影一区二区三区| aaa级久久久精品无码片| 日韩中文在线视频| 蜜桃精品国产一区二区三区| 一区二区三区视频在线观看| 亚洲av永久无码精品放毛片| 国产精品久久国产精麻豆99网站| 在线无码免费看黄网站| 中文字幕乱码亚洲在线| 亚洲日韩av无码一区二区三区人| 中文字幕无码精品亚洲资源网久久| 国产欧美亚洲精品第二区首页| 亚洲一区二区三区在线视频| 无码人妻aⅴ一区二区三区| 欧美日韩久久久精品a片| 久久久久无码中文字幕| 国产激情视频在线观看大全| 视频一区视频二区亚洲| 亚洲六月丁香色婷婷综合久久| 台湾佬中文偷拍亚洲综合| 国产国语按摩对白av在线观看| 国产精品v片在线观看不卡| 视频一区欧美| 熟妇人妻丰满少妇一区| 国产av无码专区亚洲av男同| 人人人妻人人澡人人爽欧美一区| 中文字幕精品久久久久人妻红杏1 丰满人妻妇伦又伦精品国产 | 日韩狼人精品在线观看| 亚洲一区二区三区免费av| 国语自产精品视频在线看| 亚洲精品综合一区二区三| 久久精品国产亚洲AV香蕉吃奶| 一区二区中文字幕在线观看污污| 国产精品无码无在线观看| 日韩少妇激情一区二区| 成人无码网www在线观看| 国产亚洲精品成人av在线| 男女做那个视频网站国产| 欧美日韩国产精品自在自线|