• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            旅途

            如果想飛得高,就該把地平線忘掉

            用QtE實現(xiàn)SBC一241OX上的LED控制

            源:單片機及嵌入式系統(tǒng)應(yīng)用? 作者:西安交通大學(xué) 宋飛 趙廣社
             
            摘 要:QtE(Qt/Embedded)是挪威Trolltech公司專門為嵌入式系統(tǒng)設(shè)計的圖形用戶界面(GUI)的一個工具包。本文通過QtE編程,完 成對基于ARM9的SBC-2410X開發(fā)板上LED的控制,并詳細(xì)說明從程序設(shè)計、移植到運行的過程。程序能很好的運行在開發(fā)板上,驗證了程序的有效性 和可靠性。結(jié)果說明用QtE開發(fā)的應(yīng)用程序界面清晰美觀,操作簡單方便。

            關(guān)鍵詞:QtE ARM9 GUI SBC-2410X


            引言


            近 年來,由于ARM(Advanced RISC Machines)在性能、功耗、成本和體積上的優(yōu)勢,使得它在嵌入式系統(tǒng)中的發(fā)展如日中天,它在工業(yè)控制、航空航天、軍事領(lǐng)域、消費電子、智能家電和視 頻監(jiān)控等方面都發(fā)揮了重大的作用。很多人都迫切地想學(xué)習(xí)ARM,以筆者的經(jīng)驗,從最基本的LED控制學(xué)起,是一個不錯的選擇。


            如 果不熟悉Linux,可能對QtE的概念知之甚少,它是挪威Trolltech公司為各種系統(tǒng)設(shè)計的圖形用戶界面工具包,采用c++語言編程。QtE的優(yōu) 點有:跨平臺,可以方便的連接數(shù)據(jù)庫,可以將程序與Java集成等。其實,QtE在一些高端的移動手持設(shè)備中早已深入人心,Troll—tech公司在 QtE的基礎(chǔ)上開發(fā)了一個應(yīng)用環(huán)境Qtopia,目前已有很多公司采用Qtopia來開發(fā)他們的主流PDA。當(dāng)然,Qt也有它的缺點,既不能提供IDE (集成開發(fā)環(huán)境),但這個缺點在強大的Linux下顯得微不足道。使用gcc/g++,加上Qt的開發(fā)工具:Qt Designer,tmake/qmake,UIC等,開發(fā)可視化程序?qū)⒆兊檬秩菀住?/p>

            要學(xué)習(xí)ARM,選擇一款好的開發(fā)板是必不 可少的。SBC一2410X是廣州友善之臂公司設(shè)計的一款基于ARM9的開發(fā)板,操作系統(tǒng)是韓國的mizi-linux。SBC-2410X不同于 uClinux,它的接口豐富,且支持MMU、QtE2.3.7,同時提供了控制LED的命令行方式。


            1 系統(tǒng)需求


            ◇完全安裝RedHat9.0。
            ◇在Linux下建立QtE編譯環(huán)境。
            ◇開發(fā)板上已經(jīng)加載LED設(shè)備驅(qū)動程序。


            注意:你所建立的QtE版本必須與開發(fā)板所支持的版本一致。


            2 程序設(shè)計


            在Linux 下,用系統(tǒng)自帶的Qt Designer來編寫程序。Qt Designer是一個優(yōu)秀的可視化開發(fā)工具,用它來設(shè)計十分容易。它的界面類似于Delphi,但使用C++語言編寫應(yīng)用程序。Qt程序設(shè)計里的一個亮 點就是SignaI-_Slot機制,它有點類似于VC++里的消息機制。當(dāng)一個組件發(fā)出Signal時,其他一個組件或多個組件可以通過Slot接收發(fā) 來的SignaI,組件本身也可以接收自己的Signal,這樣處理一個事件將變得非常容易。Qt Designer的優(yōu)點不僅在于它可以十分方便的設(shè)計圖形用戶界面,還表現(xiàn)在可以用連接工具很容易的把Signals和Slots連接起來。用戶自己設(shè)計 的程序添加在**.ui.h中。


            打開Qt Deslgner,選擇File/new C++Project,命名為led.pro并保存。接著選擇File/new-Dialog,并在此設(shè)計自己的用戶界面。最后選擇File/new C++Main—File,系統(tǒng)自動生成一個main.cpp文件。圖形用戶界面如圖1所示,Initlalize按鈕主要完成LED設(shè)備的打開,定時器 的關(guān)閉和其他一些初始化工作;Begim按鈕則針對LED Display Mode的開始;Exit按鈕為退出應(yīng)用程序。左面的組合框包括4個RadioButton,對應(yīng)4個LED的亮或滅;右面的組合框包括6個 RadioButton(對應(yīng)不同的閃爍模式和閃爍快慢)和1個LCDNumber(用來顯示閃爍的時間間隔)。本程序建立的Signal—S1ot連接 有許多,下面對幾個重要的連接和函數(shù)進行說明。



            (1)connect(initPushButton.SIGNAL(clicked()),this.SLOT(initial()))


            當(dāng)Initialize 按鈕按下時,LedForm對話框接收此信號,并執(zhí)行initial()函數(shù)。Linux操作系統(tǒng)把所有的設(shè)備都看成文件,因此對設(shè)備的操作控制可以通過 open()、ioctl()等函數(shù)實現(xiàn)。在initial()函數(shù)中就是調(diào)用了open()函數(shù)來打開LED設(shè)備的。


            (2)connect(okPushButton,SIGNAL(clicked()),this,SLOT(modeSel()))


            當(dāng)Begin 按鈕按下時,LedForm對話框接收此信號,并執(zhí)行modeSel()函數(shù)。在modeSel()函數(shù)中開啟定時器,并創(chuàng)建另外一個連接用來循環(huán)顯示 LED。在命令行方式中,LED的循環(huán)顯示要用到死循環(huán),并用鍵盤中斷來控制循環(huán);而在Qt或其他可視化語言中,則要用到定時器來控制循環(huán)。


            (3)函數(shù)open()


            在中聲明,含義為打開設(shè)備文件。打開成功返回0;失敗返回一1。


            (4)函數(shù)ioctl()


            在中聲明,控制I/O端口。例如:
            Int fd=open(”/dev/leds”,0);
            ioctl(fd,0,3); //讓LED4滅


            (5)函數(shù)select()


            在中聲明,含義為經(jīng)過多長時間訪問一次設(shè)備。


            3 程序移植與運行


            要想使程序運行在開發(fā)板的Qtopia中,則必須在建立的QtE環(huán)境下編譯,并設(shè)置好環(huán)境變量。終端進入所建立的QtE目錄后,環(huán)境變量或運行環(huán)境變量和腳本設(shè)置如下:


            export QTDIR=$PWD/qt
            export QPEDlR=$PWD/qtopia
            export TMAKEDIR=$PWD/tmake
            export TMAKEPATH=$TMAKEDIR/lib/qws/linux-armg++
            export PATH=$QTDIR/bin:$QPEDIR/bin:$TMAKEDIR/
            bin:$PATH


            值得注意的一點是:用Linux自帶的Qt Designer創(chuàng)建的工程文件只適用于qmake,而筆者建立的QtE環(huán)境只能用tmake來生成makefile,因此需要修改led.pro文件,讓它適用于tmake,修改如下:


            TEMPLATE =app
            CoNFIG +=qtopia warn_on release
            SoURCES +=main.epp
            INTERFACES =led.ui
            TARGET =led


            以上的工作做完后,就可以編譯了。編譯成功后生成可執(zhí)行的二進制文件led,然而要使程序運行在開發(fā)板上的qtopia桌面上,還需要一個桌面文件led.desktop和自定義的一個圖標(biāo)led.png。桌面文件如下:


            [Desktop Entry]
            Comment=a LED Control Program
            Exee=led
            Icon=led
            Type=Application
            Name=LED Control


            然 后,把led復(fù)制到SBC-2410X下/opt/qtopia/bin目錄下,led.png復(fù)制到/opt/qtopia/pics目錄下,led. desktop復(fù)制到/0pt/qtopia/apps/Applications目錄下。最后,用ehmod a+X led改變文件led的權(quán)限,重新啟動系統(tǒng),便可看到led.png的圖標(biāo)顯示在qtopia桌面上,點擊此圖標(biāo)就可運行程序了。


            4 部分源程序及注釋


            由于源程序代碼比較長,這里就不全部列出了,僅給出重要部分的代碼及注釋,以供讀者參考。


            (1) 程序的初始化
            int fd: //LED設(shè)備文件句柄
            int type=1; //默認(rèn)方式為計數(shù)器
            double period=0.2; //默認(rèn)時間間隔
            QTimer*t=new QTimer(Q″timer″);//創(chuàng)建定時器
            void LedForm::initial(){
            fd=open(″/dev/leds″,0); //打開LED設(shè)備
            //其他一些初始化語句
            一>stop(); //關(guān)閉定時器


            (2) LED顯示方式的設(shè)置
            void LedForm::push-leds(void){
            static unsigned step;
            unsigned led—bitmap;
            inti;
            switch(type){
            case 0: //方式0:跑馬燈
            if(step>=14){step=0;}
            if(step<7){led_bitmap=1<else{led_bitmap=1<<(14一step);}
            break;
            case 1: //方式1:計數(shù)器
            if(step>255){step=0;)
            Ied_bitmap=step!
            break;
            case 2: //方式2:停止
            led_bitmap=0:
            break;
            step十十;
            for(i=0;i<8;l++){
            ioctl(fd,led_bitmap&1,i);
            led_bitmap>>=1;
            }
            }


            (3) LED設(shè)備的讀取及調(diào)用LED顯示程序
            void LedForm::ledDisplay(){
            fd_set rds;
            struct timeval step;
            FD_ZERO(&rds);
            step.tv_sec=period;
            step.tv_usec=(pefiod—step.W_sec)*1000000L;
            select(fd,&rds,NULL,NULL,&step);
            push_leds();
            }


            (4)循環(huán)顯示的實現(xiàn)
            void LedForm::modeSel(){
            t-->start(O);//啟動定時器,并立即發(fā)出Signal- timeout()
            connect(t,SIGNAL(timeout()),this.SLOT(1edDisplay()));
            }


            結(jié) 語


            隨 著通信行業(yè)的迅猛發(fā)展,移動手持設(shè)備必將成為人們工作、學(xué)習(xí)和生活的主流,用Qt設(shè)計移動手持設(shè)備的GUI有著得天獨厚的優(yōu)勢。目前,Qt應(yīng)用于全世界上 百個軟件開發(fā)項目中。在我國,Qt的發(fā)展也有星星之火可以燎原之勢。本文通過一個最基礎(chǔ)的小程序向讀者演示了怎樣使用Qt開發(fā)應(yīng)用程序,以及怎樣建立Qt 與ARM的聯(lián)系,希望對讀者學(xué)習(xí)ARM和Qt起到一定的幫助作用。

            posted on 2007-08-14 00:30 旅途 閱讀(249) 評論(0)  編輯 收藏 引用 所屬分類: Linux開發(fā)

            中文字幕乱码人妻无码久久| 久久精品国产一区二区三区日韩| 精品国产婷婷久久久| 亚洲?V乱码久久精品蜜桃 | 久久精品国产精品亚洲精品| 久久综合久久综合九色| 亚洲国产成人精品91久久久| 伊人色综合久久天天人手人婷| 成人国内精品久久久久一区| 狠狠色综合网站久久久久久久| 久久免费看黄a级毛片| 精品久久久久久无码免费| 国产精品久久午夜夜伦鲁鲁| 亚洲国产天堂久久综合| 日本精品久久久久中文字幕8| 伊人久久精品无码av一区| 国产精品成人久久久久三级午夜电影 | 色诱久久久久综合网ywww| 久久精品国产亚洲5555| 7777久久亚洲中文字幕| 亚洲av成人无码久久精品| 久久天天躁狠狠躁夜夜2020| 久久综合综合久久97色| 精品永久久福利一区二区| 久久国内免费视频| 无码任你躁久久久久久老妇App| 精品视频久久久久| 国产精品热久久毛片| 久久这里只精品国产99热| 99re久久精品国产首页2020| 99久久精品免费看国产一区二区三区 | 高清免费久久午夜精品| 久久夜色精品国产噜噜噜亚洲AV | 精品午夜久久福利大片| 国产精品99久久99久久久| 久久亚洲私人国产精品| 国色天香久久久久久久小说| 香蕉99久久国产综合精品宅男自| 无码精品久久一区二区三区| 久久午夜综合久久| 一本综合久久国产二区|