當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]通過指定指令的vi操作練習(xí),使讀者能夠熟練使用vi中的常見操作,并且熟悉vi的3種模式,如果讀者能夠熟練掌握實(shí)驗(yàn)內(nèi)容中所要求的內(nèi)容,則表明對vi的操作已經(jīng)很熟練了。

3.7實(shí)驗(yàn)內(nèi)容3.7.1vi使用練習(xí)

1.實(shí)驗(yàn)?zāi)康?p>通過指定指令的vi操作練習(xí),使讀者能夠熟練使用vi中的常見操作,并且熟悉vi的3種模式,如果讀者能夠熟練掌握實(shí)驗(yàn)內(nèi)容中所要求的內(nèi)容,則表明對vi的操作已經(jīng)很熟練了。

2.實(shí)驗(yàn)內(nèi)容

(1)在“/root”目錄下建一個名為“vi”的目錄。

(2)進(jìn)入“vi”目錄。

(3)將文件“/etc/inittab”復(fù)制到“vi”目錄下。

(4)使用vi打開“vi”目錄下的inittab。

(5)設(shè)定行號,指出設(shè)定initdefault(類似于“id:5:initdefault”)的所在行號。

(6)將光標(biāo)移到該行。

(7)復(fù)制該行內(nèi)容。

(8)將光標(biāo)移到最后一行行首。

(9)粘貼復(fù)制行的內(nèi)容。

(10)撤消第9步的動作。

(11)將光標(biāo)移動到最后一行的行尾。

(12)粘貼復(fù)制行的內(nèi)容。

(13)光標(biāo)移到“si::sysinit:/etc/rc.d/rc.sysinit”。

(14)刪除該行。

(15)存盤但不退出。

(16)將光標(biāo)移到首行。

(17)插入模式下輸入“Hello,thisisviworld!”。

(18)返回命令行模式。

(19)向下查找字符串“0:wait”。

(20)再向上查找字符串“halt”。

(21)強(qiáng)制退出vi,不存盤。

分別指出每個命令處于何種模式下?

3.實(shí)驗(yàn)步驟

(1)mkdir/root/vi

(2)cd/root/vi

(3)cp/etc/inittab./

(4)vi./inittab

(5):setnu(底行模式)

(6)17<enter>(命令行模式)

(7)yy

(8)G

(9)p

(10)u

(11)$

(12)p

(13)21G

(14)dd

(15):w(底行模式)

(16)1G

(17)i并輸入“Hello,thisisviworld!”(插入模式)

(18)Esc

(19)/0:wait(命令行模式)

(20)?halt

(21):q!(底行模式)

4.實(shí)驗(yàn)結(jié)果

該實(shí)驗(yàn)的最終結(jié)果是對“/root/inittab”增加了一行復(fù)制的內(nèi)容:“id:5:initdefault”。

3.7.2用gdb調(diào)試程序的bug1.實(shí)驗(yàn)?zāi)康?p>通過調(diào)試一個有問題的程序,使讀者進(jìn)一步熟練使用vi操作,而且熟練掌握gcc編譯命令及gdb的調(diào)試命令,通過對有問題程序的跟蹤調(diào)試,進(jìn)一步提高發(fā)現(xiàn)問題和解決問題的能力。這是一個很小的程序,只有35行,希望讀者認(rèn)真調(diào)試。

2.實(shí)驗(yàn)內(nèi)容

(1)使用vi編輯器,將以下代碼輸入到名為greet.c的文件中。此代碼的原意為輸出倒序main函數(shù)中定義的字符串,但結(jié)果顯示沒有輸出。代碼如下所示:

#include<stdio.h>

intdisplay1(char*string);

intdisplay2(char*string);

intmain()

{

charstring[]="EmbeddedLinux";

display1(string);

display2(string);

}

intdisplay1(char*string)

{

printf("Theoriginalstringis%s\n",string);

}

intdisplay2(char*string1)

{

char*string2;

intsize,i;

size=strlen(string1);

string2=(char*)malloc(size+1);

for(i=0;i<size;i++)

{

string2[size-i]=string1[i];

}

string2[size+1]='';

printf("Thestringafterwardis%s\n",string2);

}

(2)使用gcc編譯這段代碼,注意要加上“-g”選項(xiàng)以方便之后的調(diào)試。

(3)運(yùn)行生成的可執(zhí)行文件,觀察運(yùn)行結(jié)果。

(4)使用gdb調(diào)試程序,通過設(shè)置斷點(diǎn)、單步跟蹤,一步步找出錯誤所在。

(5)糾正錯誤,更改源程序并得到正確的結(jié)果。

3.實(shí)驗(yàn)步驟

(1)在工作目錄上新建文件greet.c,并用vi啟動:vigreet.c。

(2)在vi中輸入以上代碼。

(3)在vi中保存并退出,使用命令“:wq”。

(4)用gcc編譯:gcc-ggreet.c-ogreet。

(5)運(yùn)行g(shù)reet,使用命令“./greet”,輸出為:

TheoriginalstringisEmbeddedLinux

Thestringafterwardis

可見,該程序沒有能夠倒序輸出。

(6)啟動gdb調(diào)試:gdbgreet。

(7)查看源代碼,使用命令“l”。

(8)在30行(for循環(huán)處)設(shè)置斷點(diǎn),使用命令“b30”。

(9)在33行(printf函數(shù)處)設(shè)置斷點(diǎn),使用命令“b33”。

(10)查看斷點(diǎn)設(shè)置情況,使用命令“infob”。

(11)運(yùn)行代碼,使用命令“r”。

(12)單步運(yùn)行代碼,使用命令“n”。

(13)查看暫停點(diǎn)變量值,使用命令“pstring2[size-i]”。

(14)繼續(xù)單步運(yùn)行代碼數(shù)次,并檢查string2[size-1]的值是否正確。

(15)繼續(xù)程序的運(yùn)行,使用命令“c”。

(16)程序在printf前停止運(yùn)行,此時依次查看string2[0]、string2[1]…,發(fā)現(xiàn)string[0]沒有被正確賦值,而后面的賦值都是正確的,這時,定位程序第31行,發(fā)現(xiàn)程序運(yùn)行結(jié)果錯誤的原因在于“size-1”。由于i只能增到“size-1”,這樣string2[0]就永遠(yuǎn)不能被賦值而保持NULL,故不能輸出任何結(jié)果。

(17)退出gdb,使用命令“q”。

(18)重新編輯greet.c,把其中的“string2[size-i]=string1[i]”改為“string2[size–i-1]=string1[i];”即可。

(19)使用gcc重新編譯:gcc-ggreet.c-ogreet。

(20)查看運(yùn)行結(jié)果:./greet

TheoriginalstringisEmbeddedLinux

ThestringafterwardisxuniLdeddedbmE

這時,輸出結(jié)果正確。

4.實(shí)驗(yàn)結(jié)果

將原來有錯的程序經(jīng)過gdb調(diào)試,找出問題所在,并修改源代碼,輸出正確的倒序顯示字符串的結(jié)果。

3.7.3編寫包含多文件的makefile1.實(shí)驗(yàn)?zāi)康?p>通過對包含多文件的makefile的編寫,熟悉各種形式的makefile,并且進(jìn)一步加深對makefile中用戶自定義變量、自動變量及預(yù)定義變量的理解。

2.實(shí)驗(yàn)過程

(1)用vi在同一目錄下編輯兩個簡單的hello程序,如下所示:

#hello.c

#include"hello.h"

intmain()

{

printf("Helloeveryone!\n");

}

#hello.h

#include<stdio.h>

(2)仍在同一目錄下用vi編輯makefile,且不使用變量替換,用一個目標(biāo)體實(shí)現(xiàn)(即直接將hello.c和hello.h編譯成hello目標(biāo)體)。然后用make驗(yàn)證所編寫的makefile是否正確。

(3)將上述makefile使用變量替換實(shí)現(xiàn)。同樣用make驗(yàn)證所編寫的makefile是否正確。

(4)編輯另一個makefile,取名為makefile1,不使用變量替換,但用兩個目標(biāo)體實(shí)現(xiàn)(也就是首先將hello.c和hello.h編譯為hello.o,再將hello.o編譯為hello),再用make的“-f”選項(xiàng)驗(yàn)證這個makefile1的正確性。

(5)將上述makefile1使用變量替換實(shí)現(xiàn)。

3.實(shí)驗(yàn)步驟

(1)用vi打開上述兩個代碼文件“hello.c”和“hello.h”。

(2)在shell命令行中用gcc嘗試編譯,使用命令:“gcchello.c–ohello”,并運(yùn)行hello可執(zhí)行文件查看結(jié)果。

(3)刪除此次編譯的可執(zhí)行文件:rmhello。

(4)用vi編輯makefile,如下所示:

hello:hello.chello.h

gcchello.c-ohello

(5)退出保存,在shell中鍵入:make,查看結(jié)果。

(6)再次用vi打開makefile,用變量進(jìn)行替換,如下所示:

OBJS:=hello.o

CC:=gcc

hello:$(OBJS)

$(CC)$^-o$@

(7)退出保存,在shell中鍵入make,查看結(jié)果。

(8)用vi編輯makefile1,如下所示:

hello:hello.o

gcchello.o-ohello

hello.o:hello.chello.h

gcc-chello.c-ohello.o

(9)退出保存,在shell中鍵入:make-fmakefile1,查看結(jié)果。

(10)再次用vi編輯makefile1,如下所示:

OBJS1:=hello.o

OBJS2:=hello.chello.h

CC:=gcc

hello:$(OBJS1)

$(CC)$^-o$@

$(OBJS1):$(OBJS2)

$(CC)-c$<-o$@

在這里請注意區(qū)別“$^”和“$<”。

(11)退出保存,在shell中鍵入make-fmakefile1,查看結(jié)果。

4.實(shí)驗(yàn)結(jié)果

各種不同形式的makefile都能正確地完成其功能。

3.7.4使用autotools生成包含多文件的makefile1.實(shí)驗(yàn)?zāi)康?p>通過使用autotools生成包含多文件的makefile,進(jìn)一步掌握autotools的使用方法。同時,掌握Linux下安裝軟件的常用方法。

2.實(shí)驗(yàn)過程

(1)在原目錄下新建文件夾auto。

(2)將上例的兩個代碼文件“hello.c”和“hello.h”復(fù)制到該目錄下。

(3)使用autoscan生成configure.scan。

(4)編輯configure.scan,修改相關(guān)內(nèi)容,并將其重命名為configure.in。

(5)使用aclocal生成aclocal.m4。

(6)使用autoconf生成configure。

(7)使用autoheader生成config.h.in。

(8)編輯makefile.am。

(9)使用automake生成makefile.in。

(10)使用configure生成makefile。

(11)使用make生成hello可執(zhí)行文件,并在當(dāng)前目錄下運(yùn)行hello查看結(jié)果。

(12)使用makeinstall將hello安裝到系統(tǒng)目錄下,并運(yùn)行,查看結(jié)果。

(13)使用makedist生成hello壓縮包。

(14)解壓hello壓縮包。

(15)進(jìn)入解壓目錄。

(16)在該目錄下安裝hello軟件。

3.實(shí)驗(yàn)步驟

(1)mkdir./auto。

(2)cphello.*./auto(假定原先在“hello.c”文件目錄下)。

(3)命令:autoscan。

(4)使用vi編輯configure.scan為:

#-*-Autoconf-*-

#Processthisfilewithautoconftoproduceaconfigurescript.

AC_PREREQ(2.59)

AC_INIT(hello,1.0)

AM_INIT_AUTOMAKE(hello,1.0)

AC_CONFIG_SRCDIR([hello.h])

AC_CONFIG_HEADER([config.h])

#Checksforprograms.

AC_PROG_CC

#Checksforlibraries.

#Checksforheaderfiles.

#Checksfortypedefs,structures,andcompilercharacteristics.

#Checksforlibraryfunctions.

AC_OUTPUT(makefile)

(5)保存退出,并重命名為configure.in。

(6)運(yùn)行:aclocal。

(7)運(yùn)行:autoconf,并用ls查看是否生成了configure可執(zhí)行文件。

(8)運(yùn)行:autoheader。

(9)用vi編輯makefile.am文件為:

AUTOMAKE_OPTIONS=foreign

bin_PROGRAMS=hello

hello_SOURCES=hello.chello.h

(10)運(yùn)行:automake,然后運(yùn)行automake–a。

(11)運(yùn)行:./configure。

(12)運(yùn)行:make。

(13)運(yùn)行:./hello,查看結(jié)果是否正確。

(14)運(yùn)行:makeinstall。

(15)運(yùn)行:hello,查看結(jié)果是否正確。

(16)運(yùn)行:makedist。

(17)在當(dāng)前目錄下解壓hello-1.0.tar.gz:tar–zxvfhello-1.0.tar.gz。

(18)進(jìn)入解壓目錄:cd./hello-1.0。

(19)下面開始Linux下常見的安裝軟件步驟:./configure。

(20)運(yùn)行:make。

(21)運(yùn)行:./hello(在正常安裝時這一步可省略)。

(22)運(yùn)行:makeinstall。

(23)運(yùn)行:hello,查看結(jié)果是否正確。

4.實(shí)驗(yàn)結(jié)果

能夠正確使用autotools生成makefile,并且能夠成功安裝短小的hello軟件。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉