嵌入式操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告_第1頁(yè)
嵌入式操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告_第2頁(yè)
嵌入式操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告_第3頁(yè)
嵌入式操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告_第4頁(yè)
嵌入式操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告U201014281__________________________第2頁(yè)/共11頁(yè)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告U201114491__________________________第9頁(yè)/共11頁(yè)華中科技大學(xué)嵌入式操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告院系:計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院專業(yè): 物聯(lián)網(wǎng)班級(jí): 1102姓名: 吳斌 報(bào)告時(shí)間: 2014-06-25計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院目錄1.課程設(shè)計(jì)目的…………32.課程設(shè)計(jì)環(huán)境搭建……………………33.內(nèi)容一:熟悉和理解Linux編程環(huán)境 (1)內(nèi)容要求……………………4 (2)計(jì)過(guò)程及實(shí)現(xiàn)………………44.內(nèi)容三:掌握添加設(shè)備驅(qū)動(dòng)程序的方法 (1)內(nèi)容要求…………………7(2)設(shè)計(jì)過(guò)程及實(shí)現(xiàn)…………75.課設(shè)感想………………………12實(shí)驗(yàn)內(nèi)容1.課程設(shè)計(jì)目的(1)掌握Linux操作系統(tǒng)的使用方法;(2)了解Linux系統(tǒng)內(nèi)核代碼結(jié)構(gòu);(3)掌握實(shí)例操作系統(tǒng)的實(shí)現(xiàn)方法。2.課程設(shè)計(jì)環(huán)境搭建(1)安裝linux(2)更改root登錄: 在現(xiàn)階段Ubuntu的系統(tǒng)中,是不允許直接以root身份登錄系統(tǒng)的,但是在做課設(shè)的過(guò)程中,需要大量的使用root權(quán)限來(lái)進(jìn)行命令的操作。如果以普通用戶登錄ubuntu,會(huì)連編輯一個(gè)文件都非常周折。為此,我找到了一種修改系統(tǒng)文件,以達(dá)到直接使用root身份登錄的方法: ◎開(kāi)始的時(shí)候,只能以普通用戶登錄,用Ctrl+Alt+T打開(kāi)終端: 初始化/修改root密碼 sudopasswdroot 用vi編輯器修改這個(gè)文件: sudovi/etc/lightdm/lightdm.conf 在文件最后加入這么一行代碼: greeter-show-manual-login=true 然后保存退出,sudoreboot重啟系統(tǒng)。之后就可以輸入root用戶登錄。(3)在添加系統(tǒng)調(diào)用中用到的其他內(nèi)核包: ◎下載和當(dāng)前實(shí)驗(yàn)環(huán)境最為接近的系統(tǒng)版本(這點(diǎn)很重要) 使用apt-getinstalllinux-source-3.0.0命令, ◎下載結(jié)果是linux-source-3.0.0.tar.bz2 ◎解壓命令:tar–xjvflinux-source-3.0.0.tar.bz2–C/usr/src ◎解壓后,在/usr/src目錄下得到內(nèi)核文件夾linux-source-3.0.0(4)在調(diào)用linux圖形庫(kù)時(shí)需要安裝GTK環(huán)境: ◎安裝gcc/g++/gdb/make等基本編程工具

apt-getinstallbuild-essential Tip:如果提示由于依賴項(xiàng)不能安裝,需要使用apt的強(qiáng)化版aptitude,這個(gè)工具可以自動(dòng)分析軟件包依賴,系統(tǒng)一般不自帶,需要先安裝,具體過(guò)程是: apt-getinstallaptitude aptitudeinstallbuild-essential aptitude這個(gè)工具很強(qiáng)大,對(duì)于解決軟件包安裝時(shí)的依賴問(wèn)題很有幫助。 ◎安裝libgtk2.0-devlibglib2.0-dev等開(kāi)發(fā)相關(guān)的庫(kù)文件: apt-getinstallgnome-core-devel ◎安裝GTK核心組件:

apt-getinstalllibgtk2.0-dev這個(gè)安裝完成后,GTK環(huán)境就基本搭建成功,網(wǎng)上有些教程說(shuō)要安裝其他配置文件,經(jīng)我親測(cè),發(fā)現(xiàn)只要安裝libgtk2.0-dev這個(gè)包就能搞定。3.熟悉和理解Linux編程環(huán)境(1)實(shí)驗(yàn)內(nèi)容:實(shí)現(xiàn)三個(gè)進(jìn)程之間的并發(fā)程序:(2)計(jì)過(guò)程及實(shí)現(xiàn):這里需要用到課程實(shí)驗(yàn)時(shí)的fork()程序以及GTK的圖形顯示。①基本fork()程序,調(diào)用顯三個(gè)進(jìn)程的結(jié)構(gòu)如下:#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<sys/wait.h>voidmain(intargc,charargv[]){pid_tp1,p2,p3;pid_tt1,t2,t3;intstatus;if((p1=fork())==0){/*創(chuàng)建第一個(gè)子進(jìn)程*/execv("./pa",argv);}elseif((p2=fork())==0){/*創(chuàng)建第二個(gè)子進(jìn)程*/execv("./pb",argv);}elseif((p3=fork())==0){/*創(chuàng)建第三個(gè)子進(jìn)程*/execv("./pc",argv); }else{t1=waitpid(p1,&status,0);t2=waitpid(p2,&status,0);t3=waitpid(p3,&status,0);}}②調(diào)用GTK顯示窗體函數(shù)模塊的結(jié)構(gòu):voidshow(intargc,char*argv[],char*title){gtk_init(&argc,&argv); //初始化工具包并且獲取命令行參數(shù);window=gtk_window_new(GTK_WINDOW_TOPLEVEL);//創(chuàng)建新的窗口; //設(shè)定窗口的位置;gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); //監(jiān)聽(tīng)窗口的destroy事件;g_signal_connect(G_OBJECT(window), "destroy",G_CALLBACK(destroy_progress),NULL);gtk_window_set_title(GTK_WINDOW(window),title);//用來(lái)設(shè)定更改窗口標(biāo)題;gtk_container_set_border_width(GTK_CONTAINER(window),20);//設(shè)定寬度; //使用gtk_vbox_new函數(shù)建立縱向組裝盒; //為了顯示構(gòu)件,必須將構(gòu)件放入組裝盒中,并將組裝盒放在窗口內(nèi);vbox=gtk_vbox_new(FALSE,10);gtk_container_set_border_width(GTK_CONTAINER(vbox),100);//設(shè)定寬度;gtk_container_add(GTK_CONTAINER(window),vbox);gtk_widget_show(vbox); //使用gtk_box_pack_start函數(shù)將構(gòu)件放到組裝盒中;sprintf(id_char,"%s,MyID:%d",title,getpid()); //顯示PID號(hào)label=gtk_label_new(id_char);gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,10);gtk_widget_show(label);sprintf(id_char,"父進(jìn)程ID:%d",getppid()); //顯示PPID號(hào)label=gtk_label_new(id_char);gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,10);gtk_widget_show(label);button=gtk_button_new_with_label("close"); //關(guān)閉窗口按鈕 //信號(hào)登記函數(shù),監(jiān)聽(tīng)按鈕的clicked事件。 //當(dāng)窗口clicked時(shí),gtk_widget_destroy就會(huì)被調(diào)用。 //而gtk_widget_destroy函數(shù)又調(diào)用gtk_main_quit()結(jié)束程序運(yùn)行。g_signal_connect_swapped(G_OBJECT(button),"clicked",G_CALLBACK(gtk_widget_destroy),window);gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,10);GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);gtk_widget_grab_default(button); //函數(shù)顯示窗口中的組件gtk_widget_show(button);gtk_widget_show(window); //準(zhǔn)備將窗口和所有的組件顯示在屏幕上,函數(shù)必須在GTK程序的最后調(diào)用.gtk_main();}③編譯代碼main.c,運(yùn)行; 編譯命令為:gcc-oamain.c`pkg-config--cflags--libsgtk+-2.0` 程序運(yùn)行結(jié)果如下圖3-3所示:4.內(nèi)容三:掌握添加設(shè)備驅(qū)動(dòng)程序的方法1內(nèi)容要求(1)采用模塊方法,添加一個(gè)新的設(shè)備驅(qū)動(dòng)程序。(2)要求添加字符設(shè)備的驅(qū)動(dòng)。(3)編寫(xiě)一個(gè)應(yīng)用程序,測(cè)試添加的驅(qū)動(dòng)程序2設(shè)計(jì)過(guò)程及實(shí)現(xiàn)(1)Linux內(nèi)核中的設(shè)備驅(qū)動(dòng)程序是一組常駐內(nèi)存的具有特權(quán)的共享庫(kù),是低級(jí)硬件處理例程。對(duì)用戶程序而言,設(shè)備驅(qū)動(dòng)程序隱藏了設(shè)備的具體細(xì)節(jié),對(duì)各種不同設(shè)備提供了一致的接口,一般來(lái)說(shuō)是把設(shè)備映射為一個(gè)特殊的設(shè)備文件,用戶程序可以象對(duì)其它文件一樣對(duì)此設(shè)備文件進(jìn)行操作。 Linux支持3種設(shè)備:字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備。 設(shè)備由一個(gè)主設(shè)備號(hào)和一個(gè)次設(shè)備號(hào)標(biāo)識(shí)。主設(shè)備號(hào)唯一標(biāo)識(shí)了設(shè)備類型,即設(shè)備驅(qū)動(dòng)程序類型,它是塊設(shè)備表或字符設(shè)備表中設(shè)備表項(xiàng)的索引。次設(shè)備號(hào)僅由設(shè)備驅(qū)動(dòng)程序解釋,一般用于識(shí)別在若干可能的硬件設(shè)備中,I/O請(qǐng)求所涉及到的那個(gè)設(shè)備。 一個(gè)典型的驅(qū)動(dòng)程序,大體上可以分為這么幾個(gè)部分: ①注冊(cè)設(shè)備: 在系統(tǒng)初啟,或者模塊加載時(shí)候,必須將設(shè)備登記到相應(yīng)的設(shè)備數(shù)組,并返回設(shè)備的主設(shè)備號(hào); ②定義功能函數(shù): 對(duì)于每一個(gè)驅(qū)動(dòng)函數(shù)來(lái)說(shuō),都有一些和此設(shè)備密切相關(guān)的功能函數(shù)。以最常用的塊設(shè)備或者字符設(shè)備來(lái)說(shuō),都存在著諸如open()、read()這一類的操作。當(dāng)系統(tǒng)調(diào)用這些調(diào)用時(shí),將自動(dòng)的使用驅(qū)動(dòng)函數(shù)中特定的模塊。來(lái)實(shí)現(xiàn)具體的操作; ③卸載設(shè)備: 在不用這個(gè)設(shè)備時(shí),可以將它卸載,主要是從/proc中取消這個(gè)設(shè)備的特殊文件。(2)編寫(xiě)Makefile文件如下:#IfKERNELRELEASEisdefined,we'vebeeninvokedfromthe#kernelbuildsystemandcanuseitslanguage.ifeq($(KERNELRELEASE),)#Assumethesourcetreeiswheretherunningkernelwasbuilt#YoushouldsetKERNELDIRintheenvironmentifit'selsewhereKERNELDIR?=/lib/modules/$(shelluname-r)/build#Thecurrentdirectoryispassedtosub-makesasargumentPWD:=$(shellpwd)modules: $(MAKE)-C$(KERNELDIR)M=$(PWD)modulesmodules_install: $(MAKE)-C$(KERNELDIR)M=$(PWD)modules_installclean: rm-rf*.o*~core.depend.*.cmd*.ko*.mod.c.tmp_versions.PHONY:modulesmodules_installcleanelse#calledfromkernelbuildsystem:justdeclarewhatourmodulesareobj-m:=devDrv.oendif 調(diào)用Makefile文件之后,其具體過(guò)程如下: ①KERNELRELEASE是在內(nèi)核源碼的頂層Makefile中定義的一個(gè)變量,在第一次讀取執(zhí)行此Makefile時(shí),KERNELRELEASE沒(méi)有被定義,所以make將讀取執(zhí)行else之后的內(nèi)容; ②如果make的目標(biāo)是clean,直接執(zhí)行clean操作,然后結(jié)束。 ③當(dāng)make的目標(biāo)為all時(shí),-C$(KDIR)指明跳轉(zhuǎn)到內(nèi)核源碼目錄下讀取那里的Makefile;M=$(PWD)表明然后返回到當(dāng)前目錄繼續(xù)讀入、執(zhí)行當(dāng)前的Makefile。 ④當(dāng)從內(nèi)核源碼目錄返回時(shí),KERNELRELEASE已被定義,內(nèi)核的build程序Kbuild也被啟動(dòng)去解析kbuild語(yǔ)法的語(yǔ)句,make將繼續(xù)讀取else之前的內(nèi)容。 ⑤else之前的內(nèi)容為kbuild語(yǔ)法的語(yǔ)句,指明模塊源碼中各文件的依賴關(guān)系,以及要生成的目標(biāo)模塊名(3)編寫(xiě)設(shè)備功能函數(shù):(devDrv.mod.c) 函數(shù)框架如下所示:#include<linux/module.h>#include<linux/vermagic.h>#include<linux/compiler.h>MODULE_INFO(vermagic,VERMAGIC_STRING);__visiblestructmodule__this_module__attribute__((section(".gnu.linkonce.this_module")))={ .name=KBUILD_MODNAME, .init=init_module,#ifdefCONFIG_MODULE_UNLOAD .exit=cleanup_module,#endif .arch=MODULE_ARCH_INIT,};staticconststructmodversion_info____versions[]__used__attribute__((section("__versions")))={ {0x59caa4c3,__VMLINUX_SYMBOL_STR(module_layout)}, {0x6bc3fbc0,__VMLINUX_SYMBOL_STR(__unregister_chrdev)}, {0xbb2c2e33,__VMLINUX_SYMBOL_STR(__register_chrdev)}, {0x839fb39,__VMLINUX_SYMBOL_STR(try_module_get)}, {0x4f8b5ddb,__VMLINUX_SYMBOL_STR(_copy_to_user)}, {0x4f6b400b,__VMLINUX_SYMBOL_STR(_copy_from_user)}, {0x6d9da20b,__VMLINUX_SYMBOL_STR(module_put)}, {0x27e1a049,__VMLINUX_SYMBOL_STR(printk)}, {0xbdfb6dbb,__VMLINUX_SYMBOL_STR(__fentry__)},};staticconstchar__module_depends[]__used__attribute__((section(".modinfo")))="depends=";MODULE_INFO(srcversion,"EC04EE455AF92F2C3E445E0");(4)設(shè)備加載,安裝過(guò)程如下: ①進(jìn)入Makefile文件和devDrv.mod.

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論