摘 要: 目前對(duì)裝備檢測(cè)設(shè)備的實(shí)時(shí)性,、可視化的要求越來越高,。嵌入式技術(shù)的應(yīng)用,使檢測(cè)裝置變得可靠,、實(shí)用和便攜,。本文在OMAPL138嵌入式結(jié)構(gòu)和Linux系統(tǒng)下,應(yīng)用QTouch組態(tài)軟件進(jìn)行檢測(cè)設(shè)備人機(jī)交互界面的開發(fā),。重點(diǎn)設(shè)計(jì)和分析Linux系統(tǒng)下與FPGA模塊的數(shù)據(jù)交互機(jī)制,,從而滿足實(shí)時(shí)信息通信和檢測(cè)的人機(jī)交互需求。
關(guān)鍵詞: QTouch,;人機(jī)交互,;嵌入式Linux;ARM+FPGA,;數(shù)據(jù)交換
0 引言
由于目前裝備日趨信息化,、智能化,裝備運(yùn)行或使用過程中涉及到的信號(hào)也越來越多,,對(duì)于這些信號(hào)的采集和分析,,有助于裝備使用者了解裝備的狀態(tài),及時(shí)維修維護(hù),,防患于未然,。為了能更好更準(zhǔn)確地檢測(cè)出裝備的一些關(guān)鍵信號(hào),對(duì)檢測(cè)設(shè)備提出了更高要求,,既需要有超高的精度也需要有便捷友好的操作界面,。以便于操作人員迅速上手,簡(jiǎn)化操作訓(xùn)練,。本文根據(jù)實(shí)際設(shè)備人機(jī)交互的設(shè)計(jì)需求,,結(jié)合硬件設(shè)備和QTouch組態(tài)軟件設(shè)計(jì)了與FPGA硬件設(shè)備的數(shù)據(jù)交換機(jī)制,實(shí)現(xiàn)的人機(jī)交互界面直觀,、信息量大,、便于操作。
1人機(jī)界面設(shè)計(jì)原理
QTouch軟件主要分為兩個(gè)重要的組成部分,,一是PC端的軟件設(shè)計(jì)部分,,二是嵌入式平臺(tái)的運(yùn)行部分,。兩者通過協(xié)議進(jìn)行平臺(tái)間通信,在PC端設(shè)計(jì)完成的應(yīng)用程序通過ModbusTCP協(xié)議上傳到嵌入式平臺(tái)部分,,上傳完成后脫離PC端,,在嵌入式平臺(tái)上獨(dú)立運(yùn)行。其整體框架結(jié)構(gòu)如圖1所示,。
軟件結(jié)構(gòu)分為三層,,分別是人機(jī)交互界面、數(shù)據(jù)庫(kù)和底層設(shè)備驅(qū)動(dòng)數(shù)據(jù),。在對(duì)底層硬件進(jìn)行數(shù)據(jù)寫入時(shí),,人機(jī)交互界面數(shù)據(jù)由操作人員通過手動(dòng)輸入的方式給定,并通過應(yīng)用程序傳入程序的實(shí)時(shí)數(shù)據(jù)庫(kù),,實(shí)時(shí)數(shù)據(jù)庫(kù)接收到數(shù)據(jù)后,,驅(qū)動(dòng)程序就可以調(diào)用實(shí)時(shí)數(shù)據(jù)庫(kù)中的數(shù)據(jù),對(duì)底層硬件進(jìn)行數(shù)據(jù)寫入,。接收反饋數(shù)據(jù)時(shí),,由底層硬件檢測(cè)到數(shù)據(jù),再由驅(qū)動(dòng)程序?qū)⑵浯嫒雽?shí)時(shí)數(shù)據(jù)庫(kù),,應(yīng)用程序通過實(shí)時(shí)關(guān)聯(lián)某個(gè)數(shù)據(jù)存儲(chǔ)單元的數(shù)據(jù),,就可以實(shí)時(shí)地接收到硬件反饋的數(shù)據(jù)信息并顯示在屏幕上。數(shù)據(jù)交互原理如圖2所示,。
2 界面與FPGA的數(shù)據(jù)交換機(jī)制
2.1 數(shù)據(jù)類型
研究數(shù)據(jù)交互的機(jī)制,,首先需要確定數(shù)據(jù)的類型。當(dāng)FPGA接收到設(shè)定時(shí)間參數(shù)后,,并不能直接進(jìn)行時(shí)間設(shè)定,,因?yàn)閿?shù)據(jù)接收端接收的數(shù)據(jù)類型并不是十進(jìn)制的,所以不能將設(shè)定的時(shí)間信號(hào)直接傳遞到數(shù)據(jù)接收端,,需要進(jìn)行一定的數(shù)據(jù)編碼,。這里使用的是Hamming碼[1]進(jìn)行的數(shù)據(jù)編碼信號(hào)。
Hamming編碼矩陣如下:
FPGA設(shè)備在接收到時(shí)間參數(shù)后,,根據(jù)Hamming編碼矩陣將原始的十進(jìn)制數(shù)編碼成二進(jìn)制數(shù)碼,。重新編碼后的時(shí)間參數(shù)通過FPGA端口以電信號(hào)的形式發(fā)送到數(shù)據(jù)接收端口。數(shù)據(jù)接收端口接收到時(shí)間參數(shù)后再進(jìn)行解碼,。
2.2 數(shù)據(jù)交互機(jī)制
2.2.1 硬件設(shè)備,、操作系統(tǒng)和人機(jī)界面的關(guān)系[2-4]
嵌入式設(shè)備的設(shè)計(jì)都分為硬件設(shè)計(jì)部分和軟件設(shè)計(jì)部分。硬件設(shè)計(jì)部分使用的是目前主流的FPGA+ARM結(jié)合的硬件結(jié)構(gòu),,軟件設(shè)計(jì)部分使用Linux操作系統(tǒng),,以及使用QTouch編寫的人機(jī)交互界面,人機(jī)交互程序需要借助操作系統(tǒng)才能運(yùn)行,。Linux操作系統(tǒng)是連接硬件和人機(jī)界面的橋梁,。三者關(guān)系如圖3所示,。
2.2.2 設(shè)備驅(qū)動(dòng)[2]
設(shè)備驅(qū)動(dòng)是關(guān)聯(lián)操作系統(tǒng)和人機(jī)交互程序的橋梁。操作系統(tǒng)將輸入的數(shù)據(jù)以文件的形式寫入系統(tǒng)的特定文件中,,人機(jī)交互程序通過調(diào)用驅(qū)動(dòng)程序來讀取這些設(shè)備文件即可得到想要的數(shù)據(jù),。人機(jī)交互程序使用統(tǒng)一的接口函數(shù)調(diào)用相應(yīng)的硬件驅(qū)動(dòng)程序,這些函數(shù)都是在設(shè)備驅(qū)動(dòng)中定義好的,。這組接口被稱為系統(tǒng)調(diào)用,。對(duì)于每一個(gè)系統(tǒng)調(diào)用,驅(qū)動(dòng)程序中都有一個(gè)與之對(duì)應(yīng)的函數(shù),,這些函數(shù)集合在一個(gè)file_operations類型的數(shù)據(jù)結(jié)構(gòu)體中,,file_operations結(jié)構(gòu)體在Linux內(nèi)核的include/linux/fs.h中定義,。
使用file_operations結(jié)構(gòu)定義數(shù)據(jù)結(jié)構(gòu)的程序代碼如下:
Staticstructfile_operationsarm_fpga_fops={
.owner=THIS_MODULE,,
.open=arm_fpga_open,
.write=arm_fpga_write,,
.read=arm_fpga_read,,
.ioctl=arm_fpga_ioctl,},;
將FPGA字符設(shè)備和arm_fpga_fops結(jié)構(gòu)體進(jìn)行關(guān)聯(lián),。關(guān)聯(lián)程序的代碼設(shè)計(jì)如下:
ret=register_chrdev(FPGA_MAJOR,DEVICE_NAME,,&arm_ fpga_fops),;
if(ret<0)
{
prink(DEVICE_NAME”can′t register major number\n”);
return ret,;}
程序頭文件中定義FPGA_MAJOR為FPGA設(shè)備的主設(shè)備號(hào),,程序主函數(shù)中設(shè)置FPGA_MAJOR=0,由系統(tǒng)自動(dòng)分配主設(shè)備號(hào),。DEVICE_NAME定義為設(shè)備名稱,。經(jīng)過注冊(cè),主設(shè)備號(hào)就和具體的file_operations結(jié)構(gòu)聯(lián)系起來了,,因此操作主設(shè)備號(hào)為FPGA_MAJOR的設(shè)備文件時(shí),,就會(huì)調(diào)用arm_fpga_fops中的相關(guān)函數(shù)。
驅(qū)動(dòng)程序通過操作設(shè)備文件來向硬件設(shè)備下發(fā)數(shù)據(jù),,為了解決設(shè)備文件的讀取和寫入問題,,在軟件設(shè)計(jì)中借助Linux操作系統(tǒng)中提供的兩個(gè)重要函數(shù):copy_to_user和copy_form_user。這是兩個(gè)很重要也是經(jīng)常被字符設(shè)備使用到的函數(shù),。它們定義在Linux系統(tǒng)內(nèi)核的~/arch/arm/lib/usercopy.c文件中,。定義形式如下:
unsigned long copy_to_user(void_user*to,const void*from,,unsigned long n)
{
might_sleep(),;
BUG_ON((long)n<0),;
If(access_ok(VERIFY_WRITE,to,,n))
n=_copy_to_user(to,,from,n),;
return n,;}
unsigned long copy_from_user(void_user*to,const void*from,,unsigned long n)
{
If(access_ok(VERIFY_WRITE,,from,n))
n=_copy_from_user(to,,from,,n);
else
memzero(to,,n),;
return n;}
copy_from_user()函數(shù)用于將用戶給定的參數(shù)從用戶空間到內(nèi)核空間的復(fù)制,。copy_to_user()函數(shù)完成數(shù)據(jù)從內(nèi)核空間到用戶空間的復(fù)制,。在設(shè)備驅(qū)動(dòng)中使用這兩個(gè)函數(shù),F(xiàn)PGA設(shè)備文件的數(shù)據(jù)和人機(jī)交互程序的數(shù)據(jù)之間就能進(jìn)行相互復(fù)制,,也就實(shí)現(xiàn)了兩者的數(shù)據(jù)交換,。
這樣,使用QTouch組態(tài)軟件設(shè)計(jì)人機(jī)交互界面過程中,,不需要編寫復(fù)雜的實(shí)現(xiàn)代碼,,只需要將功能控件用類似于搭積木的方式構(gòu)建在一起,由軟件庫(kù)文件調(diào)用相關(guān)函數(shù),。在程序設(shè)計(jì)過程中,,不需要直接使用file_operations結(jié)構(gòu)體中的操作函數(shù)編寫代碼。部分控件如圖4所示,。
3實(shí)驗(yàn)及數(shù)據(jù)分析
將人機(jī)交互程序?qū)懭胗布O(shè)備中,,使用設(shè)計(jì)的實(shí)際設(shè)備對(duì)數(shù)據(jù)交互進(jìn)行系統(tǒng)調(diào)試,驗(yàn)證程序的正確性,。圖5為系統(tǒng)調(diào)試圖,。
由于時(shí)間參數(shù)的接收采用Hamming譯碼,數(shù)據(jù)進(jìn)入FPGA以后會(huì)對(duì)時(shí)間裝定參數(shù)進(jìn)行信號(hào)編碼,。所以以下波形圖測(cè)得數(shù)據(jù)是以Hamming碼的形式顯示的,。
假設(shè)設(shè)定數(shù)據(jù)為33.3 s,即十位、個(gè)位,、十分位都為3(二進(jìn)制0011),。時(shí)間設(shè)定界面如圖6所示。
實(shí)驗(yàn)設(shè)定的時(shí)間數(shù)據(jù)通過人機(jī)交互程序下發(fā)到FPGA外設(shè)中,,再由FPGA進(jìn)行編碼轉(zhuǎn)換?,F(xiàn)在以十位數(shù)為例,對(duì)得到的波形圖進(jìn)行分析,,如圖7所示,。由實(shí)驗(yàn)波形圖得到十位上的Hamming碼為0011101。通過查詢Hamming碼編碼矩陣,,得到Hamming碼0011101對(duì)應(yīng)數(shù)字3,,可見實(shí)驗(yàn)測(cè)得的數(shù)據(jù)與編碼矩陣數(shù)據(jù)完全吻合。用同樣的方法對(duì)個(gè)位和十分位進(jìn)行分析,,Hamming碼解碼得到的時(shí)間參數(shù)與人機(jī)交互程序設(shè)定的時(shí)間參數(shù)完全一致(都是33.3 s),,因此可以判斷參數(shù)交互準(zhǔn)確,程序設(shè)計(jì)達(dá)到預(yù)期目標(biāo),。
高電平載波信號(hào)實(shí)驗(yàn)誤差分析如圖8所示,。顯示的都是高電平調(diào)制的載波信號(hào),該信號(hào)理論波形為正弦波,,但是在本次實(shí)驗(yàn)中由于設(shè)備精度的限制,在測(cè)量顯示時(shí)將載波信號(hào)的方波顯示為正弦波形,,但是這樣的誤差在實(shí)驗(yàn)的可允許范圍之內(nèi),,因此不會(huì)對(duì)實(shí)驗(yàn)的最終結(jié)論產(chǎn)生影響。
4 結(jié)束語(yǔ)
本文基于QTouch的組態(tài)軟件設(shè)計(jì)的應(yīng)用程序,,實(shí)現(xiàn)了與ARM+FPGA嵌入式系統(tǒng)底層硬件平臺(tái)的數(shù)據(jù)交換,,設(shè)計(jì)了友好的交互界面,并通過數(shù)據(jù)交換實(shí)驗(yàn),,檢測(cè)驗(yàn)證了數(shù)據(jù)交換機(jī)制的有效性,,滿足設(shè)備的功能要求。本設(shè)計(jì)為設(shè)計(jì)功能更強(qiáng)更復(fù)雜的嵌入式設(shè)備打下了良好的理論和實(shí)驗(yàn)基礎(chǔ),。
參考文獻(xiàn)
[1] 雷斌,,王寧,仇平.FPGA的漢明碼數(shù)據(jù)傳輸系統(tǒng)的設(shè)計(jì)[J].西安工業(yè)大學(xué)學(xué)報(bào),,2009,,29(6):559-564.
[2] 宋寶華.Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解(第2版)[M].北京:人民郵電出版社,2010.
[3] 倪繼利.Qt及Linux操作系統(tǒng)窗口設(shè)計(jì)[M].北京:電子工業(yè)出版社,,2006.
[4] 韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊(cè)[M].北京:人民郵電出版社,,2008.