当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]通过指定指令的vi操作练习,使读者能够熟练使用vi中的常见操作,并且熟悉vi的3种模式,如果读者能够熟练掌握实验内容中所要求的内容,则表明对vi的操作已经很熟练了。

3.7实验内容3.7.1vi使用练习

1.实验目的

通过指定指令的vi操作练习,使读者能够熟练使用vi中的常见操作,并且熟悉vi的3种模式,如果读者能够熟练掌握实验内容中所要求的内容,则表明对vi的操作已经很熟练了。

2.实验内容

(1)在“/root”目录下建一个名为“vi”的目录。

(2)进入“vi”目录。

(3)将文件“/etc/inittab”复制到“vi”目录下。

(4)使用vi打开“vi”目录下的inittab。

(5)设定行号,指出设定initdefault(类似于“id:5:initdefault”)的所在行号。

(6)将光标移到该行。

(7)复制该行内容。

(8)将光标移到最后一行行首。

(9)粘贴复制行的内容。

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

(11)将光标移动到最后一行的行尾。

(12)粘贴复制行的内容。

(13)光标移到“si::sysinit:/etc/rc.d/rc.sysinit”。

(14)删除该行。

(15)存盘但不退出。

(16)将光标移到首行。

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

(18)返回命令行模式。

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

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

(21)强制退出vi,不存盘。

分别指出每个命令处于何种模式下?

3.实验步骤

(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.实验结果

该实验的最终结果是对“/root/inittab”增加了一行复制的内容:“id:5:initdefault”。

3.7.2用gdb调试程序的bug1.实验目的

通过调试一个有问题的程序,使读者进一步熟练使用vi操作,而且熟练掌握gcc编译命令及gdb的调试命令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。这是一个很小的程序,只有35行,希望读者认真调试。

2.实验内容

(1)使用vi编辑器,将以下代码输入到名为greet.c的文件中。此代码的原意为输出倒序main函数中定义的字符串,但结果显示没有输出。代码如下所示:

#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”选项以方便之后的调试。

(3)运行生成的可执行文件,观察运行结果。

(4)使用gdb调试程序,通过设置断点、单步跟踪,一步步找出错误所在。

(5)纠正错误,更改源程序并得到正确的结果。

3.实验步骤

(1)在工作目录上新建文件greet.c,并用vi启动:vigreet.c。

(2)在vi中输入以上代码。

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

(4)用gcc编译:gcc-ggreet.c-ogreet。

(5)运行greet,使用命令“./greet”,输出为:

TheoriginalstringisEmbeddedLinux

Thestringafterwardis

可见,该程序没有能够倒序输出。

(6)启动gdb调试:gdbgreet。

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

(8)在30行(for循环处)设置断点,使用命令“b30”。

(9)在33行(printf函数处)设置断点,使用命令“b33”。

(10)查看断点设置情况,使用命令“infob”。

(11)运行代码,使用命令“r”。

(12)单步运行代码,使用命令“n”。

(13)查看暂停点变量值,使用命令“pstring2[size-i]”。

(14)继续单步运行代码数次,并检查string2[size-1]的值是否正确。

(15)继续程序的运行,使用命令“c”。

(16)程序在printf前停止运行,此时依次查看string2[0]、string2[1]…,发现string[0]没有被正确赋值,而后面的赋值都是正确的,这时,定位程序第31行,发现程序运行结果错误的原因在于“size-1”。由于i只能增到“size-1”,这样string2[0]就永远不能被赋值而保持NULL,故不能输出任何结果。

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

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

(19)使用gcc重新编译:gcc-ggreet.c-ogreet。

(20)查看运行结果:./greet

TheoriginalstringisEmbeddedLinux

ThestringafterwardisxuniLdeddedbmE

这时,输出结果正确。

4.实验结果

将原来有错的程序经过gdb调试,找出问题所在,并修改源代码,输出正确的倒序显示字符串的结果。

3.7.3编写包含多文件的makefile1.实验目的

通过对包含多文件的makefile的编写,熟悉各种形式的makefile,并且进一步加深对makefile中用户自定义变量、自动变量及预定义变量的理解。

2.实验过程

(1)用vi在同一目录下编辑两个简单的hello程序,如下所示:

#hello.c

#include"hello.h"

intmain()

{

printf("Helloeveryone!\n");

}

#hello.h

#include<stdio.h>

(2)仍在同一目录下用vi编辑makefile,且不使用变量替换,用一个目标体实现(即直接将hello.c和hello.h编译成hello目标体)。然后用make验证所编写的makefile是否正确。

(3)将上述makefile使用变量替换实现。同样用make验证所编写的makefile是否正确。

(4)编辑另一个makefile,取名为makefile1,不使用变量替换,但用两个目标体实现(也就是首先将hello.c和hello.h编译为hello.o,再将hello.o编译为hello),再用make的“-f”选项验证这个makefile1的正确性。

(5)将上述makefile1使用变量替换实现。

3.实验步骤

(1)用vi打开上述两个代码文件“hello.c”和“hello.h”。

(2)在shell命令行中用gcc尝试编译,使用命令:“gcchello.c–ohello”,并运行hello可执行文件查看结果。

(3)删除此次编译的可执行文件:rmhello。

(4)用vi编辑makefile,如下所示:

hello:hello.chello.h

gcchello.c-ohello

(5)退出保存,在shell中键入:make,查看结果。

(6)再次用vi打开makefile,用变量进行替换,如下所示:

OBJS:=hello.o

CC:=gcc

hello:$(OBJS)

$(CC)$^-o$@

(7)退出保存,在shell中键入make,查看结果。

(8)用vi编辑makefile1,如下所示:

hello:hello.o

gcchello.o-ohello

hello.o:hello.chello.h

gcc-chello.c-ohello.o

(9)退出保存,在shell中键入:make-fmakefile1,查看结果。

(10)再次用vi编辑makefile1,如下所示:

OBJS1:=hello.o

OBJS2:=hello.chello.h

CC:=gcc

hello:$(OBJS1)

$(CC)$^-o$@

$(OBJS1):$(OBJS2)

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

在这里请注意区别“$^”和“$<”。

(11)退出保存,在shell中键入make-fmakefile1,查看结果。

4.实验结果

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

3.7.4使用autotools生成包含多文件的makefile1.实验目的

通过使用autotools生成包含多文件的makefile,进一步掌握autotools的使用方法。同时,掌握Linux下安装软件的常用方法。

2.实验过程

(1)在原目录下新建文件夹auto。

(2)将上例的两个代码文件“hello.c”和“hello.h”复制到该目录下。

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

(4)编辑configure.scan,修改相关内容,并将其重命名为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可执行文件,并在当前目录下运行hello查看结果。

(12)使用makeinstall将hello安装到系统目录下,并运行,查看结果。

(13)使用makedist生成hello压缩包。

(14)解压hello压缩包。

(15)进入解压目录。

(16)在该目录下安装hello软件。

3.实验步骤

(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)运行:aclocal。

(7)运行:autoconf,并用ls查看是否生成了configure可执行文件。

(8)运行:autoheader。

(9)用vi编辑makefile.am文件为:

AUTOMAKE_OPTIONS=foreign

bin_PROGRAMS=hello

hello_SOURCES=hello.chello.h

(10)运行:automake,然后运行automake–a。

(11)运行:./configure。

(12)运行:make。

(13)运行:./hello,查看结果是否正确。

(14)运行:makeinstall。

(15)运行:hello,查看结果是否正确。

(16)运行:makedist。

(17)在当前目录下解压hello-1.0.tar.gz:tar–zxvfhello-1.0.tar.gz。

(18)进入解压目录:cd./hello-1.0。

(19)下面开始Linux下常见的安装软件步骤:./configure。

(20)运行:make。

(21)运行:./hello(在正常安装时这一步可省略)。

(22)运行:makeinstall。

(23)运行:hello,查看结果是否正确。

4.实验结果

能够正确使用autotools生成makefile,并且能够成功安装短小的hello软件。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭