在工控行業(yè)很多領(lǐng)域中,需要控制系統(tǒng)具有高精度的時間同步功能,IRIG就是美國靶場司令委員會制定的一種時間標(biāo)準(zhǔn),英創(chuàng)在EM928x系列的Linux工控主板上實(shí)現(xiàn)了IRIG-B碼校時功能。
IRIG是美國靶場司令委員會制定的一種時間標(biāo)準(zhǔn),其中的串行時鐘編碼共有6種格式,即A、B、D、E、G、H。它們的主要差別是時間碼的幀速率不同,廣泛應(yīng)用的IRIG-B即其中的B型編碼,B型碼的時幀速率為1幀/s,可傳遞100位信息。圖1是IGIG-B碼示意圖,其時幀周期是1s,每秒100個碼元,使用脈寬編碼方式,每個碼元脈寬10ms,共三種碼元,其中高電平5ms和2ms分別表示二進(jìn)制 “1”,“0”,高電平8ms為位置標(biāo)識,分別為P0,P1,…P9。連續(xù)兩個8ms寬度脈沖的第二個8ms脈沖的前沿為秒準(zhǔn)點(diǎn)標(biāo)志,也是一個時間格式的幀參考標(biāo)志。一個時間格式幀包含了秒,時,分,天數(shù),年份,控制位等豐富的信息。
IRIG-B碼標(biāo)準(zhǔn)
首先在硬件連接上,我們使用GPIO23復(fù)用為接收IRIG-B碼脈沖信號的管腳,所以只需要將時鐘源發(fā)出的IRIG-B碼脈沖接到GPIO23,需要注意的是,GPIO管腳的輸入電壓不能超過3.3V,否則會引起CPU的異常或是損壞。如果時鐘源發(fā)出的脈沖為5V,就需要將電平轉(zhuǎn)換為3.3V才可以接入。硬件連接好后,我們來看看應(yīng)用程序的實(shí)現(xiàn)方法:
首先需要打開IRIG-B這個設(shè)備節(jié)點(diǎn):
fd = open("/dev/irig-b", O_RDWR);
if(fd < 0)
printf("open faile\n");
接下來使用標(biāo)準(zhǔn)的調(diào)用接口read和write就可以獲取和設(shè)置時間了,程序中使用了struct tm這個結(jié)構(gòu)體來進(jìn)行獲取時間的信息傳遞:
structtm
{
inttm_sec; /* 秒. [0-60] (1 leap second) */
inttm_min; /* 分. [0-59] */
inttm_hour; /* 時. [0-23] */
inttm_mday; /* 日. [1-31] */
inttm_mon; /* 月. [0-11] */
inttm_year; /* 年 - 1900. */
inttm_wday; /* 一周中的第幾天. [0-6] */
inttm_yday; /* 一年中的第幾天.[0-365] */
inttm_isdst; /* 時令. [-1/0/1]*/
#ifdef __USE_BSD
longinttm_gmtoff;
__constchar*tm_zone; /* 時區(qū) */
#else
longint__tm_gmtoff;
__constchar*__tm_zone;
#endif
};
因?yàn)槭侵苯訌臅r鐘源中獲取的時間,所以我們只需要關(guān)注tm結(jié)構(gòu)體中的年月日時分秒這六個成員。接下來我們進(jìn)行讀取時間的操作:
struct tm t;
ret = read(fd, &t,sizeof(struct tm));
if(ret < 0)
printf("read failed!\n");
printf("time:%d-%d-%d %d:%d:%d\n",t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
讀取時間是通過阻塞的方式實(shí)現(xiàn)的,板卡會等到一次完整的時間脈沖信息才會返回本次時間,如果沒有獲取到完整的信息,會在5秒后返回系統(tǒng)時間并且打印提示信息。
為了方便客戶將時鐘源提供的時間設(shè)置到板卡中,英創(chuàng)公司提供了專用接口在驅(qū)動中獲取時間并寫入到系統(tǒng)或是RTC中,即write()函數(shù),當(dāng)調(diào)用write時,板卡會阻塞等待從時鐘源獲取一次完整的時間信息,然后根據(jù)寫入的參數(shù),將時間直接設(shè)置到系統(tǒng)中或者RTC中:
#defineSET_SYSTIME 0
#defineSET_RTCTIME 1
i1 = SET_SYSTIME;
ret = write(fd, &i1,sizeof(int));
if(ret < 0)
printf("write failed!\n");
i1 = SET_RTCTIME;
ret = write(fd, &i1,sizeof(int));
if(ret < 0)
printf("write failed!\n");
按照上面的例子調(diào)用write就可以將從時鐘源獲取的時間寫入到板卡中,當(dāng)輸入的數(shù)據(jù)為0時,驅(qū)動會阻塞等待一次完整的時間信息,獲得時間后將時間設(shè)置到系統(tǒng)中,阻塞等待的時間同樣為5s,否則返回不能獲取時間的信息。
如果輸入的數(shù)據(jù)為1時,驅(qū)動會同樣阻塞等待一次完整的時間信息,獲得時間后將時間同時設(shè)置到硬件實(shí)時時鐘和系統(tǒng)中,阻塞等待的時間同樣為5s,否則返回不能獲取時間的信息。
傳統(tǒng)的工控板卡在對IRIG-B碼處理時,通常需要增加額外的硬件(如單片機(jī),FPGA)對B碼進(jìn)行解碼,然后再通過串口、總線或其它形式將數(shù)據(jù)交給主控板卡處理,增加了系統(tǒng)成本和操作難度,英創(chuàng)Linux工控主板EM928x系列可直接對B碼進(jìn)行解碼,不需要增加任何硬件就能實(shí)現(xiàn)毫秒級精度的時間同步,大大降低了系統(tǒng)復(fù)雜程度,節(jié)約了成本,提高了系統(tǒng)穩(wěn)定性。
-
Linux
+關(guān)注
關(guān)注
87文章
11456瀏覽量
212760 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6096瀏覽量
36137
發(fā)布評論請先 登錄
信創(chuàng)浪潮下,國產(chǎn)主板有什么新的發(fā)展機(jī)遇?

GPS衛(wèi)星同步時鐘設(shè)備采用全模塊化結(jié)構(gòu)

必看!基于復(fù)旦微FMQL20S400M國產(chǎn)平臺的B碼對時,破解電力授時難題

評論