嵌入式操作系統課程設計實驗報告_第1頁
嵌入式操作系統課程設計實驗報告_第2頁
嵌入式操作系統課程設計實驗報告_第3頁
嵌入式操作系統課程設計實驗報告_第4頁
嵌入式操作系統課程設計實驗報告_第5頁
已閱讀5頁,還剩12頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

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

apt-getinstallbuild-essential Tip:如果提示由于依賴項不能安裝,需要使用apt的強化版aptitude,這個工具可以自動分析軟件包依賴,系統一般不自帶,需要先安裝,具體過程是: apt-getinstallaptitude aptitudeinstallbuild-essential aptitude這個工具很強大,對于解決軟件包安裝時的依賴問題很有幫助。 ◎安裝libgtk2.0-devlibglib2.0-dev等開發相關的庫文件: apt-getinstallgnome-core-devel ◎安裝GTK核心組件:

apt-getinstalllibgtk2.0-dev這個安裝完成后,GTK環境就基本搭建成功,網上有些教程說要安裝其他配置文件,經我親測,發現只要安裝libgtk2.0-dev這個包就能搞定。3.熟悉和理解Linux編程環境(1)實驗內容:實現三個進程之間的并發程序:(2)計過程及實現:這里需要用到課程實驗時的fork()程序以及GTK的圖形顯示。①基本fork()程序,調用顯三個進程的結構如下:#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){/*創建第一個子進程*/execv("./pa",argv);}elseif((p2=fork())==0){/*創建第二個子進程*/execv("./pb",argv);}elseif((p3=fork())==0){/*創建第三個子進程*/execv("./pc",argv); }else{t1=waitpid(p1,&status,0);t2=waitpid(p2,&status,0);t3=waitpid(p3,&status,0);}}②調用GTK顯示窗體函數模塊的結構:voidshow(intargc,char*argv[],char*title){gtk_init(&argc,&argv); //初始化工具包并且獲取命令行參數;window=gtk_window_new(GTK_WINDOW_TOPLEVEL);//創建新的窗口; //設定窗口的位置;gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); //監聽窗口的destroy事件;g_signal_connect(G_OBJECT(window), "destroy",G_CALLBACK(destroy_progress),NULL);gtk_window_set_title(GTK_WINDOW(window),title);//用來設定更改窗口標題;gtk_container_set_border_width(GTK_CONTAINER(window),20);//設定寬度; //使用gtk_vbox_new函數建立縱向組裝盒; //為了顯示構件,必須將構件放入組裝盒中,并將組裝盒放在窗口內;vbox=gtk_vbox_new(FALSE,10);gtk_container_set_border_width(GTK_CONTAINER(vbox),100);//設定寬度;gtk_container_add(GTK_CONTAINER(window),vbox);gtk_widget_show(vbox); //使用gtk_box_pack_start函數將構件放到組裝盒中;sprintf(id_char,"%s,MyID:%d",title,getpid()); //顯示PID號label=gtk_label_new(id_char);gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,10);gtk_widget_show(label);sprintf(id_char,"父進程ID:%d",getppid()); //顯示PPID號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"); //關閉窗口按鈕 //信號登記函數,監聽按鈕的clicked事件。 //當窗口clicked時,gtk_widget_destroy就會被調用。 //而gtk_widget_destroy函數又調用gtk_main_quit()結束程序運行。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); //函數顯示窗口中的組件gtk_widget_show(button);gtk_widget_show(window); //準備將窗口和所有的組件顯示在屏幕上,函數必須在GTK程序的最后調用.gtk_main();}③編譯代碼main.c,運行; 編譯命令為:gcc-oamain.c`pkg-config--cflags--libsgtk+-2.0` 程序運行結果如下圖3-3所示:4.內容三:掌握添加設備驅動程序的方法1內容要求(1)采用模塊方法,添加一個新的設備驅動程序。(2)要求添加字符設備的驅動。(3)編寫一個應用程序,測試添加的驅動程序2設計過程及實現(1)Linux內核中的設備驅動程序是一組常駐內存的具有特權的共享庫,是低級硬件處理例程。對用戶程序而言,設備驅動程序隱藏了設備的具體細節,對各種不同設備提供了一致的接口,一般來說是把設備映射為一個特殊的設備文件,用戶程序可以象對其它文件一樣對此設備文件進行操作。 Linux支持3種設備:字符設備、塊設備和網絡設備。 設備由一個主設備號和一個次設備號標識。主設備號唯一標識了設備類型,即設備驅動程序類型,它是塊設備表或字符設備表中設備表項的索引。次設備號僅由設備驅動程序解釋,一般用于識別在若干可能的硬件設備中,I/O請求所涉及到的那個設備。 一個典型的驅動程序,大體上可以分為這么幾個部分: ①注冊設備: 在系統初啟,或者模塊加載時候,必須將設備登記到相應的設備數組,并返回設備的主設備號; ②定義功能函數: 對于每一個驅動函數來說,都有一些和此設備密切相關的功能函數。以最常用的塊設備或者字符設備來說,都存在著諸如open()、read()這一類的操作。當系統調用這些調用時,將自動的使用驅動函數中特定的模塊。來實現具體的操作; ③卸載設備: 在不用這個設備時,可以將它卸載,主要是從/proc中取消這個設備的特殊文件。(2)編寫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 調用Makefile文件之后,其具體過程如下: ①KERNELRELEASE是在內核源碼的頂層Makefile中定義的一個變量,在第一次讀取執行此Makefile時,KERNELRELEASE沒有被定義,所以make將讀取執行else之后的內容; ②如果make的目標是clean,直接執行clean操作,然后結束。 ③當make的目標為all時,-C$(KDIR)指明跳轉到內核源碼目錄下讀取那里的Makefile;M=$(PWD)表明然后返回到當前目錄繼續讀入、執行當前的Makefile。 ④當從內核源碼目錄返回時,KERNELRELEASE已被定義,內核的build程序Kbuild也被啟動去解析kbuild語法的語句,make將繼續讀取else之前的內容。 ⑤else之前的內容為kbuild語法的語句,指明模塊源碼中各文件的依賴關系,以及要生成的目標模塊名(3)編寫設備功能函數:(devDrv.mod.c) 函數框架如下所示:#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)設備加載,安裝過程如下: ①進入Makefile文件和devDrv.mod.

溫馨提示

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

評論

0/150

提交評論