嵌入式Linux操作系统实验3
实验三 嵌入式Linux驱动(1)
实验三嵌入式Linux驱动(1)一、【实验目的】1)熟悉嵌入式Linux驱动程序编写框架。
2)了解七段数码管驱动程序的工作原理,熟练掌握该驱动程序在嵌入式开发平台的移植和注册使用。
二、【实验内容】1)学习Linux驱动源代码,分析代码中各个函数模块的功能作用。
2)在宿主机上交叉编译七段数码管驱动程序,然后移植到目标机上。
3)在目标机上注册驱动程序,验证驱动的功能。
三、【实验步骤】1.了解七段数码管工作原理七段数码管是显示数字的电子元件,因为借助七个发光二极管以不同组合来显示数字,所以称为七段数码管(如图1)。
七段数码管分为共阴极和共阳极,共阳极的七段数码管的正极(或者阳极)为八个发光二极管的共有正极,其他接点为独立发光二极管的负极(或者阴极),使用者只需要把正极接电,不同的负极接地就可以控制七段数码管显示不同的数字。
共阴极的七段数码管与共阳极的只是接电的接法相反而已。
图12.开发板七段数码管电路介绍开发板上有四个七段共阴数码管,2个一组,第一组七段数码管使用系统LED_CS2作为其位选使能信号,两个数码管的段选信号分别使用数据总线的D0~D7位和D8~D15位,如图2所示。
图2第二组七段数码管使用系统LED_CS3作为其位选使能信号,两个数码管的段选信号分别使用数据总线的D0~D7位和D8~D15位,如图3所示。
图3分析可知,对七段数码管的操作主要是对其位选和段选信号的控制。
其中位选信号决定显示哪个七段数码管,段选信号决定其显示的字型信息(共阴极七段数码管段选控制信息如表1),这也是驱动程序和硬件关联的主要部分。
表13.七段数码管驱动程序分析1)添加驱动程序所需的头文件和变量:SEG_CS1和SEG_CS2就是上面硬件接口所提及的两组七段数码管的位选使能信号,LED[10]数组中保存的就是在共阴极数码管上面显示0~9的段选信号。
Seg这个结构体用于保存4个数码管即时显示的数字的段选信号。
#include <linux/module.h>#include <linux/kernel.h>#include <asm/io.h>#include <asm/uaccess.h>#include <linux/fs.h>MODULE_LICENSE("GPL");//用于声明描述内核模块的许可权限,如果不声明LICENSE,模块被加载时将收到内核被污染(kernel tainted)的警告char LED_MODULE=0;#define DEVICE_NAME "xidian_seg7"#define SEG_CS1 0x10300000#define SEG_CS2 0x10400000static char LED[10]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7F, 0x6F}; unsigned long *CS1_Address, *CS2_Address;structseg{char LED1_Val;char LED2_Val;char LED3_Val;char LED4_Val;char negative;};2)同时更新所有七段数码管驱动显示函数:CS1_address对应第一组七段数码管的位选信号,该组第一个数码管的段选信号保存在short变量的低8位,该组第二个数码管的段选信号保存在short变量的高8位。
嵌入式操作系统实验指导书
《嵌入式操作系统》实验指导书实验1 Linux编程基础实验序号:1 实验名称:Linux编程基础适用专业:计算机科学与技术、通信工程学时数:4学时一、实验目的1、熟悉Vim的工作模式,熟练使用vim中的常见操作。
2、熟练掌握gcc编译命令及gdb的调试命令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。
3、熟悉多文件的makefile的编写,熟悉各种形式的makefile,并且进一步加深对makefile中用户自定义变量、自动变量的理解。
4、使用autotools生成多文件的makefile,进一步掌握autotools的使用方法。
二、实验内容1、vim使用练习(1)在“/root”目录下建一个名为“vim”的目录。
(2)进入“vim”目录。
(3)将文件“/etc/inittab”复制到“vim”目录下。
(4)使用vim打开“vim”目录下的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,this is vi world!”.(18)返回命令行模式。
(19)向下查找字符串“0:wait”。
(20)再向上查找字符串“halt”。
(21)强制退出vim,不存盘。
2、用gdb调试程序的bug(1)使用vi编辑器,将以下代码输入到名为greet.c的文件中。
此代码的原意为输出倒序main函数中定义的字符串,但结果显示没有输出,代码如下所示。
#include<stdio.h>int display1(char *string);int display2(char *string);int main(){char string[]=”Embedded Linux”;display1(string);display2(string);}int display1(char *string){printf(“The original string is %s \n”,string);}int display2(char *string1){char *string2;int size,i;size=strlen(string1);string2=(char *)malloc(size+1);for (i=0,i<size;i++){string2[size-i]=string[i];}string2[size+1]=’’;printf(“The string afterward is %s\n”,string2);}(2)使用gcc编译这段代码,注意要加上“-g”选项以方便之后的调试。
嵌入式linux系统实验指导书0909
《嵌入式Linux系统》课程配套实验实验指导书湖北经济学院电子工程系2009年8月目录实验一Linux 系统安装与简单配置 (3)实验二常用命令使用 (4)实验三 vi编辑器 (6)实验四 shell编程 (11)实验五常用开发工具 (17)实验六 Linux 内核编译实验 (22)实验七建立嵌入式文件系统实验 (30)实验八制作交叉编译器 (35)实验一Linux 系统安装与简单配置(2学时)一、实验目的1.学会在操作系统安装之前,根据硬件配置情况,制订安装计划。
2.掌握多操作系统安装前,利用硬盘分区工具(如PQMagic) 为Linux准备好分区。
3.掌握Linux操作系统的安装步骤。
4.掌握Linux系统的简单配置方法。
5.掌握Linux系统的启动、关闭步骤。
二、实验内容1.安装并使用硬盘分区工具(如PQMagic),为Linux准备好分区。
2.安装Linux系统(如红旗Linux桌面版)。
3.配置Linux系统运行环境。
4.正确地启动、关闭系统。
三、主要实验步骤1.制订安装计划。
2.如果在机器上已安装了Windows系统,没有给Linux预备硬盘分区,则安装硬盘分区工具(如PQMagic),运行它,为Linux划分出一块“未分配”分区。
3.在光驱中放入Linux系统安装盘,启动系统。
按照屏幕提示,选择/输入相关参数,启动安装过程。
4.安装成功后,退出系统,取出安装盘。
重新开机,登录Linux系统。
5.对Linux系统进行配置,包括显示设备、打印机等。
6。
安装软件工具和开发工具(利用工具软件盘和开发软件盘)。
四、说明1.本实验应在教师的授权和指导下进行,不可擅自操作,否则可能造成原有系统被破坏。
2.如条件不允许每个学生亲自安装,可采用分组进行安装或课堂演示安装的方式。
实验二常用命令使用(2学时)一、实验目的1.掌握Linux一般命令格式。
2.掌握有关文件和目录操作的常用命令。
3.掌握有关进程操作的常用命令。
嵌入式实验三报告
实验三一、实验内容:1.熟悉开发板2.学会制作用于安装系统的SD卡等3.配置NFS服务二.步骤1.熟悉开发板结合Tiny4412用户手册第一章的Tiny4412开发板介绍熟悉开发板的构造。
2.准备工作结合Tiny4412用户手册第二章的内容,熟悉开发板的启动模式,设置超级终端,制作SD卡,linux系统烧写,使用minitools工具快速刷系统,使用USB烧写系统,使用MINItools工具烧写系统。
注意:在制作SD卡前,首先参考Tiny4412用户手册第49页,恢复SD卡到原始状态。
然后在开始按照45页的内容制作SD卡。
3.使用minicom操作开发板(串口或U转串模式)4.主机(Windows)、虚拟机(Ubuntu 终端、宿主机)、开发板之间的互ping——Bridged方式1.设置主机IP地址(有线网卡)2.虚拟机(Ubuntu 终端、宿主机)(1)编辑虚拟网络,指定有线网卡(2)设置网络适配器(3) 设置IP地址3. 将开发板连接上主机,测试互ping (1)虚拟机ping主机(Windows)(2)虚拟机ping开发板和主机(3)主机ping虚拟机和开发板(3)开发板ping主机和虚拟机(宿主机)5.配置NFS服务nfs服务,制作根文件系统时才算是真正用上它了,通过它“挂载”制作好的根文件系统。
它在嵌入式中的角色可用下图说明。
用网线将主机与开发板连接起来,主机开启nfs服务后,就可以像tftp一样传文件到开发板了。
NFS服务器安装配置实现Ubuntu 12.04与ARM文件共享实现步骤:1.服务器端:sudo apt-get install portmap2.服务器端:sudo apt-get install nfs-kernel-server3.服务器端配置:sudo gedit /etc/exports添加:/home/share 192.168.1.*(rw,sync,no_root_squash)(共享目录) (允许IP)(rw权限是可擦写,还有ro只读,sync代表数据会同步写入到内存与硬盘中,async则代表数据会先暂存于内存当中,而非直接写入硬盘,开放客户端使用root身份来操作服务器的文件系统,那么开no_root_squash才行,root_squash不允许)4.服务器端启动:sudo /etc/init.d/rpcbind restart5.服务器端启动:sudo /etc/init.d/nfs-kernel-server restart6.arm板连接时:主机:sudo ifconfig eth0 192.168.1.101 netmask 255.255.255.0arm板:ifconfig eth0 192.168.1.102 netmask 255.255.255.07.arm板上mount:mount -t nfs 192.168.1.101:/home/share /mnt/hosts(主机IP和共享目录) (arm板目录)mount上之后arm板上文件自动同步(1.出现问题:reason given by server: Permission denied解决:服务器端启动一定要sudo启动,不然启动失败,服务拒绝2.出现问题:svc: failed to register lockdv1 RPC service (errno 111).lockd_up: makeso、ck failed, error=-111mount: mounting 192.168.1.101:/home/share on /mnt/hosts failed: Connection refused则改成:mount -t nfs -o nolock 192.168.1.101:/home/share /mnt/hosts3.出现问题:mount: mounting 192.168.1.101:/home/share on /mnt/hosts failed: Device or resource busy解决:mount上之后在进行mount命令会出现此提示,设备正在运行,不用再次mount如果想再次mount可以先umount /mnt/hosts)。
嵌入式微处理器实验指导(实验一、二、三、四、五)
实验一、Linux常用命令及工具【实验目的】熟悉Linux常用命令及工具的使用,特别是常用命令的关键选项及用法需要熟悉。
【实验内容】1. 在老师讲解下掌握Linux常用命令和工具的用法;2. 打开虚拟机ubuntu的Terminal,进行命令的练习和熟悉;3. 截图保存相关界面;【实验准备】1. 熟悉Ubuntu虚拟机的安装和使用。
2. 熟悉Linux常用命令和工具。
【实验报告要求】1. 分别叙述Linux常用命令、ctags+vim工具的功能和一般用法,包括常用选项。
2. 需要有实验记录。
【实验步骤】一、常用命令用法:1、对于不熟悉的命令请查看网页:/2、ls的功能及常用选项,当以长格式显示目录下的内容列表时,输出的信息从左到右依次包括文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后修改时间、文件名等,对于文件类型和权限模式需要熟悉;3、cd的功能及常用选项:-、/、~、.、..各表示什么意思?4、mkdir、cp、mv、rm、pwd的功能及常用选项;5、chmod的功能及常用选项;6、find的功能及常用选项;7、grep的功能及常用选项;8、tar的功能及常用选项。
二、常用工具的安装和熟悉1、下载ctags-5.8.tar.gz和vim-6.4.tar.bz2文件,复制到虚拟机的root目录下,用tar解压缩,然后安装。
安装方法如下:1)进入源代码根目录执行./configure,2)然后执行make,3)编译成功后执行make install。
2、进入/opt/WXL/wxl210/linux2.6.35wxl210exp20131202路径下,运行命令:ctags –R *然后运行:vi –t WXL_hello_init就能定位到WXL_hello_init函数定义的代码处,熟悉此文档中的代码并理解。
注意Ctrl + ]和Ctrl + T的用法。
3、将vimrc文件复制到虚拟机/root目录下,改名为.vimrc。
《嵌入式操作系统》实验报告
..
..
..
..
..
思考:如何能在 Linux 系统启动时,输出显示自定义的文本信息,请修改 码,完成此功能。
Linux 核启动代
..
..
..
..
..
5. 实验中遇到的问题及解决方法
在 实 验 中 遇 到 一 些 问 题 , 例 如 在 复 制 的 时 候 我 记 得 原 来 用 cp
–
a /tmp/linux-2.4.18-br.tar.gz
} module_init(hello_init);
module_exit(hello_exit);
..
..
..
..
..
有关驱动程序的编写规, 请参考课程教材, 本实验只在编写简单的驱动 ( 核 ) 程序并加入 到 Linux 核目录树中,使用户熟悉编译核的过程。该驱动程序是向终端输出相关程序信息。 编写好 helloworld.c 后将其拷贝到核源码树的 drivers/char/ 目录下。
obj-$(CONFIG_PPDEV)
+= ppdev.o
(4) 、运行 make menuconfig 配置核对 helloworld 程序的支持 :
[rootlocalhost linux-2.6.35.7]# make distclean [rootlocalhost linux-2.6.35.7]# make menuconfig
[rootlocalhost
/]#
cp
/UP-Magic210/SRC/kernel/linux-2.6.35.7/drivers/char/
helloworld.c
(2) 、进入实验核源码目录修改 driver/char/ 添加 helloworld 程序的菜单支持
嵌入式实验报告三
嵌入式实验报告三一、实验目的:1.学习cygwin;2.通过上机实验,使学生验证、巩固和充实所学理论知识,加深对相关内容的理解,了解嵌入式Linux的内核布局,掌握内核配置及编译方法。
二、实验要求:1.安装cygwin及内核源码;2.配置基于S3c2410处理器的内核选项。
3.编译生成zImage。
三、问题:1.简述嵌入式开发中和体系结构相关的内核布局,说明哪些目录是在内核移植中需要重点关注的。
linux内核主要由5个模块构成:进程控制模块,内存管理模块,文件系统模块,进程间通信模块和网络接口模块。
这几个模块的相互关系如下图,虚线和虚线框表示在该版本中还未实现的:可以看到所有的模块都与进程调度有关,它们都需要依靠进程调度程序来挂起(暂停)或重新运行它们的进程。
下图是内核结构图:2.简述内核编译的步骤和对应命令的作用,说明zImage、bzImage的异同。
1.安装cygwin安装路径d:\cygwin选择全部安装All2.准备文件复制linux-2.4.18-rmk7-pxa1-mz5.tar --> /tmp/edukit-2410复制\patch --> /tmp/edukit-2410复制cross-armtools-linux-edukit2410.tar --> /tmp安装交叉编译工具&设置系统环境$> cd /tmp/$> tar -P -xvjf cross-armtools-linux-edukit2410.tar.bz2$> ls!- armtools-linux ! !/tmp/$> source armtools-linux/cross-install.sh$> ls /usr!- arm-linux !- !/usr/3.安装内核源码包tar -xvjf /tmp/edukit-2410/linux-2.4.18-rmk7-pxa1-mz5.tar.bz24.安装内核补丁patch -p1 < /tmp/edukit-2410/patch/kitii.patch 5. 编译生成内核make xconfig或make menuconfig选择合适的配置文件或者自己进行相应的配置Make depMake zImage6. 检测生成的内核镜像是否存在/arch/arm/bootbzImage和zImage的区别来自于保护模式代码的放置位置:1. 众所周知,内核映像包括两部分代码:实模式代码和保护模式代码,当引导装载器装载内核映像到代码段内存时,分别放置实模式代码和保护模式代码到不同的位置,然后进入实模式代码执行,实模式代码执行中转入CPU保护模式,开始执行32位保护模式代码。
嵌入式Linux操作系统实验3资料
实验3-1 Vi使用●实验目的:学会用vi编辑器●实验要求:熟练使用该节所介绍的vi创建、编辑、保存文件●实验器材:软件:1.安装了Ubunt的vmware虚拟机硬件:PC机一台●实验步骤:1. 在当前目录下键入命令vi hello.c创建名为hello.c的文上图是在命令行模式下2. 键入i进入插入模式3. 在插入模式下输入文字hello word!4. 按[Esc]键退出到命令行模式5. 按shift+;键,即:键进入底行模式6. 键入wq保存退出7. 将文件/etc/samba/smb.conf拷贝到当前目录下,下面的实验步骤是为了让大家能够熟练使用vi中的常见操作。
命令:cp /etc/samba/smb.conf ./8. 用vi打开文件smb.conf,设定显示行号,指出“ShareDefinitiongs”的所在行号在底行模式下,输入:set nu显示行号这样就可以看到“Share Definitions”所在的行为246行。
9. 将光标移动到248行命令:248G即在命令行模式下输入248shitf+g10. 复制改行以下6行内容命令:6yy11. 将光标移动到最后一行行首命令:G,即shift+g12. 粘贴复制的内容命令:p13. 删除12步粘贴的6行命令:6dd14. 撤销第13步的操作命令:u15. 查找字符串“Share Definitions”命令:/Share Definitions16. 强制退出vi,不存盘命令::q!17. 总结:对vi编辑的使用必须非常的熟练,因为vi编辑器是非常常用的。
以后编辑程序、查看文档、修改配置文件等操作都会用到,所以大家要多练习。
实验3-2 Gcc程序编译∙实验目的:学会使用gcc编译器及各种常用编译选项的使用理解库设计的功能:1)代码的封装保密 2)代码模块化设计∙实验要求:1、编写一应用程序,使用gcc进行编译,并分别使用-o,-g,-static,-o2等选项2、静态库和动态库的使用∙实验器材:软件:安装了ubunt 12.4的vmware虚拟机硬件:PC机一台∙第1题实验步骤:∙先用vi编辑hello.c文件,内容如下:int sum_int(int a, int b){return a+b;}int main(){int a=2,b=3,c;c=sum_int(a, b);printf(“sum of a and b is %d\n”,c);}gcc指令的一般格式为:gcc [选项] 要编译的文件[选项] [目标文件]例:使用gcc编译命令,编译hello.c生成可执行文件hello,并运行hello命令:#gcc hello.c –o hello上面的命令一步由.c文件生成了可执行文件,将gcc的四个编译流程:预处理、编译、汇编、链接一步完成,下面将介绍四个流程分别做了什么工作。
嵌入式linux实验报告
嵌入式linux实验报告嵌入式Linux实验报告一、引言嵌入式系统是指嵌入在各种设备中的计算机系统,它通常包括硬件和软件两部分。
而Linux作为一种开源的操作系统,被广泛应用于嵌入式系统中。
本实验报告将介绍嵌入式Linux的相关实验内容和实验结果,以及对实验过程中遇到的问题的解决方法。
二、实验目的本次实验旨在通过搭建嵌入式Linux系统,了解Linux在嵌入式领域的应用,并掌握相关的配置和调试技巧。
具体目标如下:1. 理解嵌入式系统的基本概念和原理;2. 掌握Linux内核的编译和配置方法;3. 熟悉交叉编译环境的搭建和使用;4. 实现简单的应用程序开发和调试。
三、实验环境1. 硬件环境:嵌入式开发板、计算机;2. 软件环境:Ubuntu操作系统、交叉编译工具链、嵌入式Linux内核源码。
四、实验步骤与结果1. 内核编译与配置通过下载嵌入式Linux内核源码,使用交叉编译工具链进行编译和配置。
在编译过程中,需要根据实际需求选择合适的内核配置选项。
编译完成后,生成内核镜像文件。
2. 系统烧录与启动将生成的内核镜像文件烧录到嵌入式开发板中,并通过串口连接进行启动。
在启动过程中,可以观察到Linux内核的启动信息,并通过串口终端进行交互。
3. 应用程序开发与调试在嵌入式Linux系统中,可以通过交叉编译工具链进行应用程序的开发。
开发过程中,需要注意与目标平台的兼容性和调试方法。
通过调试工具,可以实时监测应用程序的运行状态和调试信息。
五、实验结果与分析在本次实验中,我们成功搭建了嵌入式Linux系统,并实现了简单的应用程序开发和调试。
通过观察实验结果,我们可以得出以下结论:1. 嵌入式Linux系统的搭建需要一定的配置和编译知识,但通过合理的配置选项和编译参数,可以实现系统的定制化;2. 应用程序的开发过程中,需要注意与目标平台的兼容性和调试方法,以确保程序的正确运行和调试的有效性;3. 嵌入式Linux系统的稳定性和性能受到硬件和软件的综合影响,需要进行系统级的优化和调试。
linux嵌入式实验报告
大连理工大学本科实验报告实验名称:嵌入式操作系统学院(系):计算机学院实验专业:计算机系班级:0703学号:学生姓名: mqlz2010年 12 月 6 日实验一:linux内核裁剪预习报告一、实验目的:1、了解Linux内核源代码的目录结构及各目录的相关内容2、了解Linux内核各配置选项内容和作用3、掌握Linux内核配置文件的作用4、握Linux内核的编译过程5、掌握将新增内核代码加入到Linux内核结构中的方法二、实验原理Linux对于计算机硬件、网络和文件系统等部件的驱动程序支持既可以放在系统内核中,也可以作为一个可加载的模块(modules)使用。
当驱动程序放在系统内核中时,Linux 假定该硬件是存在于系统中的;而作为可加载模块使用时,只有在知道该硬件存在于系统时才会作为系统内核的一部分,当 Linux 检测到硬件时,该模块才被加入到系统内核中。
三、实验步骤1、检查编译器的版本用低版本的编译器去编译高版本的内核有可能不能编译或使内核不能使用。
要查看编译器版本,可以执行命令:#gcc –v进入系统内核源代码目录。
一般系统内核的源代码放在 /usr/src/ 目录下。
用 ls –l 命令查看可能显示如下:#ls –l /usr/srcTotal 3lrwxrwxrwx 1 root root 12 May 4 14:36 >linux-2.4.20-8drwxr-xr-x 15 root root 1024 May 14 11:37drwxr-xr-x 3 root root 1024 May 4 14:38 sendmail其中、是一个链接文件,它的链接目标是指向目录,因此、cd 就是进入目录。
2、删除过时的目标文件进入 /usr/src/linux-2.4.20-8 目录,运行 make mrproper 命令以清除过时、旧的目标文件。
这是因为经过多次编译后系统会留下部分目标文件,如果没有清除干净可能造成本次编译出错。
嵌入式Linux初级实验s3c2410 中
第三篇基础实验篇本篇内容Linux设备驱动概述★LED实例★按键中断实例★数码管实例★4*4键盘实例★LCD实例★触摸屏实例★本篇目标了解Linux设备驱动的相关概念及开发基础★掌握简单字符设备驱动的程序结构及设计流程★学习嵌入式Linux中断机制及其驱动程序结构★学习数码管的显示原理及其驱动程序的设计方法★熟悉键盘驱动原理,学会为自己的系统添加键盘设备驱动程序★了解移植LCD显示设备驱动及触摸屏输入设备驱动的过程★本篇实例实例一:LED驱动及测试实例★实例二:按键中断驱动及测试实例★实例三:数码管实例★实例四:4*4键盘实例★实例五:LCD驱动移植实例★实例六:触摸屏驱动移植实例★第8章Linux设备驱动概述在前一篇中,我们介绍了开发嵌入式Linux的基本过程,本章开篇在前一篇的基础上进行设备驱动程序的开发,使得目标板上的硬件资源为板上系统所用,这也是所有设备驱动的巨大贡献。
本章将带领你走进Linux设备驱动开发的世界。
本章首先介绍的是设备驱动的作用及其分类,不同驱动程序的特点等,然后介绍驱动模块的加载和卸载方式等。
8.1 设备驱动的角色任何计算机系统的运行都是系统中软硬件相辅相成的结果,没有硬件的软件是空中楼阁,而没有软件的硬件则只是一堆的电子元器件而已。
硬件是底层基础,是所有软件得以运行的平台,程序最终会实现为硬件上的逻辑电路;软件则是具体应用的实现,根据不同的业务需求而设计。
硬件一般是固定的,软件则很灵活,可以适应各种复杂多变的应用。
从某种程度上来看,计算机系统的软硬件相互成就了对方。
但是,软硬件之间同样存在着悖论,那就是软件和硬件不应该互相渗透入对方的领地。
为尽可能快速地完成设计,应用软件工程师不想也不必关心硬件,而硬件工程师也难有足够的闲暇和能力来顾及软件。
譬如,应用软件工程师在调用套接字发送和接收数据包的时候,他不必关心网卡上的中断、寄存器、存储空间、I/O端口、片选以及其他任何硬件词汇;在使用scanf()函数获取输入的时候,他不用知道底层究竟是怎样把终端设备的操作转化成程序输入的。
实验三 嵌入式Linux驱动(2)
实验三嵌入式Linux驱动(2)一、【实验目的】1)熟悉嵌入式Linux驱动程序编写框架。
2)了解16键矩阵键盘驱动程序的工作原理,熟练掌握该驱动程序在嵌入式开发平台的移植和注册使用。
二、【实验内容】1)学习Linux驱动源程序,分析代码中各个函数模块的功能作用。
2)交叉编译键盘驱动程序,将驱动程序模块拷贝到目标机上。
3)在目标板上注册驱动程序,验证驱动的功能。
三、【实验步骤】1.熟悉16键矩阵键盘工作原理矩阵键盘又称为行列式键盘,它是用4条I/O线做为行线,4条I/O线作为列线组成的键盘。
在行线和列线的每一个交叉点上,设置一个按键。
这样键盘中按键的个数是4*4个(如图1),这种行列式键盘结构能够有效的提高嵌入式系统MCU的I/O的利用率(如果采用直连式的键盘,16个按键需要16个I/O口,此举节省了8个I/O口)。
图1以图1为例,介绍一下16键矩阵键盘的工作原理,P10、P11、P12、P13作为列检测口,P14、P15、P16、P17作为行检测口。
假设按键“1”(对应于S2)被按下,找其按键的特征编码,从P10~P13输出低电平,从P14~P17输出高电平,系统读取P14~P17的状态为“0111”,其值为“70H”。
然后从P10~P13输出高电平,从P14~P17输出低电平,系统读取P10~P13的状态为“1011”,其值为“0BH”,将两次读出的P0口状态值进行逻辑或运算就得到其按键的特征编码为“7BH”。
每个按键其特征编码都不同,所以可以通过这种方法区分16个按键及其键值。
2.实验板矩阵键盘硬件电路和操作的说明实验板行扫描线分别连接与PX270的KP_MKOUT0、KP_MKOUT1、KP_MKOUT2、KP_MKOUT6端口相连,列扫描线分别与PX270的KP_MKIN0、KP_MKIN1、KP_MKIN2、KP_MKIN5端口相连。
图2PX270支持最大8根行扫描线,8根列扫描线总计64个按键的矩阵键盘,通过对键盘控制寄存器KPC的操作,我们可以自由的定制键盘的扫描工作方式,行扫描线,列扫描线的个数。
嵌入式linux实验报告
嵌入式操作系统Linux实验报告专业:计算机科学与技术班级:13419011学号:1341901124姓名:武易组员:朱清宇实验一Linux下进程的创建一实验目的1.掌握Linux下进程的创建及退出操作2.了解fork、execl、wait、waitpid及之间的关系二实验内容创建进程,利用fork函数创建子进程,使其调用execl函数,退出进程后调用wait 或waitpid清理进程。
三实验过程1.进程的创建许多进程可以并发的运行同一程序,这些进程共享内存中程序正文的单一副本,但每个进程有自己的单独的数据和堆栈区。
一个进程可以在任何时刻可以执行新的程序,并且在它的生命周期中可以运行几个程序;又如,只要用户输入一条命令,shell进程就创建一个新进程。
fork函数用于在进程中创建一个新进程,新进程是子进程。
原型如下:#include<sys/types.h> /* 提供类型pid_t的定义 */#include<unistd.h> /* 提供函数的定义 */pid_t fork(void);使用fork函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间fork系统调用为父子进程返回不同的值,fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:✓在父进程中,fork返回新创建子进程的进程ID;✓在子进程中,fork返回0;✓如果出现错误,fork返回一个负值;用fork创建子进程后执行的是和父进程相同的程序,子进程可以通过调用exec函数以执行另一个程序。
当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程(例如其m a i n函数)开始执行。
调用e x e c并不创建新进程,进程I D并未改变,只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。
e x e c函数原型execl,execlp,execle,execv,execve和execvp2.进程的退出一个进程正常终止有三种方式:由main()函数返回;调用exit()函数;调用_exit()或_Exit()函数。
操作系统实验
操作系统实验报告(一)Linux基本操作与编程(验证性 2学时)1、实验目(de):1)熟悉Linux操作系统(de)环境和使用.2)了解LINUX系统(de)安装过程.(注:表示可选择)3)掌握Linux环境下(de)命令操作.2、实验内容:(1)完成LINUX系统(de)登录,启动终端.进行下列操作并记录结果(要求:结果以屏幕截图表示).1)运行pwd命令,确定你当前(de)工作目录.2)利用以下命令显示当前工作目录(de)内容: ls –l3)运行以下命令: ls –al4)使用mkdir命令建立一个子目录subdir.5)使用cd命令,将工作目录改到根目录(/)上.6)使用ls-l命令列出/dev(de)内容.7)使用不带参数(de)命令cd改变目录,然后用pwd命令确定你当前(de)工作目录是哪里8)使用命令cd ../..,你将工作目录移到什么地方(2)在LINUX下查看你(de)文件.1)利用cd命令,将工作目录改到你(de)主目录上.2)将工作目录改到你(de)子目录subdir,然后运行命令: date > file1 将当前日期和时间存放到新建文件file1中.3)使用cat命令查看file1文件(de)内容.4)利用man命令显示date命令(de)用法: man date5)将date命令(de)用法附加到文件file1(de)后面:man date >> file16)利用cat命令显示文件file1(de)内容.7)利用ls -l file1命令列出文件file1(de)较详细(de)信息.运行ls -l/bin 命令显示目录(de)内容.8)利用ls -l/bin|more命令行分屏显示/bin目录(de)内容.9)利用cp file1 fa命令生成文件file1(de)副本.然后利用ls -l命令查看工作目录(de)内容.10)用cd命令返回你(de)主目录,输入命令ls –l后,解释屏幕显示(de)第一列内容(de)含义.(3)编写能输出“Hello world”问候语(de)C程序,并在终端中编译、执行.要求记录所使用(de)命令及结果.操作步骤:1)在文本编辑器中,编写C程序如下:include ""main(){ printf("hello"); }2) 在终端中,用gcc命令进行编译,生成可执行文件a.gcc –o a3) 在终端中执行a (de)命令如下:./a(4)编写一个程序:显示信息“Time for Play”,并能在后台运行一段时间(自定义)后,弹出信息提醒用户.要求记录所使用(de)命令及结果.(提示:使用sleep(s)函数)3、实验结果分析:(对上述实验内容中(de)各题结果,进行分析讨论.并回答下列问题)(1)进程包括哪些特征间断性, 失去封闭性, 不可再现性, 动态性, 并发性, 独立性(2)在Linux中,如何设置前、后台命令和程序(de)执行命令后直接加 & ,这个命令就在后台执行;正在运行(de)命令,使用Ctrl+z ,就挂起; jobs命令,可以现实后台,包括挂起(de)命令;使用 bg %作业号就可以把挂起(de)命令在后台执行;使用 fg %作业号就可以把后台命令调到前台(3)你所使用(de)Linux系统(de)内核版本是多少用什么命令查看内核版本目前你所了解(de)各发行版本(de)情况如何Linux version (gcc version (Red Hat (GCC) ) 1 SMP Tue Jan 2911:48:01 EST 2013(4)你对Linux系统有什么认识linux是一款开放性(de)操作系统,也可以说成是开放(de)源代码系统,这些代码可以完全自由(de)修改可以再任何(de)计算机上去运行它,也就是“可移植性”,其次大家都知道,linux是由UNIX(de)概念所开发出来(de),所以它也继承了UNIX(de)稳定和效率(de)特点4、总结:你对本次实验有什么体会或看法.操作系统实验报告(二)文件访问权限设置与输入输出重定向(2学时)一、实验目(de)1、掌握linux(de)文件访问权限设置.2、熟悉输入输出重定向和管道操作.二、实验内容1、启动进入红帽linux系统2、设置文件权限:在用户主目录下创建目录test,进入test目录,用vi 创建文件file1,并输入任意(de)文字内容.用ls -l显示文件信息,注意文件(de)权限和所属用户和组.对文件file1设置权限,使其他用户可以对此文件进行写操作:chmod o+w file1.用ls -l查看设置结果.取消同组用户对此文件(de)读取权限:chmod g-r file1.查看设置结果.用数字形式来为文件file1设置权限,所有者可读、可写、可执行;其他用户和所属组用户只有读和执行(de)权限:chmod 755 file1.设置完成后查看设置结果.3、输入、输出重定向和管道(1) 输出重定向用ls命令显示当前目录中(de)文件列表:ls –l.使用输出重定向,把ls命令在终端上显示(de)当前目录中(de)文件列表重定向到文件list中:ls –l > list.查看文件list中(de)内容,注意在列表中会多出一个文件list,其长度为0. 这说明shell是首先创建了一个空文件,然后再运行ls命令:cat list.再次使用输出重定向,把ls命令在终端上显示(de)当前目录中(de)文件列表重定向到文件list中.这次使用追加符号>>进行重定向:ls –l >> list.查看文件list(de)内容,可以看到用>>进行重定向是把新(de)输出内容附加在文件(de)末尾,注意其中两行list文件(de)信息中文件大小(de)区别:cat list.重复命令ls –l > list.再次查看文件list中(de)内容,和前两次(de)结果相比较,注意list文件大小和创建时间(de)区别.(2) 管道who |grep root命令(de)结果是命令ls –l |wc –l结果是4、退出linux系统操作步骤:在主菜单上选择“注销” ->关闭计算机.三、实验结果与讨论(根据实验结果回答下列问题)1. 文件(de)权限如下:-rw-r—r-- 1 root root 19274 Jul 14 11:00回答:-rw-r—r-- (de)含义是什么答:是LINUX/FTP(de)简易权限表示法:对应于本用户-所在组-其他人(de)权限,每一个用执行(x)-读取(r)-写入(w)如本题若是说自己可以读取写入不可以执行,所在组和其他人只能读取.2、文件(de)所有者添加执行权限(de)命令是答:chmod u+x 、赋予所有用户读和写文件权限(de)命令是四、答:chmod a+w,a+r 个人体会(你对本次实验有什么体会或看法)操作系统实验报告(三)文件和目录管理一、实验目(de)1) 掌握在Linux系统下(de)文件和文件系统(de)概念及命令;2) 掌握Linux系统下(de)目录操作.二、实验内容1. 进入linux终端后,用命令(de)操作结果回答下列问题:1)vi(de)三种工作模式是其中不能进行直接转换(de)是什么模式到什么模式命令模式、文本输入模式、末行模式命令模式不能直接到末行模式2)在vi中退出时,保存并退出(de)操作步骤是Ese:wq3)用vi 创建myfile1文件,并在其中输入任意文字一行,创建myfile2文件,任意输入文字3行.请问执行命令:cat <myfile1 >myfile2 后,myfile2中还有几行内容该命令(de)作用是用命令操作验证你(de)回答.myfile2中还有1行内容该命令(de)作用是替换myfile(de)内容4)请用至少两种不同(de)命令创建一个文本文件(),在其中写入“我是2014级学生,我正在使用Linux系统.”,记录命令及执行结果.1、Vi创建2、5)用___pwd________命令可查看所创建文件(de)绝对路径,写出它(de)绝对路径__/root_________;用___ls -l________命令查看该文件(de)类型及访问权限,其访问权限(数字和字母)分别是多少__-rw- r- - r- - 6 4 4______________.6)若将该文件(de)访问权限修改为:所有者有读写权限;其他用户只读;同组用户可读写,请写出命令,并记录结果.7)查找my开头(de)所有文件,可___find my_________命令,写出命令并记录结果8)在/home下创建子目录user,并在其中创建2个文件,名为file1和file2,file1(de)内容是/root目录(de)详细信息;file2(de)内容任意,最后将这两个文件合并为file3文件,请先写出命令序列,并在终端中验证,记录结果.2. 文件及目录操作,写出操作所使用(de)命令,并记录结果.在终端中完成下列命令操作,并记录结果在root用户主目录下创建一个mydir子目录和一个myfile文件,再在mydir下建立d1和d2两个子目录.查看mydir和myfile(de)默认权限查看当前myfile和mydir(de)权限值是多少将myfile文件分别复制到root 和dd1(de)主目录中将root主目录中(de)myfile改为yourfile通过从键盘产生一个新文件并输入I am a student查找文件是否包含student字符串三、实验结果与分析,回答下列问题:1、能够创建文件(de)命令有哪些vi 和cat>name2、能够查看当前目录(de)绝对路径(de)命令是pwd3、Linux中按用户属性将用户分成哪些类型根据文件(de)访问权限,用户又被分成哪些类型能够查看文件访问权限(de)命令是用户同组其他可读可写可执行 cat f1四、小结(本次实验(de)体会或小结)操作系统实验报告(四)作业调度算法模拟(验证性2学时)1、实验目(de):1)掌握作业调度(de)主要功能及算法.2)通过模拟作业调度算法(de)设计加深对作业管理基本原理(de)理解.3)熟悉Linux环境下应用程序(de)编程方法.2、实验内容:(1)作业调度算法(FCFS)编程模拟:编制一段程序,对所输入(de)若干作业,输入、输出数据样例如下表所示.按FCFS算法模拟调度,观察、记录并分析调度(de)输出结果情况.输入输出样例1:FCFS算法include <>include <>define SIZE 5struct Job_type{char no[2]; o,&job[i].tb,&job[i].tr);printf("输入作业顺序:\n");for(i=0;i<SIZE;i++)printf("\t%s\t%d\t%d\n",job[i].no,job[i].tb,job[i].tr);}void fcfs(){ int i,j,t=0,tw=0,tt=0;for(i=0;i<SIZE-1;i++)for(j=i+1;j<SIZE;j++)if(job[i].tb>job[j].tb){x=job[i];job[i]=job[j];job[j]=x;}printf("FCFS调度结果:\n");printf("开始时间作业号到达时间运行时间完成时间等待时间周转时间\n");for(i=0;i<SIZE;i++){printf(" %d",t);t=t+job[i].tr;tw=t-job[i].tb-job[i].tr; b; o,job[i].tb,job[i].tr,t,tw,tt);}}void main(){load();fcfs();}(2)作业调度算法(SJF)编程模拟:编程实现由短作业优先算法,分别用下面两组输入、输出数据样例进行模拟,观察分析运行结果.输入输出样例2:SJF算法输入输出A 0 4B 0 3C 0 5D 0 2E 0 1A 0 6 10 10B 0 3 6 6C 0 10 15 15D 0 1 3 3E 0 0 1 1include <>include <>define SIZE 5struct Job_type{char no[2]; o,&job[i].tb,&job[i].tr);printf("输入作业顺序:\n");for(i=0;i<SIZE;i++)printf("\t%s\t%d\t%d\n",job[i].no,job[i].tb,job[i].tr);}void sjf()n=i; pl[i].pfn=ERR;}for(i=1;i<total;i++){ pfc[i-1].next=&pfc[i];pfc[i-1].pfn=i-1;}pfc[total-1].next=NULL;pfc[total-1].pfn=total-1;freepf_head=&pfc[0];}void FIFO(int total){ int i,j;pfc_type p,t;initialize(total);busypf_head=busypf_tail=NULL;for(i=0;i<page_len;i++){if(pl[page[i]].pfn==ERR){ diseffect+=1;if(freepf_head==NULL){p=busypf_head->next;pl[busypf_head->pn].pfn=ERR; freepf_head=busypf_head;freepf_head->next=NULL;busypf_head=p;}p=freepf_head->next;freepf_head->next=NULL;freepf_head->pn=page[i];pl[page[i]].pfn=freepf_head->pfn;if(busypf_tail==NULL)busypf_head=busypf_tail=freepf_head; else{ busypf_tail->next=freepf_head;busypf_tail=freepf_head;}freepf_head=p;}}printf("FIFO:%d",diseffect);}main(){ int i; int k;printf(“请输入页(de)引用序列:\n”); for(k=0;k<page_len;k++)scanf("%d",&page[k]);for(i=4;i<=7;i++){printf("%2d page frames ",i);FIFO(i);}参考程序LRU算法,略三、实验结果分析:(对上述实验各题所使用(de)原始数据、调试数据与状态(包括出错)及最终结果进行记录并分析.)随着块数(de)增加,缺页数目也减少,4个实验中3个实验(de)块数增加到了5以后,即使块数再增加,缺页数目也是保持不变.只有实验4,块数增加到7以后,缺页数目又再次减少了四、总结:你对本次实验有什么体会或看法.。
实验三 嵌入式Linux开发基础
实验三嵌入式Linux开发基础一、实验目的1、进一步熟悉vi编辑器的使用2、掌握gcc编译器的基本使用方法3、了解利用gdb调试程序的基本方法4、掌握Makefile文件的内容及编写格式,了解Makefile文件的自动生成方法二、实验设备装有Red Hat Linux 操作系统的PC机三、预备知识掌握linux的基本命令,掌握C语言的基本编程方法了解Makefile文件的基本知识四、实验内容及步骤1.熟悉VI编辑器的使用使用VI编辑器编辑下列几个函数文件:hello.hstarfun.hhello.cstar.c在使用Vi编辑器的过程中,注意使用Vi的单行和多行复制命令,练习字符串查找替换命令,删除一个字符,删除光标后整个内容命令,删除一行命令,恢复删除,保存和退出命令等命令,并尝试使用其他命令。
相关函数文件如下:starfun.h 文件内容如下:/*****starfun.h*****/#ifndef STARFUN_H#define STARFUN_H#define NUM 4int star1() {int i,j,k;for(k=1;k<=NUM;++k) {for(i=1;i<=(NUM-k);++i)printf(" ");for(j=1;j<=(2*k-1);++j)printf("*");printf("\n");}return 0;}int star2() {int i,j,k;for(k=NUMBER;k>=0;--k) {for(i=1;i<=(NUMBER-k+1);++i)printf(" ");for(j=1;j<=(2*k-1);++j)printf("*");printf("\n");}return 0;}#endifhello.h文件内容如下:/*hello.h*/#ifndef HELLO_Hvoid hello() {star1();printf("hello,my friends\n");}#endifhello.c 文件内容如下:void showhello() {hello();}star.c文件内容如下:#include "starfun.h"#include "hello.h"#include <stdio.h>int main() {star1();star2();showhello();return 0;}2.使用gcc编译器编译程序第一种方法:分步进行1).由star.c starfun.h 文件生成star.o 目标文件gcc -c star.c -o star.o2).由hello.c hello.h starfun.h生成hello.o目标文件gcc -c hello.c -o hello.o3).由hello.o star.o 生成应用程序myproggcc star.o hello.o -o myprog[root@localhost 01_hello]# ./myprog*****************************************hello,my friends第二种方法:一条命令完成以上操作gcc star.c hello.c -o myprog练习gcc中各种参数的使用,体会gcc编译器编译的过程及各选项参数的作用。
嵌入式操作系统实验三GDB
实验收获:1、实验的内容分成了两部分,显示学会使用了gdb的简单指令调试简单的程序。
Gdb的调试方法分成本地调试和目标机调试两部分。
编译给定的程序,使用简单的指令如:list、run、continue、kill、quit、break、next、step、print、display、watch等。
2、两个收获,一个是使用虚拟机qemu调试内核(不能在本机重启内核吧,可以想象在虚拟机skyeye平台上运行时,也可以作为目标机进行调试)。
一个是gdb的远程调试(即主机和目标机不是同一台机器,要建立连接)。
解压编译安装qemu;编译linux内核;编写启动脚本启动qemu,建立连接,开始调试。
具体的知识点收获:1、gdb是linux环境下的一款常用的程序调试工具。
通过gdb,可以单步跟踪程序的执行流程,有助于程序员更好地理解该程序,并发现其中隐藏的bug。
在GDB术语中,有一小段驻留在目标机上的代码被称为“调试桩”(debugging stub),也称为“调试代理”(debugging agent),其责任就是在目标机上实现由主机上的调试器发送过来的调试命令,此外还有向主机调试器报告目标机上发生的异常事件,调试代理与GDB主机之间的通信遵循“GDB 远程串行协议(Remote Serial Protocol)”。
当然,如果目标机和主机是同一台机器,那么就是属于gdb本地调试,这是基础了。
下面,我们以本地调试为例子,来给大家介绍一般的gdb调试过程。
gdb+gdbserver总体介绍远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接。
使用GDB标准程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。
调试stub是嵌入式系统中的一段代码,作为宿主机GDB和目标机调试程序间的一个媒介而存在。
就目前而言,嵌入式Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:用ROM Monitor调试目标机程序、用KGDB调试系统内核和用gdbserver调试用户空间程序。
嵌入式linux实验报告
嵌入式linux实验报告嵌入式Linux实验报告摘要:本实验报告介绍了嵌入式Linux系统的搭建和应用。
通过实验,我们深入了解了嵌入式系统的特点和原理,并学习了如何搭建一个基本的嵌入式Linux 系统。
同时,我们还探讨了嵌入式Linux系统的应用领域和未来发展方向。
1. 引言嵌入式系统是一种专门设计用于特定应用的计算机系统,它通常被嵌入到各种设备中,如手机、家用电器、汽车等。
嵌入式Linux系统是一种基于Linux内核的嵌入式系统,它具有开放源代码、稳定可靠、灵活性高等特点,因此在各种嵌入式设备中得到了广泛的应用。
2. 实验目的本实验旨在通过搭建嵌入式Linux系统,深入了解嵌入式系统的原理和特点,为今后的嵌入式系统开发和应用打下基础。
3. 实验内容本次实验主要包括以下内容:- 嵌入式Linux系统的搭建- 嵌入式Linux系统的调试和优化- 嵌入式Linux系统的应用案例分析4. 实验步骤(1)搭建嵌入式Linux系统首先,我们选择了一款适合嵌入式系统的Linux发行版,并在PC机上进行交叉编译,生成适用于嵌入式设备的Linux内核和文件系统。
然后,将生成的内核和文件系统烧录到目标设备中,完成嵌入式Linux系统的搭建。
(2)调试和优化在搭建完成后,我们对嵌入式Linux系统进行了调试和优化。
通过调试工具和性能分析工具,我们找到了系统中存在的问题,并进行了相应的优化和改进,以提高系统的稳定性和性能。
(3)应用案例分析最后,我们对嵌入式Linux系统在实际应用中的案例进行了分析。
我们选择了一些典型的嵌入式设备,如智能家居设备、工业控制设备等,探讨了嵌入式Linux系统在这些设备中的应用和发展前景。
5. 实验结果通过本次实验,我们成功搭建了一个基本的嵌入式Linux系统,并对其进行了调试和优化。
同时,我们也对嵌入式Linux系统在实际应用中的案例进行了深入分析,为今后的嵌入式系统开发和应用提供了有益的参考。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验3-1 Vi使用●实验目的:学会用vi编辑器●实验要求:熟练使用该节所介绍的vi创建、编辑、保存文件●实验器材:软件:1.安装了Ubunt的vmware虚拟机硬件:PC机一台●实验步骤:1. 在当前目录下键入命令vi hello.c创建名为hello.c的文上图是在命令行模式下2. 键入i进入插入模式3. 在插入模式下输入文字hello word!4. 按[Esc]键退出到命令行模式5. 按shift+;键,即:键进入底行模式6. 键入wq保存退出7. 将文件/etc/samba/smb.conf拷贝到当前目录下,下面的实验步骤是为了让大家能够熟练使用vi中的常见操作。
命令:cp /etc/samba/smb.conf ./8. 用vi打开文件smb.conf,设定显示行号,指出“ShareDefinitiongs”的所在行号在底行模式下,输入:set nu显示行号这样就可以看到“Share Definitions”所在的行为246行。
9. 将光标移动到248行命令:248G即在命令行模式下输入248shitf+g10. 复制改行以下6行内容命令:6yy11. 将光标移动到最后一行行首命令:G,即shift+g12. 粘贴复制的内容命令:p13. 删除12步粘贴的6行命令:6dd14. 撤销第13步的操作命令:u15. 查找字符串“Share Definitions”命令:/Share Definitions16. 强制退出vi,不存盘命令::q!17. 总结:对vi编辑的使用必须非常的熟练,因为vi编辑器是非常常用的。
以后编辑程序、查看文档、修改配置文件等操作都会用到,所以大家要多练习。
实验3-2 Gcc程序编译∙实验目的:学会使用gcc编译器及各种常用编译选项的使用理解库设计的功能:1)代码的封装保密 2)代码模块化设计∙实验要求:1、编写一应用程序,使用gcc进行编译,并分别使用-o,-g,-static,-o2等选项2、静态库和动态库的使用∙实验器材:软件:安装了ubunt 12.4的vmware虚拟机硬件:PC机一台∙第1题实验步骤:∙先用vi编辑hello.c文件,内容如下:int sum_int(int a, int b){return a+b;}int main(){int a=2,b=3,c;c=sum_int(a, b);printf(“sum of a and b is %d\n”,c);}gcc指令的一般格式为:gcc [选项] 要编译的文件[选项] [目标文件]例:使用gcc编译命令,编译hello.c生成可执行文件hello,并运行hello命令:#gcc hello.c –o hello上面的命令一步由.c文件生成了可执行文件,将gcc的四个编译流程:预处理、编译、汇编、链接一步完成,下面将介绍四个流程分别做了什么工作。
–E选项的使用-E选项的作用:只进行预处理,不做其他处理。
例:只对hello.c文件进行预处理,生成文件hello.i,并查看命令:#gcc –E hello.c –o hello.i使用命令#cat hello.i查看hello.i文件的内容可以看到头文件包含部分代码#include <stdio.h>经过预处理阶段之后,编译器已将stdio.h的内容贴了进来。
–S选项的使用-S选项的作用:只是编译不汇编,生成汇编代码例:将hello.i文件只进行编译而不进行汇编,生成汇编代码hello.s命令:gcc –S hello.i –o hello.s使用命令#cat hello.s查看hello.s的类容∙–c选项的使用-c选项的作用:只是编译不连接,生成目标文件“.o”例:将汇编代码hello.s只编译不链接生成hello.o文件命令:#gcc –c hello.s –o hello.o使用objdump -d hello.o 命令查看反汇编代码命令:#gcc hello.o –o hell∙–static选项的使用-static选项的作用:链接静态库例:比较hello.c链接动态库生成的可执行文件hello和链接静态库生成的可执行文件hello1的大小命令:#gcc hello.c –o hello#gcc hello.c –o static hello1可以看到静态链接库的可执行文件hello1比动态链接库的可执行文件hello要大的多,他们的执行效果是一样的。
∙-g选项的使用-g选项的作用:在可执行程序中包含标准调试信息例:将hello.c编译成包含标准调试信息的可执行文件hello2命令:#gcc –g hello.c –o hello2带有标准调试信息的可执行文件可以使用gdb调试器进行调试,以便找出逻辑错误。
–O2选项的使用-O2选项的作用:完成程序的优化工作。
例:将hello.c是用O2优化选项编译生成可执行文件hello1,和正常编译产生的可执行文件hello进行比较2、实验步骤:1、建立project目录,其子目录结构如下,2、在src文件夹编写main.c主程序,参考代码如下:编译运行,通过,之后做如下调整:1)在include文件夹下新建头文件myhead.h,将main.c程序中,包含头文件语句和函数声明语句删除并添加到myhead.h中。
在src 文件夹下编写sum.c 文件,将main.c程序函数的实现部分移动到,sum.c中。
将myhead.h 包含到 main.c中。
myhead.h的参考代码如下:main.c 的参考代码如下:2)目录结构如下:3)由于头文件myhead.h与mian.c不在用一个目录下,编译时必须加入-I 选项来链接指定目录的头文件,gcc main.c sum.c –o main –I../include/myhead.h4)继续修改代码,将sum.c 制作为静态库sum.a,并将其保存到lib目录中。
并将sum.c源程序剪切到桌面暂时保存。
并且为了实验效果,将lib文件夹下用touch命令创建两个库文件。
目录结构如下:静态库的制作及加载的一般方法如下:gcc sum.c -c -o sum.o -I ../include/----> 先得到*.o的目标文件(可重定位)ar -crs libsum.a add.o ----> 通过ar归档工具,将add.o生成静态库文件库方法(库加载方式):gcc main.c -o main -I ../include -L ../ -lsum -static-静态编译(通过 -static 指定)-----------------------------------静态编译使用的是静态库-----> libxxx.a编译完成后运行main 程序,并尝试将main.c拷贝到其它目录下程序能否正确运行,从而验证链接静态库生成的可执行程序,程序在运行时,不依赖库,因为编译时已经将库中的代码添加到目标文件中了,并且系统默认动态编译而不是静态编译。
分析动态库的优缺点并写到实验报告中:优点:执行时不需要再额外加载,速度快缺点:全部代码被编译进程序,体积大5)动态库的制作及链接方法:将保存的sum.c 制作成动态库gcc sum.c -c -o sum.o -I ../include/----> 先得到*.o的目标文件(可重定位)gcc -shared -fPIC sum.o -o libsum.so----> 生成位置无关的共享库文件并将生成的动态库libsum.so,移动到lib目录中库加载方法:gcc main.c -o main -I ../include -L ../ -lsum生成可执行程序main,程序的运行却要依赖动态库,原因及解决方法如下:程序编译时:需要加载对应的库文件,库文件的位置?/lib /usr/lib如果所需的头文件不在标准头文件目录,则需要通过 -L选项指定 ----> -L 库文件路径-l 指定库文件名称 --> libadd.so --> -ladd动态库文件参与链接------------------------------------------------运行前,必须确保库文件在准确的库文件加载路径中,否则将提示加载失败!!!解决方法:1)将库文件拷贝到标准库路径(/lib /usr/lib )2)确认自定义生成的库文件在自定义目录中,如:/home/gec/project/lib修改环境变量 LD_LIBRARY_PATH ---> 指定路径exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/gec/project/lib 如果想长期有效,需要修改系统的配置文件,例如:/etc/bash.bashrc3)修改系统的库文件加载配置文件:/etc/ld.so.conf ----> 在该文件中添加库的新路径(/home/gec/project/lib)使能: ldconfig理解动态库的优缺点:优点:大部分加载的库代码不被编译进程序,只保留调用的信息符号,在执行时再调用,体积小缺点:执行时再额外加载,速度慢;对运行环境中库文件有依赖(必须在执行的环境中有相应的库文件)知识点:1、系统默认动态编译,所谓动态编译,编译器优先链接动态库,只有在链接的动态库不存在的时候才会链接静态库,除非自己指定是静态编译(-static)。
2、动态编译时,没有对应的动态库,只有静态库-------> 系统将静态库链接入程序,影响程序的体积等价于:静态库中的代码,直接加载到当前文件,成为程序的一部分。
实验3-3 GDB程序调试∙实验目的:学会gdb调试器的使用∙实验要求:编写一应用程序,使用gdb调试,调试中使用到该小结所介绍的所有命令∙实验器材:软件:1.安装了Ubunt的vmware虚拟机硬件:PC机一台∙实验步骤:∙先用vi编辑文件test.c用于geb调试器调试,内容如下:∙将test.c文件编程成包含标准调试信息的文件test命令:#gcc –g test.c –o test∙启动gdb进行调试命令:gdb test可以看到gcb的启动界面中显示了gdb的版本、自由软件等信息,然后进入了由“gdb”开头的命令行界面。
∙l(list)命令l命令用于查看文件,如下图:可以看到每行代码前面都有对应的行号,这样方便我们设置断点。
b(breakpoint)命令b用于设置断点,断点调试是调试程序的一个非常重要的手段,设置方法:在“b”命令之后加上对应的行号,如下图:在gdb中可以设置多个断点。