各開發(fā)板指導書博創(chuàng)2410實驗參考書_第1頁
各開發(fā)板指導書博創(chuàng)2410實驗參考書_第2頁
各開發(fā)板指導書博創(chuàng)2410實驗參考書_第3頁
各開發(fā)板指導書博創(chuàng)2410實驗參考書_第4頁
各開發(fā)板指導書博創(chuàng)2410實驗參考書_第5頁
已閱讀5頁,還剩276頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

第一章嵌入式LINUX開發(fā)基礎知 第二章基礎實 第四章內(nèi)核實 第六章附 PC時代的到來,嵌入式系統(tǒng)技術已經(jīng)成為了一個萬眾矚目的焦點。目前已廣WindowsCE等嵌入式操作系統(tǒng)引領下,也出現(xiàn)了空前繁榮的局面,但這些操作系統(tǒng)的微型Linux腕表、手持設備(PDA和蜂窩 )、因特網(wǎng)裝置、客戶機、、工業(yè)機 基礎設施設備,甚至還包括了基于集群的超級計算機。Linux在高端服務器的LinuxLinuxMIPS、PPCLinux、ARM-Linux(ARMLinux)Linux上運行Linux的計劃。以及Unix組織中有益的元素。LinuxLinuxPCLinux系統(tǒng)的人來說,需要大量令行參數(shù)卻是一個缺點。隨著LINUX社團的不斷努力,linux的人機界面開發(fā)環(huán)境正在不斷完善。LinuxPCLinux1MBLinux占用其中很小一部分內(nèi)存,包括虛擬內(nèi)存和所有的操作系統(tǒng)功能在內(nèi),只需占用系統(tǒng)100K500KLinux統(tǒng)就可以在一臺8位總線(SX)的In386微處理器上運行的很好了。由于內(nèi)存要求常常是需要的應用所決定的,比如Web服務器或者SNMP,Linux系統(tǒng)甚至可以僅使256KBROM512KBRAM(RTOS統(tǒng)的另外一個好處是Linux開發(fā)團體看來會比RTOS的供應商更快地支持新的IP協(xié)議現(xiàn)成的程序和驅(qū)動程序,它們可以用于公共外設和應用。LinuxLinux用于嵌入式的因特網(wǎng)設備也是很合適的,原因是它支持多處理器系統(tǒng),該特性使LinuxLinuxLinuxLinux結(jié)構(gòu),由博創(chuàng)科技開發(fā)的UP-NetARM3000和UP-NetARM2410開發(fā)板。中的針對有MMU和無MMU的不同開發(fā)過程。UP-NetARM3000及相關產(chǎn)品的資料可以博創(chuàng)公司的獲得。本書以 etARM2410開發(fā)板為例,詳細介紹嵌入式SAMSUNG64MLCD(可選觸摸屏(可選USB1HOST1240PinIDE硬盤接口,CF(IDE模式)2片IICCANMCP2510TJA1050內(nèi)部1.8V,器3.3V,外部IO3.3V,16KB數(shù)據(jù)CACH,16KB指令內(nèi)置外部器控制器(SDRAM控制和選擇邏輯TFT三個通用異步串行端口(IrDA1.0,16-ByteTxFIFOand16-ByteRxFIFO),2SPI;2USBHOSTUSBDEVICE(VER1.1;15.16.內(nèi)置(cacheARM920TCPUARM內(nèi)部先進的位控制器總線(AMBA2.0AHB/APB).2S3c2410X全部安裝,通過網(wǎng)絡相應的GCC交叉編譯器進行安裝(比如arm-linux-gcc、gcc配置開發(fā)主機。配置11520081,無奇WINDOWS軟件配置NFS網(wǎng)絡文件系統(tǒng),需要關閉,簡化嵌入式網(wǎng)絡調(diào)試環(huán)境設置過程。BLOB、VIVI、LILO、ARM-BOOT、RED-BOOT等,根據(jù)自己具體進行移植修改。有些UCLINUX這樣的系統(tǒng)好像只能編譯進內(nèi)核進行調(diào)試。 需要使用mkcramfs、genromfs等工具產(chǎn)生燒寫映象文件。3、直接安裝LINUXREDHAT9,它已經(jīng)支持中文,并且包含了絕大Linuxnative(HOST)開發(fā)、調(diào)試,本機可執(zhí)行文件到目標機上運行。調(diào)試時的方法很多,可以使用串口,以太網(wǎng)口等,具體一般不相同,宿主機為In處理器,而目標板如UP-NetARM2410開發(fā)板為三星內(nèi)存:大于128M,推薦256M;約為800M。 mount/dev/cdrommount–tiso9660/dev/hdb注意:安注意:安裝完成后看一下主編譯器Armv4l-unknown-linux- 是否變量為PATH=$PATH:$HOME/bin:/opt/host/armv4l/bin/,存盤后執(zhí)行:的局域網(wǎng)環(huán)境使用此開發(fā)設備,IP地址可以根據(jù)具體情況設置。如圖1.4.1所示:.21.4.3它網(wǎng)絡設備根本無法它,即無法用NFSmount它,許多網(wǎng)絡功能都將無法使用。因此網(wǎng)絡安裝完畢后,應立即關閉。操作如下:點擊紅帽子開始菜單,選擇安全級別設置,選中無。如圖1.4.4所示:1.4.4確保nfs選項選中。>NFS, 在主機(Hosts):中填入允許進行連接的主機IP地址。并選擇允許客戶對共享 為只讀(Read-only)或讀寫(Read/write)。如圖1.4.5所示:1.4.5NFS圖1.4.6NFS用戶設成NFS配置。配置好后,界面應顯示如圖1.4.7所示:圖1.4.7根用戶當作本地根用/arm2410dev1.4.8NFS共享/arm2410dev 算機,可以和寫入。mount0:/arm2410devmount0:/arm2410dev mount,NFS 1.4.9若沒有啟動Xwindow則在命令行提示符后直接輸入 圖 進入主配置界面(見圖1.4.10。.111.4.12:A————SerialDevice:/dev/ttyS0 F,ENOPC21做監(jiān)控,改為:/dev/ttyS1即可。選好后按ESC鍵退出到圖1.4.11所示畫面,選擇Savesetupasdf1保存退出,以后只要 配置完成后,用串口線連接好pc機和2410開發(fā)板,啟動2410開發(fā)板,即可在 1.4.12 1.4.1/arm2410dev名arm2410linux MOUNTU 1.4.2學 學軟件:PC機操作系統(tǒng)REDHATLINUX9.0+ +ARM-LINUX開發(fā)環(huán)境[root@zxt ]# [root@zxt ]# Kdevelope、anjutavc6.0windows{ oworld}我們可以是用下面令來編寫o.c的源代碼,進入o使用vi命令來編輯代用命令“:wq”保存并退出。這樣我們便在當前下建立了一個名為o.c的文件。用到的Makefile文件。EXEC= OBJS= CFLAGS+=LDFLAGS+=all:$(EXEC):$(CC)$(LDFLAGS)-o$@-rm-f$(EXEC)*.elf*.gdbCC clean o]#vi o]#make o]#在上面的步驟完成后,我們就可以在o o]#make o]# [root@zxt[/mnt/yaffs]mount[root@zxt[/mnt/yaffs]mount-tnfs-onolock6:/arm2410dev ,我們已經(jīng)給出了編輯好 o.c和Makefile文件,它們 o]#cp o/root/share o]#cp o/root/share [/mnt/yaffs]mount-tnfs-onolock6:/root/share[/mnt/yaffs]cd/host[/host]./ o 1.Makefile進入 CMakefile 將耗時長的操作(timeconsuming)置于一個新的線程,可以避免這種尷尬的情況。不同的CPU上。不斷地從共享的循環(huán)緩沖區(qū)數(shù)據(jù)。流程圖如圖2.2.1所示:Theclassicproducer-consumerIllustratesmutexesandbyZoujianguo 2003-12-#include<stdio.h>#include<stdlibh>#include<timeh>#include"pthread.h"/**/structprodcons{intbuffer[BUFFER_SIZE]; /*緩沖區(qū)數(shù)組*/pthread_mutex_tlock; /*互斥鎖*/intreadpos, /*讀寫的位置pthread_cond_tnotempty; /*緩沖區(qū)非空信號*/pthread_cond_tnotfull; /*緩沖區(qū)非滿信號*/ voidinit(structprodcons*{pthread_mutex_init(&b->lock,NULL);pthread_cond_init(&b->notfull,NULL);b->readpos=0;b->writepos=} /*向緩沖區(qū)中寫入一個整數(shù)*/voidput(structprodcons*b,intdata){/*等待緩沖區(qū)非滿while((b->writepos+1)%BUFFER_SIZE==b-{printf("waitfornotfull\n");}/*寫數(shù)據(jù)并且指針前移if(b->writepos>=BUFFER_SIZE)b->writepos=} intget(structprodcons*b){intdata;/*等待緩沖區(qū)非空while(b->writepos==b-{printf("waitfornotempty\n");}/*讀數(shù)據(jù)并且指針前移*/if(b->readpos>=BUFFER_SIZE)b->readpos=/*設置緩沖區(qū)非滿信號*/returndata;} #defineOVER(-1) void*producer(void*{intfor(n=0;n<1000;{printf("put-->%d\n",n);put(&buffer,n);}put(&buffer,OVER);returnNULL;} void*consumer(void*{intd;d=if(d==OVER) %d-->get\n",}returnNULL;} int{void*retval;pthread_create(&th_a,NULL,producer,0);/**/pthread_join(th_a,&retval);pthread_join(th_b,&retval);return0;}主要函數(shù)分析2.2.2voidput(structprodcons*b,int{ while((b->writepos+1)%BUFFER_SIZE==b->readpos){//等待狀態(tài)變量b->notfull}b->buffer[b->writepos]=data; if(b->writepos>=BUFFER_SIZE)b->writepos=0; }intget(structprodcons*{int while(b->writepos==b->readpos){ pthread_cond_wait(&b->notempty,&b->lock);等待狀態(tài)變量}datab->buffer[b- if(b->readpos>=BUFFER_SIZE)b->readpos=0; return}主要的多線程在本程序的代碼中大量的使用了線程函數(shù),如pthread_cond_signal、intpthread_create(pthread_t* constpthread_attr_t void*(*start_routine)(void*),void* pthread_tpthread_selfintpthread_equal thread1, voidpthread_exit(void*intpthread_join th,void**pthread_mutex_init(pthread_mutex_t*,constpthread_mutexattr_tintpthread_mutex_destroy(pthread_mutex_t*再試一次獲得對互斥量的鎖定(非阻塞intpthread_mutex_trylock(pthread_mutex_t*鎖定互斥量(阻塞intpthread_mutex_lock(pthread_mutex_t*intpthread_mutex_unlock(pthread_mutex_t*intpthread_cond_init(pthread_cond_t* constpthread_condattr_t* intpthread_cond_destroy(pthread_cond_t*intpthread_cond_signal(pthread_cond_t*等待條件變量(阻塞intpthread_cond_wait(pthread_cond_t* cond,pthread_mutex_t* intpthread_cond_timedwait(pthread_cond_t* pthread_mutex_t* conststructtimespec* intpthread_create(pthread_t*thread_id,constpthread_attr_t void*(*start_routine)(void*),void* EAGAIN和EINVAL過多了;后者表示第二個參數(shù)代表的線程屬性值。創(chuàng)建線程成功后,新創(chuàng)建的線程則pthread_join函 intpthread_join th,void**pthread_exitvoidpthread_exit(void*voidpthread_exit(void*pthread_jointhread_returnNULLthread_return。最后要說明的是,一個線程不能被多個線程等intpthread_cond_init(pthread_cond_tintpthread_cond_init(pthread_cond_t*cond,constpthread_condattr_t*condpthread_cond_t,cond_attrPTHREAD_condpthread_cond_waitexternintpthread_cond_wait(pthread_cond_t*restrictcond,pthread_mutex_t* 說來線程應該仍阻塞在這里,被等待被下一次喚醒。這個過程一般用while語句實現(xiàn)。texternint P((pthread_cond_t*pthread_mutex_t* conststructtimespec*pthread_cond_signal函數(shù)externintpthread_cond_signal(pthread_cond_t*間被發(fā)出,從而造成的等待。 2、和調(diào) 終端窗口,使用NFSmount開發(fā)主機的/arm2410dev到 waitfornotemptywaitfornotemptyput--producer999--consumerC軟件:PC機操作系統(tǒng)REDHATLINUX9.0+ +ARM-LINUX開發(fā)環(huán)境為了恢復發(fā)送的信息,雙方必須協(xié)調(diào)工作。在微型計算機中大量使用異步串行I/O方式,150,300,600,1200,2400,4800,9600等。2.3.2實用RS-232C我們的實驗主要是為掌握在Linux中進行串行通訊編程的基本方法。本實驗的程序流程圖#include<termiosh>#include<stdio.h>#include<unistdh>#include<fcntl.h>#include<pthreadh>#defineCOM2#defineENDMINITERM27 /*ESCtoquitminiterm*/#defineFALSE0#defineTRUEvolatileintfd;voidchild_handler(int{} void*keyboard(void*{for(;;){break}}return} /*modeminputhandler*/void*receive(void*{intwhile{write(1,&c,1);/*stdout*/}returnNULL;} void*send(void*{intc='0';{c%=}returnNULL; intmain(intargc,char**{structsigactionsa;intvoid*retval;if(argc>fd=open(COM2,O_RDWR);fd=open(COM1,O_RDWR);//|O_NOCTTYif(fd<0)} /*savecurrentmodemsettings*/ /*getworkingstdtio*/newtio.c_cflag=BAUDRATE|CRTSCTS|CS8|CLOCAL|CREAD; newtio.c_iflag=IGNPAR; /*inputflag*/newtio.c_oflag=0; newtio.c_lflag=0;/*nowcleanthemodemlineandactivatethesettingsformodem*/tcflush(fd,TCIFLUSH); /*setsa.sa_flags=0; /*handledyingchild*/pthread_create(&th_a,NULL,keyboard,0);pthread_create(&th_c,NULL,send,0);pthread_join(th_a,&retval);pthread_join(th_b,&retval);pthread_join(th_c,&retval); /*restoreoldmodemsetings*/ /*restoreoldttysetings*/} <stdioh> <stdlibh> <unistdh> <sys/typesh> <sys/stat <fcntlh> <termiosh> /*PPSIX終端控制定義*/ <errnoh> <pthread [/mnt/yaffs]cd[/dev]ln–sf/dev/tts/0Linux[/mnt/yaffs]cd[/dev]ln–sf/dev/tts/0intfd=open("/dev/ttyS0",O_RDWR); if(-1== /*不能打開串口一perror("}termios結(jié)構(gòu)體的各成員值,關于該結(jié)構(gòu)體的定義可以查看struct{unsignedshortc_iflag; /*輸入模式標志*/unsignedshortc_oflag; /*輸出模式標志*/unsignedshortc_cflag; /*控制模式標志*/unsignedshort /*localmodeflagsunsignedchar /*linediscipline*/unsignedchar structtermiosOpt;tcgetattr(fd, Option.c_cflag&=Option.c_cflag&=~PARENB;Option.c_cflag&=~CSTOPB;Option.c_cflag&=~CSIZE;Option.c_cflag|=驗(Odd)7Option.c_cflag|=~PARENB;Option.c_cflag&=~CSTOPB;Option.c_cflag&=~CSIZE;Option.c_cflag|=偶效驗(Even7Option.c_cflag|=~PARODD;Option.c_cflag&=~CSIZE;Option.c_cflag|=Space7Option.c_cflag&=~PARENB;Option.c_cflag&=~CSTOPB;Option.c_cflag&=&~CSIZE;Option.c_cflag|=options.c_cflag&=options.c_cflag|=options.c_lflag&=~(ICANON|ECHO|ECHOE| options.c_oflag&= charbuffer[1024]; nByte=write(fd,buffercharbuff[1024]; intreadByte=read(fd,buff,charbuff[1024]; intreadByte=read(fd,buff, [root@zxt03_tty]#make -c-oterm.oarmv4l-unknown-linux-gcc-o../bin/termterm.o armv4l-unknown-linux-gcc-otermterm.o [root@zxt03_tty]#lsMakefileMakefile.baktermterm.cterm.o [root@zxt[/mnt/yaffs]mount-tnfs-onolock6:/arm2410dev/host[/mnt/yaffs]cd/host/exp/basic/03_tty/readmodemsend1term發(fā)出的數(shù)據(jù),卻無法看到開發(fā)主機發(fā)來的數(shù)據(jù),可以使用另外一臺主機連接串口2進行收發(fā)測試。/dev/ttyS0:Nosuchfileor[/mnt/yaffs]cd[/devln–sf/dev/tts/0 CANARMCANCAN端反顯。MCP2510設置成自回環(huán)的模式,CAN總線數(shù)據(jù)自發(fā)自收。C軟件:PC機操作系統(tǒng)REDHATLINUX9.0+ +ARM-LINUX開發(fā)環(huán)境裝備、電子主干系統(tǒng)中均嵌入CAN控制裝置。PhilipsP82C250CAN一網(wǎng)絡中允許掛接110個節(jié)點。誤檢定特性也增強了CAN的抗電磁干擾能力。CAN_H=3.5V和CAN_L=1.5V。當“顯性”位和“隱性”線數(shù)值將為“顯性”。這種特性,為CAN總線的奠定了基礎。間份額的數(shù)目都是可以通過CAN總線控制器(MCP2510)編程控制的,而時間份額3、CAN總線的MAC同時支持下面兩種CAN總線的幀格式。2.4.2CAN支持回環(huán)(LoopBack)3V5.5V#defineEXIOADDR (*(volatileunsignedshort*)0xa000000)//bank5externunsignedshortintEXIOReg;#define #defineCLREXIOBIT(bit)#defineEXIOADDR (*(volatileunsignedshort*)0xa000000)//bank5externunsignedshortintEXIOReg;#define #defineCLREXIOBIT(bit)#defineMCP2510_Enable() #defineMCP2510_Disable() //向同步串口發(fā)送數(shù)據(jù)(Uhalh) 表2.4.1MCP2510中110000000000100010100000圖2.4.4命2.4.5圖2.4.8狀態(tài)命MCP2510中的、、F3CAN所示方式定義CAN總線通訊的波特率。17441744174413222.4.3Mask和Filter0xx是100是101否110否111是開啟接收緩沖區(qū),開啟中斷(可選模式,這里,為編程簡單,收發(fā)數(shù)據(jù)都采用查詢模式。通過狀態(tài)命令(ReadStatus#ifndefUP_CAN_H#define#ifndefUP_CAN_H#define#defineUPCAN_IOCTRL_SETBAND //setcanbusbandrate#defineUPCAN_IOCTRL_SETID //setcanframeiddata#defineUPCAN_IOCTRL_SETLPBK //setcandeviceinloopbackmodeornormal#define //setafilterforcan#defineUPCAN_IOCTRL_PRINTRIGISTER //printregisterinformationofspiandportE#defineUPCAN_EXCAN //externcanflagtypedeftypedefstructunsignedint //CAN總線unsignedchar unsignedchardlc; intI int }CanData,CAN設備設置接收過濾器結(jié)構(gòu)體參數(shù) 是否接收數(shù)據(jù)按如下規(guī)律 Filter typedefstruct{unsignedintint by #include<stdio.h>#include<fcntl.h>#include<timeh>//#include<sys/types//#include<sys/ipch>#include<sys/ioctlh>#include<pthreadh>#include"up-canh"#defineCAN_DEV staticintcan_fd=-1;#ifdefDEBUG#defineDPRINTF(x...) staticvoid*canRev(void*{inti;}return}#define staticvoidCanSendString(char{CanDataintlen=strlen(pstr);memcpy(data.data,pstr,write(can_fd,&data,sizeof(data));}//write(can_fd,pstr,write(can_fd,&data,}intmain(intargc,char**{intpthread_tth_can;void*retval;intcharusrname[100]={0,};printf("Erroropening%scandevice\n",CAN_DEV);return1;}ioctl(can_fd,UPCAN_IOCTRL_SETID,id);#ifdef/*Createthethreads*/printf("\nPress\"%s\"toquit!\n",quitcmd);printf("\nPressEntertosend!\n"); //Sendusernamesprintf(usrname,"%s:",}intlen;scanf("%s",str);str)==0){} //Sendusername}/*Waituntilproducerandconsumerfinish. return0;}1、編譯CAN[root@zxt/]#cd/arm2410dev/kernel-[root@zxtkernel-2410dev]# make [root@zxt04_can]#make -c-omain.oarmv4l-unknown-linux-gcc-ocanchatmain.o [root@zxt04_can]#lscanchatdriverhardwarehmain.cmain.oMakefileup-can 終端窗口,使用NFSmount開發(fā)主機的/arm2410dev到/host 插入CAN驅(qū)動模塊。[/mnt/yaffs]mount-tnfs-onolock6:/arm2410dev/host[/mnt/yaffs]cd/host/exp/basic/04_can/driver/[/host/exp/basic/04_can/driver]insmodcan.oUsingWarning:loadingcanwilltaintthekernel:noSeehtsp:// 10-mcp2510initializedcanchatDebug:canrecievethreadPress"\q!"toPressEntertosend!通過CAN總線在終端上收到同樣的字符串。軟件:PC機操作系統(tǒng)REDHATLINUX9.0+ +ARM-LINUX開發(fā)環(huán)境獲取服務器當 文件列獲取指定文件獲取指定文件獲取HTML類型文件客戶獲取純文本文件獲取JPG圖像文件獲取GIF圖像文件解析用戶請求2.5.1獲取服務器當 文件列 獲取HTML請求令、請求的文件名、請求的文件類型。3、數(shù)據(jù)流圖

2.5.21HTTP/1.02002Content-type:34Expires:

2.5.3送給連接處理模塊處理。并繼續(xù)進行。 2.5.4 函數(shù)名:intHandleConnect(int函數(shù)名:intParseReq(FILE*f,char函數(shù)名:intPrintHeader(FILE*f,int 函數(shù)名:intDoDir(FILE*f,char參數(shù):參數(shù)1:文件流FILE結(jié)構(gòu)指針,用于表示客戶連接的文件流指針。用于寫入 參數(shù) 函數(shù)名:intDoHTML(FILE*f,char函數(shù)名:intDoText(FILE*f,char函數(shù)名:intDoJpeg(FILE*f,char函數(shù)名:intDoGif(FILE*f,char設置信號處理設置信號處理建立TCP流設置允許客戶連接數(shù)量偵聽客戶連接客戶連接請求

2.5.5打開文件描述字打開文件描述字,并建立文件描述符連接信息獲取Refferer字段信息賦值給Refferer全局變量獲取content_length字段信息調(diào)用客戶請求解析模塊關閉文件流2.5.6 下 發(fā)送協(xié)議頭發(fā)送協(xié)議頭發(fā)送協(xié)議頭 2.5.74、發(fā)送HTTP函數(shù)定義為:intPrintHeader(FILE*f,int發(fā)送請求成功信息:HTTP/1.0200OKswitch{casefprintf(f,"Content-type:text/ casecasecase} [root@zxt05_httpd]#makearmv4l-unknown-linux-gcc-DHTTPD_ armv4l-unknown-linux-gcc-DHTTPD_ -c-ocopy.carmv4l-unknown-linux-gcc-o../bin/httpdhttpd.ocopy.o-lpthreadarmv4l-unknown-linux-gcc-ohttpdhttpd.ocopy.o-lpthread[root@zxt05_httpd]#lscopy.c httpd.cindex.htmlstartinghttpd...pressqtostartinghttpd...pressqtowaitfor,觀察在客戶機的瀏覽器中的連接請求結(jié)果(如圖2.5.8)和在開發(fā)板上的服務器的打印信2.5.8IE [root@BCroot]#cd [root@BCroot]#mkdir [root@BC [root@BCsrc]#cp [root@BCroot]#cd [root@BCroot]#mkdir [root@BC [root@BCsrc]#cp [root@BC[root@BC [root@BCtools]#tarxjvfarm-linux-gcc-3.4.1.tar.bz2C[root@BCtools]#vi 將該文件中的PATH變量改為[root@BC[root@BCtools]# tar tar–xzf tar–xzf exportQTEDIR=$PWD/qt-2.3.10TMAKEDIR:Qt/EmbeddedTmakeQT2DIR:qt-2.3.2QTEDIRqt-2.3.10的文件夾第二步,編譯Qt/Embedded。BuildcdcdexportQTDIR=$QT2DIRexportexport./configure-no-xft cp–arfbin/uic如果想要進一步了解可以通過鍵入./configure--help來獲得的幫助信息。編譯完成后需要將生成的/bin/uic到$QTEDIR下新創(chuàng)建的 bin中,因為在隨后編譯Qt/Embedded的時候會用到這個工具。BuildexportQTDIR=$QT2DIRexportcd$QTEDIR/tools/qvfbmvqvfb這一步buildqvfb并建立了從Qt/Embedded2.3.10到Qt2.3.2的靜態(tài)庫的。其中cdcdexportQTDIR=$QTEDIRexportexport./configure-no-xft-qvfb-depths4,8,16,3255在配置./configure中-qvfbVirtualframebuffer,-depths4,8,16,324位,16位,32位的顯示深度,此外還可以添加如-syestem-jpeg和-gifjpeggif的支持。配置系統(tǒng)同時還支持對特定平臺系統(tǒng)選項的添加,但一般來講,凡是支持運行./configure--help命令來查看。exportexportexportexportcd$QTEDIR/examples/launcherqvfb-width640-height480sleep./launcher-3.1-1Qt/EmbeddedDemoQt應用程序的環(huán)境,下面我們通過編寫一個“oEmbedded”的程序來了解Qt程序設計。 #include<qlabel.h>intmain(intargc,char{QApplicationapp(argc,QLabel* o=newQLabel(" oQt/Embedded!",0); }[root@BC2410sQt]#mkdirexp[root@BC2410sQt]#cdexp[root@BCexp]# 12QApplication因為Qt本身需要一些命令行的參數(shù)。用程序窗口通常是一個包含QBar、QToolBar、QStatusBar和其它部件的一個部件。在QLabel函數(shù)中的參數(shù)0表示,這是一個窗口而不是嵌入到其它窗口中的部件。9Qt,這時候程序進入就緒模式,可是隨時被用戶行為每一個Qt程序都對應著一個工程文件,因為tmake工具要借此工程生成相應的Makefileprogen工具,它的位置在$TMAKEDIR/bin下,使用progen生成工程文件的方法如下:$TMAKEDIR/bin/progen$TMAKEDIR/bin/progen–tapp.t echotmake工具前,必須查看相應的環(huán)境變量是否正確,由于我們要編譯在本機上echoechotmake工具來生成我們需要的Makefile文件,在命令行中輸入如下命令:Makefile 面的章節(jié)來了解Makefile最后在命令行中輸入“make”命令就可以對整個程序進行編譯 o。用Virtualframebuffer顯示效果如下:圖3.1- o$TMAKEDIR/bin/tmake–o o=new oQt/Embedded!",0)這句進行修改 QLabel o=new "<i>Qt/Embedded!</i></font></h2>",圖3.1-3修改 o 的VisualStudio,而且它還提供了相當多的部件資源。3.2-1QtDesigner3-5為我們使用的Qt/X112.3.2中自帶的v1.1QtDesigner。3.2-2QtDesignervQtDesigner。我們編寫的窗體主要包括下ProgressBarPushButtonCheckBoxSilder同時,Dial、LCDNumber和ProgressBar會隨其發(fā)生變化。Qt3.2-4Layout不能保證函數(shù)被執(zhí)行時所傳遞的類型是正確的,這使得進程很容易。另一個問題是,GUI得基本功能元素,使得很難進行獨立的分類開發(fā)。Qt的信號與插槽機制則不同,Qt部件(Widgets)發(fā)生時發(fā)出信號,如一個按鈕被點擊時會發(fā)出一個“clicked”信號。程序員可以選擇建立一個函數(shù)(稱為插槽)并調(diào)用connect建立連接要用到connectSingal/Solts(F3)按鈕,點擊后只要用鼠標連接兩個部3.2-5連接建立以后會自動出現(xiàn)編輯連接(EditConnection)的框圖3.2-6編輯連接接情況,還可以通過點擊Edit菜單來對連接進行修改。3.2-7不同平臺的不同風格,比如常見的Windows風格、Motif風格等。3.2-8Qt3.2-9QtDesigner win.hwin.cpp兩個文#include"win.h"int#include"win.h"intmain(intargc,char{Form1form;return} cdcdexportQTDIR=$QTEDIRexportexport./configure-x tformlinux-arm-g++-no-xft-no-qvfb-depths4,8,16,32這步完成后,我們會在$QTEDIR/lib/下面看到libqte.solibqte.so.2libqte.so.2.3 libqte.so.2.3.10:ELF32-bitLSBsharedobject,ARM,version1(ARM),not有了這個庫以后我們就可以把它拷貝到我們的開發(fā)板中相應的庫下面,這里我們選擇了開發(fā)板上的/usr/lib,將$QTEDIR/lib/下的libqte.so*到/usr/lib下。首先ip6并且/root/share為共享 /$QTEDIR/lib 將其中“TMAKE_LINK=arm-linux-gcc”修改為:“TMAKE_LINK=arm-linux-g++”這里我們采用了Qt/Embedded自帶的一個demo,它在$QTEDIR/examples/progressbar下,這個 包括下面幾個文件:main.cpp、Makefile.in、progressbar.h、makeclean 可以采用 命令行中重新設置TMAKEPATH echo cd./progressbar-將pc端$QTEDIR/lib/fonts下的所有文cd./progressbar-3.2-10在Qtopiaprogressbar軟件:RedhatLinux9.0forPC+ +EmbededLinuxfor2410 qt-embedded-2.3.10.tar.gzqt-x11-2.3.2.tar.gzQtopia是TrollTech公司為采于Qt/Embedded的。使用Qt/Embedded不僅可以開發(fā)Qtopia也可以用來開發(fā)面向Qtopia的第軟件。它包括三個版本:Qtopia版QtopiaPDA版和 tarxzftarxzfexport -tarxzftmake-1.13.tar.gztarxzftmake-1.13.tar.gztartarxzfqt-x11-2.3.2.tar.gztarxzfqt-embedded-2.3.10- exportQTEDIR=$PWD/qt-2.3.10tarxzfqt-embedded-2.3.10- exportQTEDIR=$PWD/qt-2.3.10BuildcdcdexportQTDIR=$QT2DIRexportexport./configureno- cpbin/uicexportQTDIR=$QT2DIRexportexportQTDIR=$QT2DIRexportcd$QTEDIR/tools/qvfbtmake-oMmvqvfbBuildcdcdexportQTDIR=$QTEDIRexportexportcp-f$QPEDIR/src/qt/qconfig-qpe.hsrc/tools/./configure-system-jpeg-no-xft-qconfigqpe-qvfb-depthsmakesub-cdexportcdexportexport在其中找到缺少的庫文件并拷貝到/usr/lib中。echo echo$QTDIRechoecho echo$QTDIRechoecho$PATH出現(xiàn)上面的結(jié)果就可以正常的顯示Virtualframebuffer,我們可以通過下面令qvfb&sleepqvfb&sleep[Desktopcomment=AprogressbarProgram我們可以根據(jù)我們的需要編譯生成到底是宿主機上運行的程序還是開發(fā)板上運行的程[Desktopcomment=AprogressbarProgram以上內(nèi)容都做好后,我們需要把我們的三個文件分別到相應的 將圖標文件progressbar.png到/root/qtopia/qtopia- 將執(zhí)行文件progressbar到/root/qtopia/qtopia- 3.3-3 何為xscale(arm)編譯、移植應用程序。 交叉編譯Qtopia源代碼。生成的Qtopia系統(tǒng)到開發(fā)板。軟件:PC機操作系統(tǒng)REDHATLINUX9.0 +ARM-LINUX開發(fā)環(huán)五.窗口操作系3.4窗口操作系統(tǒng)Java目前在sitsnag平臺上使用的qtopia版本為1.5.0 QtopiaPDA版是一個強大的平臺,于基于Linux用了Qtopia,QtopiaPDA版已經(jīng)成了事實上的Linux標準,它代表了可行的“第三種”PDA設計方案。QtopiaPDA版具圖3.41六安裝光盤時所安裝的編譯器版本較低,不能正常編譯QTcd在編譯完成后,src下的各 ext2工具包編譯結(jié)果 jpeg Qt/X11-2.3.2及編譯結(jié)果,編譯Qtopia時需要使用其中的工具 Qt/Embedded2.3.10及編譯結(jié)果 Qtopia2.1.1及編譯結(jié)cdqtopia--將/root/share/qtopia-install.tar.bz2到目標機,并解壓縮到/mnt/yaffs下將src/qtopia.sh到目標機的 下將src/e2fs-install/lib/libuuid.so*到目標機的/mnt/yaffs/lib 將tools/usr/local/arm/3.4.1/arm-linux/lib/libgcc_s.so*到目標機的/mnt/yaffs/lib cdln-s/mnt/yaffs/Qtopiamkdirtmp注意:1.如果運行./qtopia.sh后提示找不到庫文件,請從編譯器 發(fā)板/mnt/yaffs/lib中。3.如果提示:Qt/Embeddeddatadirectoryisnotownedbyuser0:/tmp/qtembedded-0運行:chownroot:roottmp/qtembedded-如果提示:Qtopiadatadirectoryisnotownedbyuser0:/tmp/qtopia-運行:chownroot:root/tmp/qtopia-一、Linux自1991年11月由芬蘭的LinusTtorvalds推出Linux0.1.0版內(nèi)核至今,Linux內(nèi)核已經(jīng)升級到Linux2.6.20(寫本文檔時, 發(fā)布的版Linux內(nèi)核。其發(fā)展速度是如此的迅猛,是目前市場上唯一可以Windows的操作系統(tǒng)。在其發(fā)展過程中得到分布于全世界的廣大OpenSource項目追隨者的大力支持。尤其是一些曾經(jīng)參與Unix得到巨大的擴展。目前比較穩(wěn)定的版本是Linux2.6.20。在Linux的版本號中,第一個數(shù)展提供了無限廣闊的空間。目前專門針對嵌入式設備的Linux就有好幾種。包括針對無MMU的uClinx和針對有MMU的標準LINUX在各個硬件體系結(jié)構(gòu)的移植版本。這種面向市場,價格便宜功能靈活。但是傳統(tǒng)的Linux內(nèi)核采用虛擬內(nèi)存管理技術,這種設計運行在沒有MMU的上時,這部分關于內(nèi)存管理的代碼就變成冗余代碼甚至對系統(tǒng)整體性能產(chǎn)生影響。uClinux正是為了解決這一問題而開發(fā)的。其名稱中“u”(miu)micro,小的意思。而“C”Control,uClinuxLinuxuClinuxLinux雖然體積小但依然保存了Linux內(nèi)核的大多數(shù)優(yōu)點。其主要特點有:支持通用Linux調(diào)度二、Linux

4.1.1linuxLinux(主要這部分工作就是由英國ARM公司的工程師完成的,我們所要做的就是從其上相關(Patch其基本過程是這樣的(以Linux2.6.0為例:rmk1.gz給Linux2.6.0打補?。簔cat../patch-2.6.0-rmk1.gz|patch–p1(前面../表示補丁 下的makefile文件,主要是以下幾行:*/arm/es/sa110/armARCH ARCHPILE:=改 PILE=交叉編譯工具中arm-linux所 例如 具的基本結(jié)構(gòu)如圖4.1.2所示:4.1.2(Interpreter序,尤其是一些語言程序,其優(yōu)點是簡單,好移植,但執(zhí)行速度與編譯好的目標代碼(Assembler(Linker(LoaderGNUGCCCrossGCC(JVM(Bytecode方式是通過Java實時編譯器( 系統(tǒng)也主要是以GCC模式進行移植的。對它做進一步介紹。過程也是比較復雜的,其基本流程如圖4-3所示:要匯編器等的協(xié)助,這就是我們前面提到的工具鏈。工具鏈中通常包含GNUBinutils,GNUGLibc,C錄如:/toolchain/gcc,/toolchain/bu,/toolchain/glibc,cp–drinclude/asm-arm/toolchain/gcc/arm-cp–drinclude/linux/toolchain/gcc/arm-在配置Binutils之前先把cp–drinclude/asm-arm/toolchain/gcc/arm-cp–drinclude/linux/toolchain/gcc/arm- ./configure--target=arm-linux--makeall編譯之前先修改gcc的t-linux文件,此文件放在gcc/config/arm 件中的TARGET_LIBGCC2_CFLAGS后加上gthr_posix_hinhibit_libc,操作如下:mvt-linuxt-linux-orig備份原來的t-linux: -D-Dinhibit_libc/'<t-linux-orig>t-linux-corecp./t-linux-core./t-linux ./configure--without-headers\(\\不編譯頭文件makeallinstallCC=arm-linux-gccAR=arm-linux-arRANLIB=arm-linux-CC=arm-linux-gccAR=arm-linux-arRANLIB=arm-linux- ./configuremakeallinstallcp/toolchian/gcc/config/arm/t-linux-orig/toolchian/gcc/config/arm/t-./configuremakeallinstall4.1.3GCC四、修改Linux在完叉編譯環(huán)境的建立之后,進入下一階段,對linux內(nèi)核的移植修改。linux的移植是個繁重的工作,其主要包含啟動代碼的修改,內(nèi)核的及裝入,參數(shù)傳遞,內(nèi)核引導幾個部分。linuxLinux一階段,內(nèi)核與體系結(jié)構(gòu)相關部分(arch下)首先執(zhí)行,它會完成硬件寄存器設置,在arch 系結(jié)構(gòu)的代碼。為arm系列編譯內(nèi)核,就應修改ARM 下我們可以找到一個boot ,在boot下有一個init.S的文件,.S表示它是匯編同時它也是整體內(nèi)核二進制鏡像的起始標志。Init.S主要完成以下功能:Init.S*Copyright(C)2000Russell*Headerfileforsplittingkernel+initrd.Notethatwe*r0throughtor3straight.section.type_entry, adrr10,initdata r11,initdatasubr11,r10,r11 .size_entry,.-.typeinitdata, @compiledaddressof.sizeinitdata,.- adrr13,ldmiar13!,{r4-r6} addr4,r4,r11 @correction ldmiar13!,{r4-r6} movr12,r5addr4,r4,r11 Setuptheinitrdparameterstopasstothekernel.Thiscaneitherpassedinviaaparam_structorataglist.Wespotthemethodbylookingatthefirstword;thisshouldeitherindicateasizeof4K,16Korldmiar13,{r4- @getsizeandaddrof@r5=@r7=initrd@r8=param_struct r9,[r8, @noparamteqr9,#0x1000 teqner9,#0x4000 @16K?teqner9,#0x8000 beqparam_struct r9,[r8,#4] teqr9,r4bne @ok,wehaveatagWedidn'tfindavalidtaglist-create movr4,#8 movr4,#0 r4,[r8,findtheendofthetaglist,andthenaddanINITRDtagontheIfthereisalreadyanINITRDtag,thenweignoreit;thelasttagtakes r9,[r8, @tagteqr9,#0 r8,r8,r9bnemovr4, @lengthofinitrdmovr9,#0 @endoftaglistterminatorstmiar8,{r4,r5,r6,r7,r9}movpc, @callWefoundaparamstruct.Modifytheparamstructforthe addr8,r8,stmiar8,{r6,r7} @saveinparam_structmovpc, @callmove:ldmiar4!{r7r10}@32stmiar5!,{r7-r10}ldmiar4!,{r7-r10}stmiar5!,{r7-r10}subsr6,r6,#8*4bcsmovemovpc, @r4= @r5= @ @ @.type.type行文件是由許多在一起的目標文件組成的。我們以ELF(可可編譯文件,是目前dat(段),bbs等組成。這些段又由(Linkerdescription)負責裝入。* Copyright(C)* Copyright(C)2000RussellThisprogram*itunderthetermsoftheGNUGeneralPublicLicenseversion2 {LOAD_ADDR;//“.”_load_addr=TEXT_START;_text=.text _start=*(*(*(input_data_end=.;.=}_etext _got_start= :{*(.got)_got_end= :{*(.got.plt) :{*(.data)_edata=.=bss_start= :{*(.bss)_end=.stack :{*(.stack).stab :{*(.stab).stabstr :{*(.stabstr).stab.excl :{*(.stab.excl).stab.exclstr0:{*(.stab.exclstr).stab.index :{*(.stab.index).stab.indexstr0:{*(.stab.indexstr).comment :{*(.comment)}五、Linuxmakeconfig:進入命令行,可以一行一行的配置,這不好使用所以我們不具體介紹。 config菜單,相信很多人對此都不陌生。3)makexconfig:在2.4.X以及以前版本中xconfig菜單是基于TCL/TK的圖形庫的。所角度就是愛用新東西。2.6.Xxconfig關裁剪內(nèi)容。同時因為xconfig界面比較友好,大家容易掌握。但它卻沒有 2.4.X版 .X版本xconfig圖.X版 .Xxconfig ,鍵入make 1、Codematuritylevel、promptfordevelopment pleteLINUX、promptforobsolete2、loadablemodulesupportenablemodulesetversioninformationonallmodulekernelmodule3、system4、General、supporthot-plugable、sysctl、NWFPEmath、Power5、Networking網(wǎng)絡選項,它主要是關于一些網(wǎng)絡協(xié)議的選項。Linuxpacket介協(xié)議。同時它可以讓你在TCP不能用時找到一個通訊方法。、unixTCP/IPTCP/IPsocketfilter:就是濾的計算機,并且可以企圖用戶的計算機的IP地址。IP:masquerading:這個選項可以在NetworkFirewalls選項被選后生效。計算機,而遠端的計算機看到的就是接收到的服務器送過來的封包,而不是從內(nèi)部子的服務器向外連線。它是一種,如果你的網(wǎng)絡里有一些重要的信息,那你在masqurerading也能處理ICMPpackets,就把這選項選上。的IPpackets丟失。IP:GREtunneling"GRE"可不是彼"GRE",它是(GenericRoutingEncapsulation)。選該項后可以支持在IPv4IPv6之間的通訊。IPARPdaemonsupportARPIPIP:Unit)PathMTUDiscovery所以大部分時候都選N,也就是Enable。TheIPXprotocol:IPXNetwareNOVELL網(wǎng)絡線程表,可同時針對多個網(wǎng)絡封包處理并依優(yōu)先處理順序來排序,稱之為packetKernelKernelpacketschedulingalgorithm。其它網(wǎng)絡選項還有很多考慮篇幅無法給其作一一解釋,如果你有可以查看相關幫助文6、Networkingdeveices:關鍵是確定自己平臺所使用的網(wǎng)卡。該項下的子項也不少。、Dummynetdriver選擇它Linux增大不大。如果沒有運行SLIP或PPP協(xié)議,就不用選它。、Bondingdriversupport、UniversalTUN/TAPdevicedriver、SLIP(serialline)IPTCP/IP、PLIP(parallelport)、、EQL(seriallineloadbalancing) 、TokenRingdriver、Ethertapnetwork、Ethernet10or et萬兆以太網(wǎng),無線網(wǎng)絡,廣域網(wǎng),ATM,PCMCIA7、AmateurRadio8、IrDA(infrared)9、ATA/ATAPI/MFM/RLL2.6.X10、SCSIdevice11、ISDNsupportISDNIntegratedServicesDigitalNetworkingDevicesSLIPPPP。12、Consoledriverssupport、VGAtext、SupportFrameBuffersupportforframebufferdevicesS3C2410XLCDsupportsupportforframebufferdevicesS3C2410XLCDsupport320*2408bit256colorSTNLCD13、parallelport14、MemoryTechnologyDeviceMTD、MTDpartitioning、DirectchardeviceaccesstoMTD、CachingblockdeviceaccesstoMTD、NANDflashdevice、NANDdevicessupport14.4.2、verifyNANDpageswrites14.4.3、NANDflashdeviceonARMboard15、Plugandysupport16、blockdevices上。如在我們UP-NETARM2410平臺上我們要選上:RAMdiskInitialRAMdisk(initrd)support17、Filesystems、Quota、Kernelautomounter、Kernelautomounterversion4supportV3版本的升級,它兼容V3、Reiserfs 、ROMfilesystem、JFSfilesystem、Secondextendedfs、Ext3journallingfilesystem、JournallingFlashfilesystemv2(jffs2)、ISO9660CDROMfilesystem、/procfilesystem空間。通過CAT命令可以讀到其文件的相關信息。、/devfilesystem、NFSfile、NFSfilesystem、NFSserver17.13.3、SMBfilesystemsupport、NativeLanguage18、character、virtual、supportforconsoleonvirtual、non-standarserialport、Serialportsupport和supportforconsoleonS3C2410serialport、UNIX98PTYPTY(pseudoterminal)偽終端,它是軟件設備由主從兩部分組成。從設備與具體的硬件終務器和xterms、I2CsupportQIC-02tapewatchdogcard/dev/nvram、EnhancedRealTimeClock、/dev/agpgart(AGP選上它。嵌入式系統(tǒng)中目前用的還不多,但臺式機AGP設備已相當普及。、R3964line、DirectRenderingManager(X864.1.0andhigherDRI持,選擇正確的顯卡后,該設備能提供對同步,安全的DMA交換支持。選該項同時要把/dev/agpgartAGPSupport)選上。19、USBsupport20、soundcard21、kernelLINUX1make這條命令是在正式編譯你的內(nèi)核之前先把環(huán)境給清理干凈。有時你也可以用make4make 學LINUX下進行驅(qū)動設計的原C硬件:PCPentium500以上,40G以上,128M軟件:PC機操作系統(tǒng)REDHATLINUX9.0 +AMR-LINUX開發(fā)環(huán)LinuxLinux開發(fā)中十分重要的部分,它要求開發(fā)者不僅要熟悉相關的內(nèi)容,這部分應該是通過仔細閱讀廠家提供的資料來解決。效率,盡量使驅(qū)動程序簡單,使之易于。編譯為模塊的形式,單獨加載運行調(diào)試。第法效率較低,但在某些場合是唯一的方module_initmoudule_exit(退出處理函數(shù)名)CCmodule_kernel_versionELFmodinfoLinux-2.4insmod/lib/modules和內(nèi)核相關的子目錄中查找模塊文件,如果需要從當前裝載,使用insmodmodule.o。將主分區(qū)的次設備號為1,擴展分區(qū)的次設備號為2、3、4,邏輯分區(qū)使用5、6….。號的分配原則可以參考ation/devices.txt。 [/mnt/yaffs]ls/dev- 1 1Jan100:00 1 64Jan100:00 1 65Jan100:00 1 7Jan100:00 1 0Jan100:00 1 2Jan100:00 1 1J

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論