




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、PAGE PAGE 88ARM與嵌入式技術(shù)實(shí)驗(yàn)講義(試用版)廖磊 劉鳳海 編寫四川師范大學(xué)物理與電子工程學(xué)院電子信息基礎(chǔ)實(shí)驗(yàn)教學(xué)示范中心2011年6月24日目 錄 TOC o 1-3 h z u HYPERLINK l _Toc296681063 實(shí)驗(yàn)一 嵌入式Linux開發(fā)環(huán)境搭建 PAGEREF _Toc296681063 h 1 HYPERLINK l _Toc296681064 實(shí)驗(yàn)二 Linux程序設(shè)計(jì)基礎(chǔ)C環(huán)境 PAGEREF _Toc296681064 h 16 HYPERLINK l _Toc296681065 實(shí)驗(yàn)三 8字?jǐn)?shù)碼管和點(diǎn)陣數(shù)碼管實(shí)驗(yàn) PAGEREF _Toc296
2、681065 h 33 HYPERLINK l _Toc296681066 實(shí)驗(yàn)四 多線程應(yīng)用程序設(shè)計(jì) PAGEREF _Toc296681066 h 42 HYPERLINK l _Toc296681067 實(shí)驗(yàn)五 驅(qū)動程序設(shè)計(jì)實(shí)驗(yàn)(模塊方式) PAGEREF _Toc296681067 h 56實(shí)驗(yàn)一 嵌入式Linux開發(fā)環(huán)境搭建一、實(shí)驗(yàn)?zāi)康?、熟悉linux下常用命令2、學(xué)會配置NFS系統(tǒng)3、熟悉2410實(shí)驗(yàn)平臺4、學(xué)會linux下軟件的安裝二、實(shí)驗(yàn)內(nèi)容安裝VMware Tools和編譯工具;配置linux系統(tǒng)和目標(biāo)板的IP,目標(biāo)板和linux系統(tǒng)的通信并完成文件共享;實(shí)現(xiàn)linux和X
3、P系統(tǒng)間文件共享;了解LINUX系統(tǒng)結(jié)構(gòu);三、預(yù)備知識1、了解linux下常用命令2、了解NFS3、了解交叉編譯概念四、實(shí)驗(yàn)設(shè)備及工具硬件:2410經(jīng)典嵌入式實(shí)驗(yàn)平臺,PC機(jī)(內(nèi)存至少500M),硬盤10G以上。軟件:PC機(jī)xp系統(tǒng),虛擬機(jī),REDHAT LINUX9.0。五、實(shí)驗(yàn)內(nèi)容與步驟5.1安裝VMtools說明:按ctrl+alt可以在虛擬機(jī)和XP之間切換。.在XP下,用鼠標(biāo)點(diǎn)擊菜單:VM-install VMware Tools,如下圖:在虛擬機(jī)桌面點(diǎn)右鍵選擇“新建終端”,輸入如下命令:rootBC root# lsanaconda-ks.cfg install.log instal
4、l.log.syslogrootBC root# cd /mnt/cdrom/rootBC cdrom# lsVMwareTools-6.0.0-45731.i386.rpm VMwareTools-6.0.0-45731.tar.gzrootBC cdrom# cp VMwareTools-6.0.0-45731.tar.gz /optcp:是否覆蓋/opt/VMwareTools-6.0.0-45731.tar.gz? YrootBC cdrom# cd /optrootBC opt# lshost VMwareTools-6.0.0-45731.i386.rpm vmware-tools
5、-distribtarget VMwareTools-6.0.0-45731.tar.gzrootBC opt# tar -xzvf VMwareTools-6.0.0-45731.tar.gz用CD命令進(jìn)入解壓目錄進(jìn)行安裝:rootBC /# cd /opt/vmware-tools-distrib/rootBC vmware-tools-distrib# lsbin doc etc FILES INSTALL installer lib vmware-install.plrootBC vmware-tools-distrib# ./vmware-install.pl(如有停頓:按回車鍵即可
6、) Starting VMware Tools services in the virtual machine: Switching to guest configuration: 確定 Guest filesystem driver: 確定 Mounting HGFS shares: 失敗 Guest memory manager: 確定 Guest vmxnet fast network device: 確定 Blocking file system: 確定 DMA setup: 確定 Guest operating system daemon: 確定 The configuration
7、of VMware Tools 6.0.0 build-45731 for Linux for this runningkernel completed successfully. You must restart your X session before any mouse or graphics changes takeeffect. You can now run VMware Tools by invoking the following command:/usr/bin/vmware-toolbox during an X server session. To use the vm
8、xnet driver, restart networking using the following commands:/etc/init.d/network stoprmmod pcnet32rmmod vmxnetmodprobe vmxnet/etc/init.d/network start To make use of the virtual printer, you will need to restart the CUPS service If you wish to configure any experimental features, please run the foll
9、owingcommand: vmware-config-tools.pl -experimental. Enjoy, -the VMware team( 安裝完成 VM)5.2 設(shè)置XP和LINUX文件共享點(diǎn)擊VM菜單,選擇Virtual Machine Settings,點(diǎn)擊“options”如下圖所示:雙擊對話框左側(cè)“SharedFolder Enabled”,然后點(diǎn)擊右下方add,選擇需要在linux訪問的windows下的文件夾。同時(shí)設(shè)置操作權(quán)限為“always enabled”。(此處文件夾選擇E盤下的2410文件夾:其中基礎(chǔ)實(shí)驗(yàn)在exp文件夾下面,編譯工具在armv4l-tools
10、文件夾下)需要注意的是此處也要命名linux下的文件夾的名字,我們業(yè)取名為2410.點(diǎn)擊OK設(shè)置完畢。(在終端中輸入如下命令查看共享是否成功)rootBC /# cd /mnt/rootBC mnt# lscdrom floppy hgfsrootBC mnt# cd hgfs/rootBC hgfs# ls2410 (此處顯示的是你共享的文件名稱)rootBC hgfs#5.3 配置LINUX 和目標(biāo)板的IP啟動后輸入: boot 來啟動系統(tǒng),然后配置目標(biāo)板ip:/mnt/yaffsifconfig eth0 4 netmask 配置linux系統(tǒng)IP:點(diǎn)擊“紅帽標(biāo)志”,選擇“系統(tǒng)設(shè)置”,點(diǎn)
11、擊網(wǎng)絡(luò),然后進(jìn)行設(shè)置:(此處要保證目標(biāo)板和linux系統(tǒng)ip在同意ip段)在點(diǎn)擊激活按鈕,如下圖所示,點(diǎn)擊是即可:在終端下執(zhí)行: Ping 4 如果有響應(yīng)則代表配置成功。配置NFS服務(wù)器(便于目標(biāo)板訪問linux系統(tǒng)下的文件):如下圖所示:選擇NFS,單擊“添加”,出現(xiàn)如下所示:點(diǎn)擊“瀏覽”,雙擊” ./” ,添加所需共享文件夾(在這里我們把2410加載上去)。選擇“2410”,點(diǎn)確定,在接下來的對話框中“主機(jī)”一欄中填“*”,基本權(quán)限改為“讀/寫”。如下圖所示:把常規(guī)選項(xiàng)中的第一個(gè)打上挑,如下圖:點(diǎn)擊確定。關(guān)閉系統(tǒng)防火墻:rootBC root# setup出現(xiàn)如上圖所示界面,選擇firew
12、all configuration,然后回車。通過按上下左右選擇no firewall,然后按空格鍵。再按ok鍵,最后退出。 5.4 安裝編譯器rootBC /# cd /mnt/hgfs/2410/rootBC 2410# ls2410緇忓吀鐗堝揩閫熷紑濮嬫墜鍐?2.0.pdf gdb rootfsarmv4l-tools gui shdevelop img uninstall.shdoc install.sh 瀹為獙琛厖璇存槑editor kernel 緇忓吀2410demoexp readme.txt 緇忓吀2410婕旂瑙嗛(要安裝的編譯工具在armv4l-tools中,此處文件名顯示的
13、為亂碼,設(shè)置如下:點(diǎn)擊“終端”-“字符編碼”,選擇“Unicode“,然后在執(zhí)行l(wèi)s命令即可)rootBC 2410# ls2410經(jīng)典版快速開始手?2.0.pdf gdb rootfsarmv4l-tools gui shdevelop img uninstall.shdoc install.sh 實(shí)驗(yàn)補(bǔ)充說明editor kernel 經(jīng)典2410demoexp readme.txt 經(jīng)典2410演示視頻(將文件夾armv4l-tool是拷貝到opt目錄下在安裝)rootBC 2410# cp -rf /mnt/hgfs/2410/armv4l-tools /optrootBC 2410#
14、 cd /opt/rootBC opt# lsarmv4l-tools VMwareTools-6.0.0-45731.tar.gz vmware-tools-distribrootBC opt# cd armv4l-tools/rootBC armv4l-tools# lsarmv4l-tools-2.95.2.tar.bz2cross-armv4l-binutils-2.10-3mz.i386.rpmcross-armv4l-gcc-2.95.2-5mz.i386.rpmcross-armv4l-gcc-c+-2.95.2-5mz.i386.rpmcross-armv4l-gdb-5.2.
15、1-1mz.i686.rpmcross-armv4l-glib-1.2.10-1mz.i386.rpmcross-armv4l-glibc-2.2.1-2mz.i386.rpmcross-armv4l-glibc-profile-2.2.1-2mz.i386.rpmcross-armv4l-glib-devel-1.2.10-1mz.i386.rpmcross-armv4l-jpeg-6b-2mz.i386.rpmcross-armv4l-jpeg-devel-6b-2mz.i386.rpmcross-armv4l-kernel-headers-2.4.5_rmk7_np2-1mz.i386.
16、rpmcross-armv4l-libfloat-1.0-3mz.i386.rpmcross-armv4l-libpng-1.0.8-4mz.i386.rpmcross-armv4l-openobex-0.9.8-1mz.i386.rpmcross-armv4l-openssl-0.9.6d-1mz.i386.rpmcross-armv4l-openssl-devel-0.9.6d-1mz.i386.rpmcross-armv4l-popt-1.5-1mz.i386.rpmcross-armv4l-zlib-1.1.3-5mz.i386.rpminstall.shrootBC armv4l-t
17、ools# ./install.sh Preparing. # 100% 1:cross-armv4l-glibc # 6% 2:cross-armv4l-binutils # 11% 3:cross-armv4l-gcc # 17% 4:cross-armv4l-glib # 22% 5:cross-armv4l-jpeg # 28% 6:cross-armv4l-gcc-c+ # 33% 7:cross-armv4l-gdb # 39% 8:cross-armv4l-glibc-prof# 44% 9:cross-armv4l-glib-devel# 50% 10:cross-armv4l
18、-jpeg-devel# 56% 11:cross-armv4l-kernel-hea# 61% 12:cross-armv4l-libfloat # 67% 13:cross-armv4l-libpng # 72% 14:cross-armv4l-openobex # 78% 15:cross-armv4l-openssl # 83% 16:cross-armv4l-openssl-de# 89% 17:cross-armv4l-popt # 94% 18:cross-armv4l-zlib # 100% (安裝完成,下面進(jìn)行設(shè)置) rootBC host# cd /opt/rootBC o
19、pt# lsarmv4l-tools host target VMwareTools-6.0.0-45731.tar.gz vmware-tools-distribrootBC opt# cd host/rootBC host# lsarmv4lrootBC host# cd armv4l/rootBC armv4l# lsarmv4l-unknown-linux bin include lib src sslrootBC armv4l# pwd/opt/host/armv4lrootBC armv4l#gedit /etc/profile修改如下# Path manipulationif i
20、d -u = 0 ; then pathmunge /sbin pathmunge /usr/sbin pathmunge /usr/local/sbin pathmunge /opt/host/armv4l/bin /添加如一行。fi保存 退出 rootBC armv4l# source /etc/profile如果生效有如下效果 :輸入arm并TAB鍵 自動出現(xiàn)。rootBC armv4l# armv4l-unknown-linux- (編譯代碼,測試編譯器)rootBC /# cp -rf /mnt/hgfs/2410/exp/ /rootBC /# lsbin dev exp init
21、rd lost+found mnt proc sbin tmp varboot etc home lib misc opt root tftpboot usr rootBC 01_hello# cd /exp/basic/02_pthread/rootBC 02_pthread# lsMakefile pthread.crootBC 02_pthread# makearmv4l-unknown-linux-gcc -c -o pthread.o pthread.carmv4l-unknown-linux-gcc -o ./bin/pthread pthread.o -lpthreadarmv4
22、l-unknown-linux-gcc -o pthread pthread.o -lpthreadrootBC 02_pthread# lsMakefile pthread pthread.c pthread.o (可以看到多了兩個(gè)文件)rootBC 02_pthread# 5.5在目標(biāo)系統(tǒng)上掛在linux下的文件連接網(wǎng)線,同時(shí)執(zhí)行:ping 3 (此處為測試目標(biāo)板和linux系統(tǒng)是否聯(lián)通)在linux里編寫代碼并用編譯器編譯 后通過NFS運(yùn)行調(diào)試。結(jié)果如下:虛擬機(jī)下:1.。rootBC 01_hello# makearmv4l-unknown-linux-gcc -c -o hello.o
23、 hello.carmv4l-unknown-linux-gcc -o ./bin/hello hello.oarmv4l-unknown-linux-gcc -o hello hello.orootBC 01_hello# lshello hello.c hello.o MakefilerootBC 01_hello#掛載:mount -t nfs -o nolock 3:/2410 /host目標(biāo)板環(huán)境下:/mnt/yaffsmount -t nfs -o nolock 3:/2410 /host/mnt/yaffslsCardII 2410 int_test mplayer videoQ
24、topia fingermap irda pc_cfcard webad fpga kbd_gpm sdcard yaffs.tar.bz2bluetooth gps_gprs keyboard soundcan iccard lib touchscreenda ide lost+found tube_testdc-motor init.sh miniprint uart485/mnt/yaffscd /host/hostls2410/hostcd 2410/exp/basic/exp/ basicls01_hello 05_da 09_dcmotor CAN kuozhan bin02_pt
25、hread 06_can 10_led Makefile exp_camera03_tty 07_httpd 11_int Makefile keyboard04_ad 08_485 12_pwm Rules.mak readme.txt/exp/ basiccd 01cd: 62: cant cd to 01/exp/ basiccd 01_hello/exp/ basic/01_hellolsMakefile hello hello.c hello.o/exp/ basicr/01_hellohello 直接運(yùn)行完畢!hello world /exp/ basic/01_hello 實(shí)驗(yàn)二
26、 Linux程序設(shè)計(jì)基礎(chǔ)C環(huán)境一、實(shí)驗(yàn)?zāi)康模菏煜inux開發(fā)環(huán)境。學(xué)習(xí)嵌入式開發(fā)的基本過程。了解makefile的基本內(nèi)容。二、基礎(chǔ)知識 C語言基礎(chǔ)知識。 掌握Linux環(huán)境下vi編譯器的使用方法。掌握Linux下的程序編譯與交叉編譯過程。三、實(shí)驗(yàn)環(huán)境 為了完成本實(shí)驗(yàn),以下硬件條件是必須的: UP-TECH S2410P270 DVP嵌入式實(shí)驗(yàn)平臺。 Pc機(jī)Pentium500以上,硬盤40GB以上,內(nèi)存128MB以上。 為了完成本實(shí)驗(yàn),以下軟件條件是必須的: PC機(jī)操作系統(tǒng)。RedHat,Linux 9.0。 ARM-Linux開發(fā)環(huán)境。四、實(shí)驗(yàn)背景知識1、C程序設(shè)計(jì)概述C語言和Linux
27、操作系統(tǒng)之間的關(guān)系非常密切。早在1977年,貝爾實(shí)驗(yàn)室的Dennis Ritchie就為了輔助開發(fā)Unix而發(fā)表了不依賴于具體機(jī)器系統(tǒng)的c語言編譯文本,即著名的ANSI C。從那時(shí)候起,C就成為世界上使用最廣泛計(jì)算機(jī)語言。2、vi編輯器使用簡介vi編輯器是所有Unix及Linux系統(tǒng)下標(biāo)準(zhǔn)的編輯器,它的強(qiáng)大不遜色于任何最新的文本編輯器,這里只是簡單地介紹一下它的用法和一小部分指令。由于對Unix及Linux系統(tǒng)的任何版本,vi編輯器是完全相同的,因此您可以在其他任何介紹vi的地方進(jìn)一步了解它。Vi也是Linux中最基本的文本編輯器,學(xué)會它后,您將在Linux的世界里暢行無阻。 (1)、vi的基
28、本概念 基本上vi可以分為三種狀態(tài),分別是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能區(qū)分如下: 命令行模式(command mode) 這是執(zhí)行vi后的缺省模式,此時(shí)鍵盤輸入當(dāng)作命令,且命令有大小寫之區(qū)分。該模式可以控制屏幕光標(biāo)的移動,字符、字或行的刪除,移動復(fù)制某區(qū)段及進(jìn)入Insert mode下,或者到 last line mode。插入模式(Insert mode) 命令行模式下使用 a、i、o、c、r、s 進(jìn)入插入模式,用戶輸入的任何字符都被vi當(dāng)做文件內(nèi)容保存起來,并將其顯示在屏幕上。只有在Inse
29、rt mode下,才可以做文字輸入,按ESC鍵可回到命令行模式。 底行模式(last line mode) 在命令行模式按下 : 即可進(jìn)入該模式。該模式用來進(jìn)行保存文件、打開文檔或環(huán)境的設(shè)定,書寫有大小寫之分。比如將文件保存或退出vi,也可以設(shè)置編輯環(huán)境,如尋找字符串、列出行號等。 不過一般我們在使用時(shí)把vi簡化成兩個(gè)模式,就是將底行模式(last line mode)也算入命令行模式command mode)。 (2)、vi的基本操作 A、進(jìn)入vi 在系統(tǒng)提示符號輸入vi及文件名稱后,就進(jìn)入vi全屏幕編輯畫面: $ vi myfile 有一點(diǎn)要特別注意,就是進(jìn)入vi之后,是處于命令行模式(c
30、ommand mode),必須要切換到插入模式(Insert mode)才能夠輸入文字。B、切換至插入模式(Insert mode)編輯文件 在命令行模式(command mode)下按一下字母i就可以進(jìn)入插入模式(Insert mode),這時(shí)候你就可以開始輸入文字了。 C、退出vi及保存文件 在命令行模式(command mode)下,按一下:冒號鍵進(jìn)入Last line mode,例如:: w filename (輸入 w filename將文章以指定的文件名filename保存) : wq (輸入wq,存盤并退出vi) : q! (輸入q!, 不存盤強(qiáng)制退出vi) (3)、命令行模式(
31、command mode)功能鍵 A、插入模式 按i :切換進(jìn)入插入模式insert mode,按“i”進(jìn)入插入模式后是從光標(biāo)當(dāng)前位置開始輸入文件; 按a :進(jìn)入插入模式后,是從目前光標(biāo)所在位置的下一個(gè)位置開始輸入文字; 按o :進(jìn)入插入模式后,是插入新的一行,從行首開始輸入文字。 B、從插入模式切換為命令行模式 按ESC鍵。 C、移動光標(biāo) vi可以直接用鍵盤上的光標(biāo)來上下左右移動,但正規(guī)的vi是用小寫英文字母h、j、k、l,分別控制光標(biāo)左、下、上、右移一格。 按ctrl+b:屏幕往“后”移動一頁。 按ctrl+f:屏幕往“前”移動一頁。 按ctrl+u:屏幕往“后”移動半頁。 按ctrl+d
32、:屏幕往“前”移動半頁。 按數(shù)字0:移到文章的開頭。 按G:移動到文章的最后。 按$:移動到光標(biāo)所在行的“行尾”。 按:移動到光標(biāo)所在行的“行首” 按w:光標(biāo)跳到下個(gè)字的開頭 按e:光標(biāo)跳到下個(gè)字的字尾 按b:光標(biāo)回到上個(gè)字的開頭 按#l:光標(biāo)移到該行的第#個(gè)位置,如:5l,56l。 D、刪除文字 x:每按一次,刪除光標(biāo)所在位置的“后面”一個(gè)字符。 #x:例如,6x表示刪除光標(biāo)所在位置的“后面”6個(gè)字符。 X:大寫的X,每按一次,刪除光標(biāo)所在位置的“前面”一個(gè)字符。 #X:例如,20X表示刪除光標(biāo)所在位置的“前面”20個(gè)字符。 dd:刪除光標(biāo)所在行。 #dd:從光標(biāo)所在行開始刪除#行 E、復(fù)制
33、 yw:將光標(biāo)所在之處到字尾的字符復(fù)制到緩沖區(qū)中。 #yw:復(fù)制#個(gè)字到緩沖區(qū) yy:復(fù)制光標(biāo)所在行到緩沖區(qū)。 #yy:例如,6yy表示拷貝從光標(biāo)所在的該行“往下數(shù)”6行文字。 p:將緩沖區(qū)內(nèi)的字符貼到光標(biāo)所在位置。注意:所有與“y”有關(guān)的復(fù)制命令都必須與“p”配合才能完成復(fù)制與粘貼功能。 F、替換 r:替換光標(biāo)所在處的字符。 R:替換光標(biāo)所到之處的字符,直到按下ESC鍵為止。 G、回復(fù)上一次操作 u:如果您誤執(zhí)行一個(gè)命令,可以馬上按下u,回到上一個(gè)操作。按多次“u”可以執(zhí)行多次回復(fù)。 H、更改 cw:更改光標(biāo)所在處的字到字尾處 c#w:例如,c3w表示更改3個(gè)字 I、跳至指定的行 ctrl+
34、g列出光標(biāo)所在行的行號。 #G:例如,15G,表示移動光標(biāo)至文章的第15行行首。 (4)、Last line mode下命令簡介 在使用last line mode之前,請記住先按ESC鍵確定您已經(jīng)處于command mode下后,再按:冒號即可進(jìn)入last line mode。 A、列出行號 set nu:輸入set nu后,會在文件中的每一行前面列出行號。 B、跳到文件中的某一行 #:#號表示一個(gè)數(shù)字,在冒號后輸入一個(gè)數(shù)字,再按回車鍵就會跳到該行了,如輸入數(shù)字15,再回車,就會跳到文章的第15行。 C、查找字符 /關(guān)鍵字:先按/鍵,再輸入您想尋找的字符,如果第一次找的關(guān)鍵字不是您想要的,可
35、以一直按n會往后尋找到您要的關(guān)鍵字為止。 ?關(guān)鍵字:先按?鍵,再輸入您想尋找的字符,如果第一次找的關(guān)鍵字不是您想要的,可以一直按n會往前尋找到您要的關(guān)鍵字為止。 D、保存文件 w:在冒號輸入字母w就可以將文件保存起來。 E、離開vi q:按q就是退出,如果無法離開vi,可以在q后跟一個(gè)!強(qiáng)制離開vi。 qw:一般建議離開時(shí),搭配w一起使用,這樣在退出的時(shí)候還可以保存文件。 (5)、vi命令列表 下表列出命令模式下的一些鍵的功能: h左移光標(biāo)一個(gè)字符 l右移光標(biāo)一個(gè)字符 k光標(biāo)上移一行 j光標(biāo)下移一行 光標(biāo)移動至行首 0數(shù)字“0”,光標(biāo)移至文章的開頭 G光標(biāo)移至文章的最后 $光標(biāo)移動至行尾 Ct
36、rl+f向前翻屏 Ctrl+b向后翻屏 Ctrl+d向前翻半屏 Ctrl+u向后翻半屏 i在光標(biāo)位置前插入字符 a在光標(biāo)所在位置的后一個(gè)字符開始增加 o插入新的一行,從行首開始輸入 ESC從輸入狀態(tài)退至命令狀態(tài) x刪除光標(biāo)后面的字符 #x刪除光標(biāo)后的個(gè)字符 X(大寫X),刪除光標(biāo)前面的字符 #X刪除光標(biāo)前面的#個(gè)字符 dd刪除光標(biāo)所在的行 #dd刪除從光標(biāo)所在行數(shù)的#行 yw復(fù)制光標(biāo)所在位置的一個(gè)字 #yw復(fù)制光標(biāo)所在位置的#個(gè)字 yy復(fù)制光標(biāo)所在位置的一行 #yy復(fù)制從光標(biāo)所在行數(shù)的#行 p 粘貼 u取消操作 cw更改光標(biāo)所在位置的一個(gè)字 #cw更改光標(biāo)所在位置的#個(gè)字 下表列出行命令模式下
37、的一些指令 w filename 儲存正在編輯的文件為filename wq filename儲存正在編輯的文件為filename,并退出vi q!放棄所有修改,退出vi set nu顯示行號 /或?查找,在/后輸入要查找的內(nèi)容 n與/或?一起使用,如果查找的內(nèi)容不是想要找的關(guān)鍵字,按n或向后(與/聯(lián)用)或向前(與?聯(lián)用)繼續(xù)查找,直到找到為止。對于第一次用vi,有幾點(diǎn)注意要提醒一下: 用vi打開文件后,是處于命令行模式(command mode),您要切換到插入模式(Insert mode)才能夠輸入文字。切換方法:在命令行模式(command mode)下按一下字母i就可以進(jìn)入插入模式(I
38、nsert mode),這時(shí)候你就可以開始輸入文字了。 編輯好后,需從插入模式切換為命令行模式才能對文件進(jìn)行保存,切換方法:按ESC鍵。 保存并退出文件:在命令模式下輸入:wq即可!(別忘了wq前面的:)3、gcc編譯器在Linux下,一般使用GNU C編譯器(GCC)進(jìn)行應(yīng)用程序的編譯。該編譯器建立在自由軟件基金會編程許可證的基礎(chǔ)上,可以自由發(fā)布。gcc 能夠編譯多種語言:C、C+ 和 Object C等。利用 gcc 命令可同時(shí)編譯并連接 C 和 C+ 源程序。也可以對幾個(gè) C 源文件利用 gcc 編譯、連接并生成可執(zhí)行文件。gcc可以使程序員靈活地控制編譯過程。編譯過程一般可以分為下面四
39、個(gè)階段,每個(gè)階段分別調(diào)用不同的工具進(jìn)行處理預(yù)處理鏈接編譯組譯源程序(*.c)可執(zhí)行文件預(yù)處理器編譯器組譯器連接器gcc的工作的四個(gè)階段第一階段:命令gcc首先調(diào)用cpp進(jìn)行預(yù)處理,在預(yù)處理過程中,對源代碼文件中的文件包含(include)、預(yù)編譯語句(如宏定義define等)進(jìn)行分析。第二階段:接著調(diào)用cc1進(jìn)行編譯,這個(gè)階段根據(jù)輸入文件生成以.o為后綴的目標(biāo)文件。第三階段:匯編過程是針對匯編語言的步驟,調(diào)用as進(jìn)行工作,一般來講,.S或.s為后綴的匯編語言源代碼文件匯編之后都生成以.o為后綴的目標(biāo)文件。第四階段:當(dāng)所有的目標(biāo)文件都生成之后,gcc就調(diào)用ld來完成最后的關(guān)鍵性工作,這個(gè)階段就是
40、連接。在連接階段,所有的目標(biāo)文件被安排在可執(zhí)行程序中的恰當(dāng)?shù)奈恢?,同時(shí),該程序所調(diào)用到的庫函數(shù)也從各自所在的函數(shù)庫中連到合適的地方。Linux系統(tǒng)中可執(zhí)行文件有兩種格式。第一種格式是a.out格式,這種格式用于早期的Linux系統(tǒng)以及 Unix系統(tǒng)的原始格式。a.out來自于Unix C編譯程序默認(rèn)的可執(zhí)行文件名。當(dāng)使用共享庫時(shí),a.out格式就會發(fā)生問題。把a(bǔ).out格式調(diào)整為共享庫是一種非常復(fù)雜的操作。因此,一種新的文件格式被引入U(xiǎn)nix系統(tǒng)5的第四版本和Solaris系統(tǒng)中。它被稱為可執(zhí)行和連接的格式(ELF)。這種格式很容易實(shí)現(xiàn)共享庫。ELF格式已經(jīng)被Linux系統(tǒng)作為標(biāo)準(zhǔn)的格式采用。
41、gcc編譯程序產(chǎn)生的所有的二進(jìn)制文件都是ELF格式的文件(即使可執(zhí)行文件的默認(rèn)名仍然是a.out)。較舊的a.out格式的程序仍然可以運(yùn)行在支持ELF格式的系統(tǒng)上。 GNU C編譯器(GCC)一般存放在/usr/bin目錄下;其頭文件一般存放在/usr/include及其下級子目錄里;而標(biāo)準(zhǔn)的庫文件則存放在1ih或usrhb子目錄里。gcc命令的基本用法如下所示:gcc options filenames說明:在gcc后面可以有多個(gè)編譯選項(xiàng),同時(shí)進(jìn)行多個(gè)編譯操作。很多的gcc選項(xiàng)包括一個(gè)以上的字符。因此必須為每個(gè)選項(xiàng)指定各自的連字符。例如,下面的兩個(gè)命令是不同的: gcc -p -g test
42、1.c gcc -pg test1.c當(dāng)你不用任何選項(xiàng)編譯一個(gè)程序時(shí),GCC將會建立(假定編譯成功)一個(gè)名為a.out的可執(zhí)行文件。 下表為常用的GCC選項(xiàng)-o -o 編譯選項(xiàng)將產(chǎn)生的可執(zhí)行文件指定一個(gè)文件名來代替 a.out。例:gcc o count count.c-c 告訴GCC僅把源代碼編譯為目標(biāo)代碼而跳過匯編和連接的步驟。這個(gè)選項(xiàng)使用的非常頻繁,因?yàn)樗沟镁幾g多個(gè)C程序時(shí)速度更快并且更易于管理。缺省時(shí)GCC建立的目標(biāo)代碼文件有一個(gè).o的擴(kuò)展名。例:gcc c test2.c-E只運(yùn)行 C 預(yù)編譯器。 -S編譯選項(xiàng)告訴 gcc 在為 C 代碼產(chǎn)生了匯編語言文件后停止編譯。-shared
43、生成共享目標(biāo)文件。通常用在建立共享庫時(shí)。 -static禁止使用共享連接。在gcc中用開關(guān)-Wall控制警告信息,使用示例命令如下: gcc Wall -o test3_1 test3_1.c-w 不生成任何警告信息。下面為GCC的查找選項(xiàng):gcc一般使用默認(rèn)路徑查找頭文件和庫文件。如果文件所用的頭文件或庫文件不在缺省目錄下,則編譯時(shí)要指定它們的查找路徑。-I選項(xiàng):指定頭文件的搜索目錄例:gcc I /export/home/st o test1 test1.c-L選項(xiàng):指定庫文件的搜索目錄例:gcc L /usr/X11/R6/lib o test1 test1.cgcc支持多個(gè)源文件生成一
44、個(gè)可執(zhí)行文件,方法如下:方法1:gcc Wall o mytest test1.c test2.c test3.c方法2:gcc-Wall -c test1.cgcc-Wall c test2.cgcc-Wall c test3.c gcc o mytest test1.o test2.o test3.ogcc的優(yōu)化選項(xiàng)可以使GCC在耗費(fèi)更多編譯時(shí)間和犧牲易調(diào)試性的基礎(chǔ)上產(chǎn)生更小更快的可執(zhí)行文件。這些選項(xiàng)中最典型的是-O和-O2選項(xiàng)。-O0 不進(jìn)行優(yōu)化處理。-O選項(xiàng):告訴GCC對源代碼進(jìn)行基本優(yōu)化。這些優(yōu)化在大多數(shù)情況下都會使程序執(zhí)行的更快。-O2選項(xiàng):告訴GCC 產(chǎn)生盡可能小和盡可能快的代碼
45、。-O2選項(xiàng)將使編譯的速度比使用-O時(shí)慢。但通常產(chǎn)生的代碼執(zhí)行速度會更快。-O3選項(xiàng):比 -O2 更進(jìn)一步優(yōu)化,包括 inline 函數(shù)。 Gcc可以使用版本選項(xiàng)查看或控制編譯器版本。-v選項(xiàng):用戶將會得到自己目前正在使用的gcc的版本及與版本相關(guān)的一些信息。 gcc -v 將得到如下結(jié)果: Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs gcc version 2.7.2-V 選項(xiàng):如果安裝了多個(gè)版本的gcc,并且想強(qiáng)制執(zhí)行其中的某個(gè)版本,可以用命令通知系統(tǒng)用戶要使用的版本。 gcc -V2.6.3 -vgcc還可
46、以使用調(diào)試選項(xiàng),gcc在進(jìn)行編譯的時(shí)候,在目標(biāo)文件(.o)和創(chuàng)建的可執(zhí)行文件中插入額外信息,這些額外信息使gdb能夠判斷編譯過的代碼和源代碼之間的關(guān)系。-g選項(xiàng):告訴GCC產(chǎn)生能被 GNU 調(diào)試器使用的調(diào)試信息以便調(diào)試你的程序。例:gcc g o test3 test3.c-pg選項(xiàng):告訴GCC在你的程序里加入額外的代碼,執(zhí)行時(shí),產(chǎn)生gprof用的剖析信息以顯示你的程序的耗時(shí)情況。使用gdb調(diào)試工具,命令行如下: 例:gcc ggdb3 o test3 test3.c 可以自己參考相關(guān)資料了解關(guān)于使用gdb調(diào)試程序的方法。4、 Makefile介紹make是一個(gè)命令工具,它讀入Makefile
47、的指令并按照其制定的規(guī)則執(zhí)行。Makefile文件中描述整個(gè)工程所有文件的編譯順序、編譯規(guī)則,并且擁有自己的書寫格式、關(guān)鍵字和函數(shù);而且在Makefile中可以使用系統(tǒng)shell所提供的任何命令來完成想要的工作,因此能夠大大提高編譯程序的效率。通過其自動化編譯的規(guī)則,只需要一個(gè)make命令,整個(gè)工程就可以自動完成全部編譯工作,因此在IDE開發(fā)環(huán)境中得到廣泛應(yīng)用,已經(jīng)成為一種工程方面的編譯方法默認(rèn)情況下,GNU make工具在當(dāng)前工作目錄中按如下順序搜索makefile:GNUmakefilemakefileMakefile雖然Makefile作為規(guī)則的優(yōu)先等級較低,不過由于Makefile的首
48、字母大寫,因此在當(dāng)前目錄下會優(yōu)先顯示,所以程序員往往會采用Makefile作為makefile文件。 makefile的基本結(jié)構(gòu)如下: target:dependency dependency (tab) 它包含target、dependency和command一個(gè)部分。具體如下所示: 一個(gè)目標(biāo)(target):最終需要?jiǎng)?chuàng)建的文件,包括可執(zhí)行文件或者目標(biāo)驅(qū)動文件等。目標(biāo)也可以是需要執(zhí)行的動作,如“clean”等。 一個(gè)或多個(gè)依賴文件(dependency):在創(chuàng)建target時(shí)需要用到的文件列表。 系列命令(command):make執(zhí)行的動作,即創(chuàng)建target文件所需要執(zhí)行的步驟。通常是把
49、指定文件編譯成目標(biāo)文件的編譯命令,每個(gè)命令占一行,且每個(gè)命令行的起始字符必須為TAB字符。 編譯的具體過程是:make工具首先讀取makefile中的規(guī)則,然后檢查該規(guī)則中的依賴文件與目標(biāo)文件的時(shí)間戳哪個(gè)更新一些,并根據(jù)規(guī)則鏈由下至上依次執(zhí)行編譯過程,直到最終的可執(zhí)行文件被重新連接完成為止。Makefile中的變量 Makefile里的變量類似一個(gè)環(huán)境變量。這些變量對大小寫敏感,一般使用大寫字母。 下面給出一個(gè)具體的makefile: OBJS=prog.o code.o #定義變量OBJS CC=gcc #定義變量CC test: $ (OBJS) $(CC) -o test $(OBJS)
50、 #gcc -o test prog.o code.o prog.o: prog.c prog.h code.h $(CC) o prog.c -o prog.o code.o: code.c code.h $(CC) -c code.c -o code.o clean: rm -f *.o顯然,在上述例子中,用戶白定義了CC和OBJS兩個(gè)變量,并且在之后的規(guī)則中使用$( )符號對其內(nèi)容進(jìn)行引用。除用戶自定義的變量外,make還允許使用如下類型的變量:環(huán)境變量:在啟動時(shí),make讀取系統(tǒng)當(dāng)前已定義的環(huán)境變量,并且創(chuàng)建與之同名同值的變量,因此用戶可以像在Shell中一樣在Makefile中引用環(huán)
51、境變量。需要注意的是,如果用戶在Makefile中定義了同名變量,那么用戶自定義變量將覆蓋同名的環(huán)境變量。預(yù)定義變量:GNU make主要的預(yù)定義變量如下表所示。表2-1 GNU make的預(yù)定義變量MakefiIe隱含規(guī)則在上述例子中,幾個(gè)產(chǎn)生目標(biāo)文件的命令都是從c源文件和相關(guān)文件通過編譯產(chǎn)生目標(biāo)文件。實(shí)際上,make完全可以更簡潔一些,make有一些稱為隱含規(guī)則的內(nèi)置規(guī)則,這些規(guī)則告訴make當(dāng)某些命令沒有被完整給出時(shí)應(yīng)該怎樣執(zhí)行。例如,把生成prog.o和code.o的命令從規(guī)則中刪除,make將會查找隱含規(guī)則,并執(zhí)行一個(gè)適當(dāng)?shù)拿?。由于這些命令往往會使用一些變量,因此可以通過改變這些變
52、量來定制make。像在前面的例子中所定義的那樣,make使用變量CC來定義編譯器,并且傳遞變量CFLAGS(編譯器參數(shù))、CPPFLAGS(c語言預(yù)處理器參數(shù))、TARGET-ARCH(目標(biāo)機(jī)器的結(jié)構(gòu)定義)給編譯器,然后加上編譯參數(shù)-c,變量$(第一個(gè)依賴文件名),改名參數(shù)-o以及變量$(目標(biāo)文件名)。 綜上所述,一個(gè)c編譯的具體命令將會是: $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET-ARCH) -c $ -o $ 使用隱含規(guī)則的例子如下所示: OBJS=prog.o code.o CC=gcc test: $(OBJS) $(CC) o $ $Prog.o:
53、prog.c prog.h code.h code.o: code.c code.h clean: rm f *.o五、實(shí)驗(yàn)內(nèi)容與步驟1、準(zhǔn)備工作建立相應(yīng)實(shí)驗(yàn)工作目錄:rootBC root# cd /homerootBC home# mkdir 02exprootBC home# cd 02exprootBC 02exp# mkdir pcrootBC 02exp# mkdir armrootBC 02exp# cd pcrootBC pc# pwd/home/02exp/pc2、VI編輯器的使用使用VI編輯器編輯下列幾個(gè)函數(shù)文件:hello.hstarfun.hhello.cstar.c具
54、體方法如下:rootBC pc# vi starfun.h按i進(jìn)入插入模式,輸入文件內(nèi)容完成后,按ESC鍵返回命令模式,輸入:qw保存退出。采用同樣的方法完成后其他文件的輸入。Starfun.h 文件內(nèi)容如下:/*starfun.h*/#ifndef STARFUN_H#define STARFUN_H#define NUM 4#define NUMBER 3int star1() int i,j,k;for(k=1;k=NUM;+k) for(i=1;i=(NUM-k);+i)printf( );for(j=1;j=0;-k) for(i=1;i=(NUMBER-k+1);+i) print
55、f( );for(j=1;j=(2*k-1);+j)printf(*);printf(n);return 0;#endifhello.h文件內(nèi)容如下:/*hello.h*/#ifndef HELLO_H#define HELLO_Hvoid hello() star1();printf(hello,my friendsn);#endifhello.c 文件內(nèi)容如下:void showhello() hello();star.c文件內(nèi)容如下:#include starfun.h#include hello.h#include int main() star1();star2();showhell
56、o();return 0;Vi編輯器的使用,在使用Vi編輯器的過程中,注意使用Vi的單行和多行復(fù)制命令,練習(xí)字符串查找替換命令,刪除一個(gè)字符,刪除光標(biāo)后整個(gè)內(nèi)容命令,刪除一行命令,恢復(fù)刪除,保存和退出命令等命令,并嘗試使用其他命令。掌握#ifndef STARFUN_H #define STARFUN_H的宏定義用法3、使用gcc編譯器編譯程序第一種方法:分步進(jìn)行1由star.c starfun.h 文件生成star.o 目標(biāo)文件gcc -c star.c -o star.o2由hello.c hello.h starfun.h生成hello.o目標(biāo)文件gcc -c hello.c -o he
57、llo.o3由hello.o star.o 生成應(yīng)用程序myproggcc star.o hello.o -o myprogrootlocalhost 01_hello# ./myprog * * * * * * * * *hello,my friends第二種方法:一條命令完成以上操作gcc star.c hello.c -o myprog體會gcc編譯器編譯的過程,并在實(shí)驗(yàn)報(bào)告中描述在以上編譯中嘗試rootlocalhost 01_hello# gcc star.c hello.c -o myprogrootlocalhost 01_hello# gcc -w star.c hello.c
58、 -o myprogrootlocalhost 01_hello# gcc -Wall star.c hello.c -o myprogIn file included from star.c:1:starfun.h: In function star1:starfun.h:13: warning: implicit declaration of function printfstar.c: In function main:star.c:8: warning: implicit declaration of function showhellohello.c: In function sho
59、whello:hello.c:4: warning: implicit declaration of function hello體會-Wll -w選項(xiàng)的作用查閱當(dāng)前的gcc版本命令rootlocalhost 01_hello# gcc -vReading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/specsConfigured with: ./configure -prefix=/usr -mandir=/usr/share/man -infodir=/usr/share/info -enable-shared -enable-t
60、hreads=posix -disable-checking -with-system-zlib -enable-_cxa_atexit -host=i386-redhat-linuxThread model: posixgcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)利用file命令查看程序編譯器所采用的版本與運(yùn)行的平臺。rootBC pc# file myprogmyprog: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux2.2.5, dyn
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 民宿產(chǎn)業(yè)收益分成及運(yùn)營管理合同
- 高精度工業(yè)金屬無損檢測膠片定期租賃服務(wù)合同
- 網(wǎng)絡(luò)信息安全等級保護(hù)產(chǎn)品定制與研發(fā)合同
- 全球礦產(chǎn)資源勘探成果分析與應(yīng)用合同
- 中轉(zhuǎn)庫合同范例
- 個(gè)人求購焦炭合同范例
- 供熱改造施工合同范例
- 公司加農(nóng)戶養(yǎng)鴨合同范例
- 買汽車有合同范例
- 下崗合同范例
- 08D800-6民用建筑電氣設(shè)計(jì)與施工室內(nèi)布線
- DL∕T 1938-2018 垃圾發(fā)電廠爐渣處理技術(shù)規(guī)范
- 無人機(jī)編隊(duì)技術(shù)的發(fā)展與應(yīng)用
- 基于源流梳理及名詞考據(jù)的仲景微汗法應(yīng)用闡釋與實(shí)證研究
- 湖南省矢量地圖課件模板(各市、區(qū)縣地圖-可編輯、配色)
- 《集成電路版圖設(shè)計(jì)》課程標(biāo)準(zhǔn)
- 解除獨(dú)家合同范本
- 黑龍江省公安機(jī)關(guān)人民警察初級執(zhí)法資格測試題
- 醫(yī)師執(zhí)業(yè)注冊變更健康體檢表
- 2023年四川省綿陽市中考數(shù)學(xué)試卷
- 畢業(yè)設(shè)計(jì)調(diào)研總結(jié)報(bào)告
評論
0/150
提交評論