![湖北汽院嵌入式系統(tǒng)開發(fā)實(shí)驗(yàn)_第1頁](http://file4.renrendoc.com/view/eb3869899fbbd0afc864fbb81de2caa0/eb3869899fbbd0afc864fbb81de2caa01.gif)
![湖北汽院嵌入式系統(tǒng)開發(fā)實(shí)驗(yàn)_第2頁](http://file4.renrendoc.com/view/eb3869899fbbd0afc864fbb81de2caa0/eb3869899fbbd0afc864fbb81de2caa02.gif)
![湖北汽院嵌入式系統(tǒng)開發(fā)實(shí)驗(yàn)_第3頁](http://file4.renrendoc.com/view/eb3869899fbbd0afc864fbb81de2caa0/eb3869899fbbd0afc864fbb81de2caa03.gif)
![湖北汽院嵌入式系統(tǒng)開發(fā)實(shí)驗(yàn)_第4頁](http://file4.renrendoc.com/view/eb3869899fbbd0afc864fbb81de2caa0/eb3869899fbbd0afc864fbb81de2caa04.gif)
![湖北汽院嵌入式系統(tǒng)開發(fā)實(shí)驗(yàn)_第5頁](http://file4.renrendoc.com/view/eb3869899fbbd0afc864fbb81de2caa0/eb3869899fbbd0afc864fbb81de2caa05.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
實(shí)驗(yàn)二嵌入式Linux多線程通信實(shí)驗(yàn)程(thread)是在共享內(nèi)存空間中并發(fā)的多道執(zhí)行路徑,它們共享一個(gè)進(jìn)程的資源,如文件描述和信號(hào)處理。P(S):將信號(hào)量S的值減1,即S=S-1;如果S>0,則該進(jìn)程繼續(xù)執(zhí)行;否則該進(jìn)程狀態(tài)置為阻塞狀態(tài),進(jìn)程PCB排入信號(hào)量PCB隊(duì)列末尾,放棄CPU,等待V操作的執(zhí)行。V(S):1將信號(hào)量S的值加1,即S=S+1;2如果S<0,釋放信號(hào)量隊(duì)列中第一個(gè)PCB所對(duì)應(yīng)的進(jìn)程,將進(jìn)程狀態(tài)111阻塞態(tài)改為就緒態(tài)。執(zhí)行V操作的進(jìn)程繼續(xù)執(zhí)行。#include<stdio.h>#include<unistd.h>#include<pthread.h>#include<semaphore.h>#defineMAXSIZE10intstack[MAXSIZE];intsize=50;intfront=-l,rear=0;seni.tavail,full;//avail表示可用的空緩沖區(qū),full表示已存放產(chǎn)品的緩沖區(qū)〃生產(chǎn)者pthread_tprovider,customer,end;voidprovider_fun(void)//full表示已存放產(chǎn)品的緩沖區(qū){inti=l;sleep(5);while(i<=size)〃生產(chǎn)50個(gè)產(chǎn)品,需要放入到MAXSIZE個(gè)緩沖區(qū)中{sem_wait(&avail);//avail信號(hào)EP操作,表示將可用的空緩沖區(qū)個(gè)數(shù)減1stack[rear]=i;printf('*producethe%dproduct\nn,stack[rear]);rear=(rear+l)%MAXSIZE;i++;sleep(l);sem_post(&full);//full信號(hào)量V操作,表示將存放產(chǎn)品的緩沖區(qū)個(gè)數(shù)加1}pthread_exit(NULL);}〃消費(fèi)者voidcustomer_fun(void)inti=l;while(i<=size){sem_wait(&full);//fulll信號(hào)量P操作,表示將存放產(chǎn)品的緩沖區(qū)個(gè)數(shù)減1front=(front+l)%MAXSIZE;printf(H\tconsumethe%dproduct\n,\stack[front]);stack[front]=0;sleep(2);sem_post(&avail);//avail信號(hào)量V操作,表示將可用的空緩沖區(qū)個(gè)數(shù)加1i++;}pthread_exit(NULL);}voidend_fun(void){charch;scanf(,,%c',,&ch);pthread_cancel(provider);pthread_cancel(customer);dpthread_exit(NULL);printf(nexit!\iin);}voidmain(){pthread_tprovider,customer;〃定義生產(chǎn)者線程對(duì)象和消費(fèi)者線程對(duì)象sem_init(&avail,O,MAXSIZE);〃將avail信號(hào)量初始化為MAXSIZEsemJnit(&full,0,0);〃將full信號(hào)量初始化為0pthread_create(&provideF,NULL,(void*)provider_fun,NULL);//創(chuàng)建生產(chǎn)者線程pthread_create(&customer,NULL,(void*)customer_fun,NULL)”/消費(fèi)者線程pthread_create(&end,NULL,(void兔)end_fun,NULL);pthread」oin(provider,NULL);pthread」oin(customer,NULL);pthread」oin(end,NULL);sem_destroy(&a、ail);sem_destroy(&full);}實(shí)驗(yàn)三'嵌入式Linux網(wǎng)絡(luò)通信實(shí)驗(yàn)3、TCP套接字通信步驟服務(wù)器端:調(diào)用socketQ創(chuàng)建套接字,然后初始化stnictsockaddr_m結(jié)構(gòu)體。調(diào)用bind函數(shù)()為套接字綁定一個(gè)IP地址和一個(gè)端II號(hào)。
調(diào)用listenQ^數(shù)使套接字成為監(jiān)聽套接字,偵聽指定的端II。調(diào)用accept()函數(shù),使服務(wù)器處于阻塞狀態(tài),等待接受客戶端連接請(qǐng)求。一旦建立連接,將產(chǎn)生新的套接字,此時(shí)就有兩個(gè)套接字了,原來的那個(gè)套接字還在監(jiān)聽等待指定的端II,而新產(chǎn)生的套接字則準(zhǔn)備發(fā)送或接受數(shù)據(jù)。利用sendz,sendto和recv/recvfiom進(jìn)行數(shù)據(jù)傳輸。當(dāng)然也可以調(diào)用write或read.數(shù)據(jù)傳輸完畢,關(guān)閉套接字。請(qǐng)補(bǔ)充server.c中代碼//fbwuqi#include<svs/tvpes.h>#include<svs/socket.h> //包含套接字函數(shù)庫#iiiclude<stdio.h>#include<netinet/in.h>#include<arpa;inet.h>#include<unistd.h>#include<netinet/in.h>#include<arpa;inet.h>#include<unistd.h>//包含AF.INET相關(guān)操作的函數(shù)^include<string.h> //bzeio()#defineMAXDATASIZE50mt〃服務(wù)器端socket〃服務(wù)器端socket描述符變量,用以監(jiān)聽客戶端hitseivei_sockfd;的TCP連接stmctsockaddi_iiisenTei_addr;stmctsockaddrmclientaddr;intclient_addi_len;acceptQ中的一個(gè)參數(shù)chai-bufIMAXDATASIZE];〃服務(wù)器端sockaddr_in的數(shù)據(jù)結(jié)構(gòu)〃用于accept()存放客戶端的socket數(shù)據(jù)結(jié)構(gòu)〃用于返回structsockaddr_iii的長度,作為〃創(chuàng)建一個(gè)buf來存放接受的數(shù)據(jù)intnumbytes;〃用以返回接受到的字節(jié)數(shù)intnew_sockfd;返回一個(gè)新的socket,用這個(gè)socket接受數(shù)據(jù)〃當(dāng)監(jiān)聽到并接受一個(gè)TCP連接時(shí),acceptQseiver.sockfd=sock戰(zhàn)(AF_INET,SOCK_STREAM,0);〃創(chuàng)建一個(gè)TCP套接字,其中協(xié)議族為AF_INET,套接字類型為SOCK_STREAM,第三個(gè)參數(shù)為0servei_addi.sin_fomily=AF_INET;//servrei_addr.sin_faniily為AF_INETsenrer_addr.siii_addr.s_addr=iiiet_addr(M10.10.58.130n);//senrer_addr.siii_addr.s_addr為服務(wù)器端IP地址,需經(jīng)inet_adck()轉(zhuǎn)化為網(wǎng)絡(luò)IP字節(jié)序senrer_addLsm_pon=htons(1025);//servrei_addr.sin_poil為一個(gè)人于1024的端I丨號(hào),需經(jīng)htoiis()轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)序bmd(senTer_sockfd.(stRictsockaddr *)&server_addi\sizeof(stnictsockaddi));//將senrei_sockfd綁定到seiver_addr指定的IP和端II上listen(serv“_sockfd,5);將其設(shè)置為監(jiān)聽套接字〃為servei_sockfd創(chuàng)建包含5個(gè)TCP連接的監(jiān)聽隊(duì)歹listen(serv“_sockfd,5);將其設(shè)置為監(jiān)聽套接字wlule(1){client_addi_len=sizeof(sti-uctsockaddi_in);//計(jì)算sockaddi_iii的長度new_sockfd=accept(senrer_sockfd,(stnictsockaddr*)&client_addi;&ni】mbytes);〃等待接受客戶端發(fā)來的TCP連接,若連接成功,返回新的socketnumbytes=recv(new_sockfd,buf,20,0);〃將客戶端發(fā)來的數(shù)據(jù)存放在buf中,返回接
受到的字節(jié)數(shù)if(numbytes){prmtf(n%s\ir\buf);//輸出buf中數(shù)據(jù)}sleep⑶;send(new_sockfd/Iamserver*,20.0); 〃向客戶端發(fā)送TamseiveiMclose(new_sockfd);if(8==getchar()){break;}}close(seiver_sockfd);leturn0;}客戶端:調(diào)用socket()創(chuàng)建套接字,然后初始化structsockaddr_m結(jié)構(gòu)體,注意服務(wù)器端和客戶端的structsockaddr_m結(jié)構(gòu)體應(yīng)該一致。調(diào)用coimectionQ函數(shù)與服務(wù)器建立連接。利用send/sendto和recv/recvfiom進(jìn)行數(shù)據(jù)傳輸.當(dāng)然也可以調(diào)用write或read.數(shù)據(jù)傳輸完畢,關(guān)閉套接字。請(qǐng)補(bǔ)充client.c中代碼#include<svs/tvpes.h>#include<svs/tvpes.h>#include<svs/socket.h>#include<stdio.h>#include<netmet*m.h>#include<arpa;inet.h>#include<unistd.h>#include<string.h>//包含套接字函數(shù)庫//包含AF_INET相關(guān)結(jié)構(gòu)//包含AF.INET相關(guān)操作的函數(shù)//bzero()^defineMAXDATASIZE50iiit argc,char*argv[])iiitsockfd,result;//客戶端socket描述符變量stmctsockaddi_iiisenTei_addr;//與服務(wù)器端sockaddi_iii的數(shù)據(jù)結(jié)構(gòu)一致chai-buftMAXDATASIZE];〃用以接受服務(wù)器端發(fā)送過來的數(shù)據(jù)mtnumbytes;〃用以返回從服務(wù)端發(fā)送過來的數(shù)據(jù)字節(jié)數(shù)sockfd=sock筑(AF_INET$OCK_STREAK0);〃創(chuàng)建一個(gè)TCP套接字,其中協(xié)議族為AF_INET、套接字類型為SOCK_STREAM.第三個(gè)參數(shù)為0seiver^addr.siii.fanuly=AF_INET;//addiess_addr_addr.sm_family為AF_INETsenrer_addi.siii_addr.s_addi = met_addi(M10.10.58.130M);//address_addi_addf.siii_addi-.s_addr為服務(wù)器端IP地址,需經(jīng)met_addr()轉(zhuǎn)化為網(wǎng)絡(luò)IP字節(jié)序senrer_addr.siii_pon=htons(1025);//addiess_addi_addr.sin_port為一個(gè)人于1024的端丨I號(hào),需經(jīng)htons()轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)序result=conn亡ct(sockfd,(structsockaddi*)&seiver_addi\sizeof(stRictsockaddi));//與address_addi_addf指定的服務(wù)器建立連接send(sockfd,Mthisisclient”,20,0);//向服務(wù)器端發(fā)送”thisisclient*'sleep⑶;numbytes=recv(sockfd.buf,50,0);〃接受服務(wù)器端發(fā)送過來的數(shù)據(jù),保存在buf中if(numbvtes){pi-rntfC"%s\ir\buf);//輸出buf里面的數(shù)據(jù)}close(sockfd);leturn0;}實(shí)驗(yàn)四、嵌入式Linux串行端口編程實(shí)驗(yàn)什么是全雙工和半雙工全雙工(Fullduplex)是說計(jì)算機(jī)可以同時(shí)接受和發(fā)送數(shù)據(jù)——也就是它有兩個(gè)分開的數(shù)據(jù)傳輸通道(一個(gè)傳入,一個(gè)傳出)。半雙工(Halfduplex)表示計(jì)算機(jī)不能同時(shí)接受和發(fā)送數(shù)據(jù),而在某一時(shí)刻它只能單一的傳送或者接收。這通常意味著,它只有一個(gè)數(shù)據(jù)通道。半雙工并不是說RS-232的某些信號(hào)不能使用,而是,它通常是使用了有別于RS-232的其他不支持全雙工的標(biāo)準(zhǔn)。#iiiclude<stdio.h>/*標(biāo)準(zhǔn)輸入輸出定義*/include<stdlib.h>/*標(biāo)準(zhǔn)函數(shù)庫定義*/#iiiclude<uiiistd.h>/*Unix標(biāo)準(zhǔn)函數(shù)定義*/iiiclude<sys/types.h>iiiclude<sy&/stat.h>include<fcntl.h>/*文件控制定義*/#iiiclude<terniios.h>/*PPSIX終端控制定義*/iiiclude<enno.h>/*錯(cuò)誤號(hào)定義*/#defineFALSE-1^defineTRUE0mtspeed_an[]={B38400,Bl9200,B9600.B4800,B2400,B1200.B300,B38400.B19200.B9600,B4800.B2400,B1200,E300,};mtname_an[]={38400, 19200,9600,4800.2400, 1200, 300、38400. 19200,9600,4800,2400.1200,300,};charbuff珥1024];iiitLength;//intnByt亡=wiite(fd,buffer’Length);〃讀取串口數(shù)據(jù)代碼:dcharbuff[1024];iiitLen;voidset_speed(iiitfd,iiitspeed){inti;intstatus;stmctterniiosOpt;tcgetattr(fd,&Opt);for(i=0:i<sizeof(speed_air)/sizeof(int);i++){if(speed=name_an[i]){tcflush(fd,TCIOFLUSH);cfsetispeed(&Op「speed_an[i]);cfsetospeed(&Opt、speed_an[i]);status=tcsetattr(fd.TCSANOW.&Opt);if(status!=0){perror(HtcsetattrfdlH);return;}tcflush(fd.TCIOFLUSH);mtset_Parity(intfd.iiitdatabits.mtstopbits.mtparity)stmctterniiosoptions;if(tcgetattr(fcl&options)!=0){perior(nSetupSerial1H);retuni(FALSE);}options.c_cflag&=?CSIZE;switch(databits)/*設(shè)置數(shù)據(jù)位數(shù)*/case7:options.c_cflag|=CS7;break;case8:options.c_cflag|=CSS;break;default:fprmtf(stden\HUnsuppoiteddatasize\nM);return(FALSE);}switch(parity)
casen:caseN:options.c_cflag&=~PARENE; /*Clearparityenable*/options.c_iflag&=~INPCK; /*Enableparitychecking*/break;caseV:case'O:options.c.cflag|=(PARODD|PARENB);/*設(shè)置為奇效驗(yàn)勺o(hù)ptions.c_iflag|=INPCK; /*Disnableparitychecking*/break;case*er:/*Enableparity*//*/*Enableparity*//*轉(zhuǎn)換為偶效驗(yàn)*//*Disnableparitychecknig*/options.c_cflag|=PARENB;options.c_cflag&=~PARODD;options.c_iflag|=INPCK;break;case’s:case's1:/*asnoparity*/options.c_cflag&=~PARENE;options.c.cflag&=-CSTOPB;break;default:fprmtf(stden\”UnsupportedparityuiH);return(FALSE);}/*設(shè)置停止位*/switch(stopbits)fcase1:options.c_cflag&=?CSTOPE;break;case2:options.c_cflag|=CSTOPB;break;default:fprmtf(stden\nUnsuppoitedstopbits?”);return(FALSE);}/*Setmputparityoption*/if(parity!=fnf)options.c_iflag|=INPCK;tcflush(蝕TCIFLUSH);options.c_cc[VTEvIE]=150;/*設(shè)置超時(shí)15seconds*/options.c_cc[V\nN]=0:/*UpdatetheoptionsanddoitNOW*/if(tcsetatti(fd,TCSANOW,&optious)!=0){penorC'SetupSerial3H);return(FALSE);}retuin(TRUE);}iiitOpeiiDev(chai*Dev){mtfd=open(Dev,O_RDWR); //|O.NOCTTY|O_NDELAYif(-l=fd){penor(HCairtOpenSerialPort”);return-1;}elsereturnfd;}iiit aigc,chai**arg\-){mtfd;intmead;clwbuff{1024];chai-*dev=n/dev/ttvUSB0H;〃串II二fd=OpeiiDev(dev);set_speed(fdjl5200);if(set_Paiity(fd58,l,N)==FALSE){prmtf<nSetParityEnor\nM);exit(0);}while(1)//循壞讀取數(shù)據(jù){memset(buflF,0,1024);while((nread=read(fd,buff.1024))>0){//printf(M\nLen%d\nHaiiead);bufftnread+1]=SO:buff);memset(buff.0,1024);}}close(fd);exit(0);}實(shí)驗(yàn)五、嵌入式Linux內(nèi)核編程實(shí)驗(yàn)?zāi)憧梢允褂妙^文件linux/fs.h中的函數(shù)registei_cludev來實(shí)現(xiàn)注冊(cè)一個(gè)某個(gè)驅(qū)動(dòng)模塊對(duì)應(yīng)的主設(shè)備號(hào)。registei_cludev一般在intdevice_niitQ函數(shù)中調(diào)用,即將內(nèi)核驅(qū)動(dòng)模塊加載入內(nèi)核意味著要向內(nèi)核注冊(cè)自己。如果你向函數(shù)registei_cludev傳遞為0的主設(shè)備號(hào),那么返回的就是動(dòng)態(tài)分配的主設(shè)備號(hào)。此時(shí)應(yīng)該通過命令“cat/proc/devices”命令輸出得到,使用mknod統(tǒng)調(diào)用建立設(shè)備文件。Linux的驅(qū)動(dòng)程序編譯方法將其源代碼添加到內(nèi)核源文件中,然后靜態(tài)編譯整個(gè)內(nèi)核,再運(yùn)行新的內(nèi)核來測試編譯為模塊的形式,單獨(dú)加載運(yùn)行調(diào)試驅(qū)動(dòng)程序與應(yīng)用程序的區(qū)別應(yīng)用程序一般有一個(gè)main函數(shù),從頭到尾執(zhí)行一個(gè)任務(wù);驅(qū)動(dòng)程序卻不同,它沒有main函數(shù),通過使用宏module_init(初始化函數(shù)名);將初始化函數(shù)加入內(nèi)核全局初始化函數(shù)列表中,在內(nèi)核初始化時(shí)執(zhí)行驅(qū)動(dòng)的初始化函數(shù),從而完成驅(qū)動(dòng)的初始化和注冊(cè),之后驅(qū)動(dòng)便停止等待被應(yīng)用軟件調(diào)用。驅(qū)動(dòng)程序中有一個(gè)宏moudule_exit(^出處理函數(shù)名)注冊(cè)退出處理函數(shù)。它在驅(qū)動(dòng)退出時(shí)被調(diào)用。應(yīng)用程序可以和GLIBC庫連接,因此可以包含標(biāo)準(zhǔn)的頭文件,比如<stdio.hxstdhb.h>,在驅(qū)動(dòng)程序中是不能使用標(biāo)準(zhǔn)C庫的,因此不能調(diào)用所有的C庫函數(shù),比如輸出打印函數(shù)只能使用內(nèi)核的pimtk函數(shù),包含的頭文件只能是內(nèi)核的頭文件,比如:<lmuxy'module.h>。字符驅(qū)動(dòng)程序編寫流程包含字符設(shè)備驅(qū)動(dòng)程序所必需包含的頭文件定義字符設(shè)備文件名、主設(shè)備號(hào)或由系統(tǒng)動(dòng)態(tài)分配設(shè)備號(hào)編寫file_operatioiis結(jié)構(gòu)體中功能接丨I函數(shù),如以上device_read、device_\vrite.device_open定義file_opeiations結(jié)構(gòu)變量,建立用戶程序調(diào)用函數(shù)與驅(qū)動(dòng)功能接II的對(duì)應(yīng)關(guān)系。編寫字符設(shè)備驅(qū)動(dòng)程序加載函數(shù),完成設(shè)備文件注冊(cè)及必要的初始化編寫字符設(shè)備驅(qū)動(dòng)程序卸載函數(shù),完成注銷及必要的環(huán)境恢復(fù)。編寫Makefile文件,使用make來編譯Makefile,生成****.ko內(nèi)核模塊文件使用“insmod***.ko”加載設(shè)備驅(qū)動(dòng)程序,并調(diào)用dmesg來查看輸出結(jié)呆使用“cat/pioc/devicesv查看獲取主設(shè)備號(hào)使用“mknod/dev/設(shè)備文件名主設(shè)備號(hào)0”來創(chuàng)建設(shè)備文件編寫用戶應(yīng)用程序,調(diào)用用戶調(diào)用接II對(duì)驅(qū)動(dòng)功能接II進(jìn)行測試。使用“rmmod/dev/設(shè)備文件名”卸載驅(qū)動(dòng)模塊,并調(diào)用dmesg查看#include<linux'fs.h>#include<linux-cdev.h>#include<asnruaccess.h>〃文件系統(tǒng)相關(guān)的函數(shù)和頭文件#include<linux'fs.h>#include<linux-cdev.h>#include<asnruaccess.h>#defineDEVICE_NAMEmtDEVICE.MAJOR=0;MDev_fiaiiieM〃定義模塊名,用"cat/pioc/devicesv命令查看〃如果為0,則由系統(tǒng)自動(dòng)分配主設(shè)備號(hào)#defineM_LENGTH10charcore_dataO[M-LENGTH][M.LENGTH];〃定義內(nèi)核數(shù)據(jù)矩陣charcore.data1[M_LENGTH][M_LENGTH];//hitdevice_open(stmctinode*inode,structfile*filp){charc-ar;mti,j;printk(nuseropendevice.\iiH);for(i=0;i<M_LENGTH;i++){ 〃初始化數(shù)據(jù)foi(j=Oj<M_LENGTH:j++){core_dataO[i][j]=c+j; 〃初始化內(nèi)核數(shù)據(jù)矩陣}}return0:}/* */ssize_tdevice_write(stmctfile*filp.constchar*buffei;size_tcount,loff_t*f_pos){intij;printk(nuserwritedatatodrive匚\1】");〃將用戶空間傳遞過來buffer里面的數(shù)據(jù)復(fù)制到內(nèi)核空間core_datal數(shù)組中copy^fionvuseiXbuffer.core.data1.count);for(i=0;KM_LENGTH:i++){fbr(j=Oj<M_LENGTHj++){piintkC%c"、coie_daUil[i]);//使用printk打印內(nèi)核空間coie_datal數(shù)組中元素}pnntk(n\iiH);}returncount;}/* */ssize_tdevice_read(stmctfile*filp,char*buffer,size_tcount,loff.t*flpos){printk(nuserreaddatafromdrivec\n");copy_to_user(buffer,core_dataO,count)^/將內(nèi)核空間coie_dataO數(shù)組復(fù)制到用戶空間bufferreturncount;/* */iiitdevice_ioctl(stnictinode*iiiode,stmctfile*file.unsignedintcmd.unsignedlongarg){printk(nuserloctlruning.S”);switch(cmd){case1:prmtk(ncmd=%d.\ir\cmd);break;case2:prmtk(ncmd=%d.\ir\cmd);break;case3:prmtk(ncmd=%d.\ir\cmd);break;case4:prmtk(ncmd=%d.\ir\cmd);break;case5:prmtk(ncmd=%d.\ir\cmd);break;}returncmd;}/* */iiitdevice_release(stiuctmode*iiiode,structfile{printk(ndevicerelease\nH);return0;}/*----device_fops結(jié)構(gòu)定義文件操作函數(shù)體之后- -*/structfile_opeiationsdevice_fbps={.owner-THIS_MODULE,.iead=device_iead,//W用戶接II函數(shù)read與驅(qū)動(dòng)功能函數(shù)device_read對(duì)應(yīng)起來.unlocked_ioctl=device_ioctl,〃將用戶接I丨函數(shù)ioctl與驅(qū)動(dòng)功能函數(shù)device_ioctl對(duì)應(yīng)起來.open=device_open,〃將用戶接II函數(shù)open與驅(qū)動(dòng)功能函數(shù)device_open對(duì)應(yīng)起來.write=device_write,〃將用戶接II函數(shù)write與驅(qū)動(dòng)功能函數(shù)device_write對(duì)應(yīng)起來.Telease=device_Telease//將用戶接I丨函數(shù)release與驅(qū)動(dòng)功能函數(shù)device_release對(duì)應(yīng)起來};/* */iiitdevice_uut(void){intret;/*字符驅(qū)動(dòng)程序注冊(cè):第1個(gè)參數(shù)為0(表示由系統(tǒng)自動(dòng)分配主設(shè)備號(hào)),第2個(gè)參數(shù)為設(shè)備文件名,第3個(gè)參數(shù)為stmctfile_opeiations結(jié)構(gòu)體變量指針*/iet=register_cludev(0/Demo_device,\&devic亡_fops);if(ret<0){priiitkCregisterchidevfailure!\n”);〃字符驅(qū)動(dòng)程序注冊(cè)失敗returnret;piiiitk(Hregisterchidevok!\iT');DEVICE_MAJOR=ret;〃將系統(tǒng)分配的主設(shè)備號(hào)保存}return0;}voiddevice_exit(void){〃字符驅(qū)動(dòng)程序注銷,第1個(gè)參數(shù)為主設(shè)備號(hào),第2個(gè)參數(shù)為設(shè)備文件名,umegistei_clndev(0/,Demo_deviceM);printk(numegistercludevok!\iiH);}module_init(device_iiiit); 〃指定insmod-加載時(shí)執(zhí)行device^initmodule_exit(device_exit); //rnunod-卸載時(shí)執(zhí)行執(zhí)行device_exit實(shí)驗(yàn)六、嵌入式LinuxQtGUI使用實(shí)驗(yàn)//firstDialog?cpp//#include<QtGui>#include"firstDialog.h”firstDialog::fiistDialog(QWidget*parent):QDialog(paient){liiieEdit_l=newQLineEdit;label_l=newQLabel(H+");lineEdit_2=newQLmeEdit;label_2=newQLabel(',=M);liiieEdit_3=newQLineEdit;suniButton=newQPushButton(MsumH);jianfaButton=newQPushButton(1fjiaiifaM);/*按鈕部件大小和字體設(shè)置*/suniButton->resize(50,20);suniButton->setFont(QFont(MTimes,\1&QFont::Bold));coiinect(suniButton,SIGNAL(clicked())、this.SLOT(clickhm()));comiect(this.SIGNAL(sunisignal(QStrmg,QStnng)).this,SLOT(sumfun(QStnng,QStimg)));
comiect(jianfiuiButton.SIGNAL(clickedQ),tliis,SLOT(clickfxm()));coiinect(tlus, SIGNAL(sunisignal(QStrmg,QStiing)),SLOT(jianfuii(QString,QStiiiig)));QHBoxLavout*topLayout=newQHBoxLayout;topLayout->addWidget(lineEdit_l);topLayout->addWidget(label_l);topLayout->addWidget(lineEdit_2);topLayout->addWidget(label_2);topLayout->addWidget(lineEdit_3);QHBoxLavout*bottoniLayout=newQHBoxLavout;bottoniLayout->addWidget(suniButton);bottoniLayout->addWidge
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 湘教版數(shù)學(xué)九年級(jí)下冊(cè)《2.5.2圓切線》聽評(píng)課記錄4
- 湘教版數(shù)學(xué)九年級(jí)上冊(cè)第二章《一元二次方程》復(fù)習(xí)聽評(píng)課記錄
- 2025年度裝配式建筑預(yù)制構(gòu)件生產(chǎn)與安裝合同
- 五年級(jí)上冊(cè)數(shù)學(xué)聽評(píng)課記錄《植樹問題》人教版
- 2025年度供水供電設(shè)備租賃與維護(hù)合同范本
- 課題研究聽評(píng)課記錄表
- 蘇科版數(shù)學(xué)七年級(jí)上冊(cè)4.2.4《解一元一次方程》聽評(píng)課記錄
- 2025年度綠色節(jié)能型凱悅酒店智能消防系統(tǒng)升級(jí)改造合同
- 生態(tài)城市中的空氣質(zhì)量改善措施
- 2025年度航空航天產(chǎn)業(yè)股權(quán)投資框架協(xié)議
- 沖壓模具價(jià)格估算方法
- Before Sunrise 愛在黎明破曉時(shí)
- MotionView-MotionSolve應(yīng)用技巧與實(shí)例分析
- 碳納米管應(yīng)用研究
- 投標(biāo)聲明書模板
- 運(yùn)動(dòng)技能學(xué)習(xí)與控制課件第十一章運(yùn)動(dòng)技能的練習(xí)
- 蟲洞書簡全套8本
- 幼兒園幼兒園小班社會(huì)《兔奶奶生病了》
- 設(shè)備管理試題庫含答案
- 2023年《反電信網(wǎng)絡(luò)詐騙法》專題普法宣傳
- 小學(xué)數(shù)學(xué)五年級(jí)上、下冊(cè)口算題大全
評(píng)論
0/150
提交評(píng)論