摘 要: 目前對(duì)裝備檢測(cè)設(shè)備的實(shí)時(shí)性、可視化的要求越來(lái)越高,。嵌入式技術(shù)的應(yīng)用,,使檢測(cè)裝置變得可靠、實(shí)用和便攜,。本文在OMAPL138嵌入式結(jié)構(gòu)和Linux系統(tǒng)下,,應(yīng)用QTouch組態(tài)軟件進(jìn)行檢測(cè)設(shè)備人機(jī)交互界面的開(kāi)發(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)行或使用過(guò)程中涉及到的信號(hào)也越來(lái)越多,,對(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)行部分,。兩者通過(guò)協(xié)議進(jìn)行平臺(tái)間通信,,在PC端設(shè)計(jì)完成的應(yīng)用程序通過(guò)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ù)由操作人員通過(guò)手動(dòng)輸入的方式給定,,并通過(guò)應(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)用程序通過(guò)實(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ù)通過(guò)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ī)交互程序通過(guò)調(diào)用驅(qū)動(dòng)程序來(lái)讀取這些設(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)過(guò)注冊(cè),,主設(shè)備號(hào)就和具體的file_operations結(jié)構(gòu)聯(lián)系起來(lái)了,,因此操作主設(shè)備號(hào)為FPGA_MAJOR的設(shè)備文件時(shí),就會(huì)調(diào)用arm_fpga_fops中的相關(guān)函數(shù),。
驅(qū)動(dòng)程序通過(guò)操作設(shè)備文件來(lái)向硬件設(shè)備下發(fā)數(shù)據(jù),,為了解決設(shè)備文件的讀取和寫入問(wèn)題,,在軟件設(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ī)交互界面過(guò)程中,不需要編寫復(fù)雜的實(shí)現(xiàn)代碼,,只需要將功能控件用類似于搭積木的方式構(gòu)建在一起,,由軟件庫(kù)文件調(diào)用相關(guān)函數(shù)。在程序設(shè)計(jì)過(guò)程中,,不需要直接使用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ù)通過(guò)人機(jī)交互程序下發(fā)到FPGA外設(shè)中,再由FPGA進(jìn)行編碼轉(zhuǎn)換?,F(xiàn)在以十位數(shù)為例,,對(duì)得到的波形圖進(jìn)行分析,如圖7所示,。由實(shí)驗(yàn)波形圖得到十位上的Hamming碼為0011101,。通過(guò)查詢Hamming碼編碼矩陣,得到Hamming碼0011101對(duì)應(yīng)數(shù)字3,,可見(jiàn)實(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ì)了友好的交互界面,,并通過(guò)數(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)開(kāi)發(fā)詳解(第2版)[M].北京:人民郵電出版社,,2010.
[3] 倪繼利.Qt及Linux操作系統(tǒng)窗口設(shè)計(jì)[M].北京:電子工業(yè)出版社,,2006.
[4] 韋東山.嵌入式Linux應(yīng)用開(kāi)發(fā)完全手冊(cè)[M].北京:人民郵電出版社,,2008.