《嵌入式linux程序开发》课程设计报告_____fcntl()编程实现Ⅰ.pdf
嵌入式 linux 程序开发课程设计报告fcntl()编程实现 陈丽丹07323202Page 1 of 15摘摘要要随着后PC时代的到来,嵌入式系统技术已经成为了一个万众瞩目的焦点。目前已广泛应用于信息家电、数据网络、工业控制、医疗卫生、航空航天等众多领域。巨大的市场潜力,无穷的商机,吸引了各路英豪纷踵沓来。硬件方面,各大电子厂商相继推出了自己的专用嵌入式芯片,漫天而至的是mp3,PDA,无线上网装置,让人们充分感受到了这股强劲之势;软件方面,在Vxworks、pSOS、Neculeus和Windows CE等嵌入式操作系统引领下,也出现了空前繁荣的局面,但这些专用操作系统都是商业化产品,其高昂的价格使许多面向低端产品的小公司望而却步,并且其源代码的封闭性也大大限制了开发者的积极性。近两年在我国登陆并蓬勃发展的Linux,也已广泛应用于各类计算应用,不仅包括IBM的微型Linux腕表、手持设备(PDA和蜂窝电话)、因特网装置、客户机、防火墙、工业机器人和电话基础设施设备,甚至还包括了基于集群的超级计算机。Linux在高端服务器的优越表现及其天生具有的突出特点,就注定它必将在低端嵌入式系统中再次给人们以惊喜,而基于嵌入式Linux操作系统的应用,必定给我们未来的工作和生活带来翻天覆地的变化。本课程设计是以Red Hat Linux-VMware Workstation ACE版为基础平台,利用Fcntl函数实现多用户共享下给文件加文件锁,其中文件锁包括建议性锁和强制性锁。嵌入式 linux 程序开发课程设计报告fcntl()编程实现 陈丽丹07323202Page 2 of 15目目录录一嵌入式 Linux 简介.3二.嵌入式 Linux 开发平台简介.3三嵌入式 linux 开发流程.3建立开发环境.3 配置开发主机.4 建立引导装载程序 BOOTLOADER.4 下载别人已经移植好的 LINUX 操作系统.4 建立根文件系统.4 建立应用程序的 flash 磁盘分区.4 开发应用程序.5 烧写内核、根文件系统、应用程序.5四课程设计目的和要求.5fcntl 函数格式.5程序流程图:.6五VI 简介与源程序.7六Gcc 编译器的安装过程.11七程序运行.13八心得体会.14九参考文献.15八评分表.15嵌入式 linux 程序开发课程设计报告fcntl()编程实现 陈丽丹07323202Page 3 of 15一嵌入式一嵌入式 L Linuxinux 简介简介嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。Linux 正在嵌入式开发领域稳步发展。Linux 使用 GPL,所有对特定开发板、PDA、掌上机、可携带设备等使用嵌入式 Linux 感兴趣的人都可以从因特网上免费下载其内核和应用程序,并开始移植和开发。许多 Linux 改良品种迎合了嵌入式市场,它们包括 RTLinux(实时 Linux)、uclinux(用于非 MMU 设备的Linux)、Montavista Linux(用于 ARM、MIPS、PPC 的 Linux 分发版)、ARM-Linux(ARM 上的 Linux)和其它 Linux 系统。嵌入式 Linux 的发展比较迅速。NEC、索尼已经在销售个人视频录像机等基于 Linux 的消费类电子产品,摩托罗拉则计划在其未来的大多数手机上使用Linux,IBM 也制定了在手持机上运行 Linux 的计划。数年来,“Linux 标准库”组织一直在从事对在服务器上运行的 Linux 进行标准化的工作,现在,嵌入式计算领域也开始了这一工作。嵌入式 Linux 标准吸引了“Linux 标准库”以及 Unix 组织中有益的元素。二二.嵌入式嵌入式 LinuxLinux 开发平台简介开发平台简介Linux 价格低廉、功能强大,可以运 X86,Alpha,Sparc,MIPS,PPC,MOTOROLA,NEC,ARM 等硬件平台上,而且开放源代码,可以定制。我们所介绍的硬件平台是基于 ARM 体系结构,由北京博创兴业科技有限公司开发的 UP-Star 认证考试实践板,该认证板采用 Samsung S3c2410 嵌入式微处理器,可运行 Linux 2.4.x和 Linux 2.6.x 内核,支持 QT/E、miniGUI 等嵌入式图形界面。既适合作为计算机、软件等专业,又适合广大从事 PMP、PDA、智能手机的厂商和科研单位作为参考设计。三嵌入式三嵌入式 linuxlinux 开发流程开发流程嵌入式 linux 开发,根据应用需求的不同有不同的配置开发方法,但是一般都要经过以下过程:建立开发环境(在 WINDOWS 下安装虚拟机后,再在虚拟机中安装 LINXUX 操作系统)操作系统:red hat linux9.0 版本GCC 交叉编译器的安装:arm-linux-gcc嵌入式 linux 程序开发课程设计报告fcntl()编程实现 陈丽丹07323202Page 4 of 15 配置开发主机MINICOM 和 WINDOWS 下的超级终端的配置:一般参数为波特率 115200;数据位 8位;停止位 1;无奇偶校验;软硬件控制流设为无 建立引导装载程序 BOOTLOADER从网络上下载一些公开源代码的 BOOTLOADER:U-BOOTARM9 系列芯片没有内置引导装载程序,需要编写烧写开发板上 flash 的烧写程序,网络上有免费下载的 WINDOWS 下通过 JTAG 并口简易仿真器烧写 ARM 外围 flash 芯片的程序。这是让系统可以正常运行的第一步。下载别人已经移植好的 LINUX 操作系统如 UCLINUX、ARM-LINUX、PPC-LINUX 等 建立根文件系统从 下载使用 BUSYBOX 软件进行功能裁减,产生一个最基本的根文件系统,再根据自己的应用需要添加其他的程序。默认的启动脚本一般都不会符合应用的需要,所以就要修改根文件系统中的启动脚本,它的存放位置位于/etc 目录下,包括:/etc/init.d/rc.S、/etc/profile、/etc/.profile 等,自动挂装文件系统的配置文件/etc/fstab,具体情况会随系统不同而不同。根文件系统在嵌入式系统中一般设为只读,需要使用 mkcramfs、genromfs等工具产生烧写映象文件。建立应用程序的 flash 磁盘分区一般使用 JFFS2 或 YAFFS 文件系统,这需要在内核中提供这些文件系统的驱动,有的系统使用一个线性 flash(NOR 型)512K32M,有的系统使用非线性flash(NAND 型)8512M,有的两个同时使用,需要根据应用规划 flash 的分区方案。嵌入式 linux 程序开发课程设计报告fcntl()编程实现 陈丽丹07323202Page 5 of 15 开发应用程序可以下载到根文件系统中,也可以放入 YAFFS、JFFS2 文件系统中,有的应用程序不使用根文件系统,而是直接将应用程序和内核设计在一起,这有点类似于 UCOS-II 的方式。烧写内核、根文件系统、应用程序四课程设计目的和要求四课程设计目的和要求通过编写在多用户共享下给文件上锁的程序,进一步熟悉 Linux 中文件 I/O相关的应用开发,并且熟练的掌握 fentl()函数的使用。在文件已经共享的情况下如何操作,也就是当多个用户共同使用、操作一个文件的情况,这时,Linux 通常采用的方法是给文件上锁,来避免共享的资源产生竞争的状态。文件锁包括建议性锁和强制性锁。建议性锁要求每个上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。在一般情况下,内核和系统都不使用建议性锁。强制性锁是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他任何文件对其进行读写操作。采用强制性锁对性能的影响很大,每次读写操作都必须检查是否有锁存在在 Linux 中,实现文件上锁的函数有 lock 和 fcntl,其中 flock 用于对文件施加建议性锁,而 fcntl 不仅可以施加建议性锁,还可以施加强制锁。同时,fcntl还能对文件的某一记录进行上锁,也就是记录锁。记录锁又可分为读取锁和写入锁,其中读取锁又称为共享锁,它能够使多个进程都能在文件的同一部分建立读取锁。而写入锁又称为排斥锁,在任何时刻只能有一个进程在文件的某个部分上建立写入锁。当然,在文件的同一部分不能同时建立读取锁和写入锁。fcntl 函数格式 fcntl 函数原型int fcnt1(int fd,int cmd,struct flock*lock)参数 fd 代表欲设置的文件描述词,参数 cmd 代表欲操作的指令。参数 lock 指针为 flock 结构指针,定义如下:struct flcokshort int l_type;short int l_whence;off_t l_start;off_t l_len;嵌入式 linux 程序开发课程设计报告fcntl()编程实现 陈丽丹07323202Page 6 of 15pid_t l_pid;l_type 有三种状态:F_RDLCK 建立一个供读取用的锁定F_WRLCK 建立一个供写入用的锁定F_UNLCK 删除之前建立的锁定l_whence 也有三种方式:SEEK_SET 以文件开头为锁定的起始位置。SEEK_CUR 以目前文件读写位置为锁定的起始位置SEEK_END 以文件结尾为锁定的起始位置。返回值 成功则返回 0,若有错误则返回-1,错误原因存于 errno。程序流程图:开始结束文件是否已上锁?已上锁未上锁提示上锁失败,并显示已上什么锁和上锁的进程号提示上锁成功,并显示上了什么和上锁的进程号文件是否成功开始成功失败给文件置写入锁/读取锁并给出提示。如:进程号给出打开文件失败的提示解锁结束图 1.文件记录锁功能流程图图 2.文件写入锁/读取锁功能流程图嵌入式 linux 程序开发课程设计报告fcntl()编程实现 陈丽丹07323202Page 7 of 15五五VIVI 简介与源程序简介与源程序vi 是 Linux/Unix 世界里极为普遍的可视化的全屏幕文本编辑器(visualedit),几乎可以说任何一台 Linux/Unix 机器都会提供这个软件。vi 有三种状态,即编辑方式,插入方式和命令方式。在命令方式下,所有命令都要以:开始,所键入的字符系统均作命令来处理,如:q 代表退出,:w 表示存盘。当你进入 vi 时,会首先进入命令方式(同时也是编辑方式)。按下 i 就进入插入方式,用户输入的可视字符都添加到文件中,显示在屏幕上。按下 ESC就可以回到命令状态(同时也是编辑方式)。源程序:源程序:/*/*lock_set.clock_set.c*/*/int lock_set(int fd,int type)struct flock old_lock,lock;lock.l_whence=SEEK_SET;lock.l_start=0;lock.l_len=0;lock.l_type=type;lock.l_pid=-1;/*判断文件是否可以上锁*/fcntl(fd,F_GETLK,&lock);if(lock.l_type!=F_UNLCK)/*判断文件不能上锁的原因*/if(lock.l_type=F_RDLCK)/*该文件已有读取锁*/printf(Read lock already set by%dn,lock.l_pid);else if(lock.l_type=F_WRLCK)/*该文件已有写入锁*/printf(Write lock already set by%dn,lock.l_pid);嵌入式 linux 程序开发课程设计报告fcntl()编程实现 陈丽丹07323202Page 8 of 15/*l_type 可能已被 F_GETLK 修改过*/lock.l_type=type;/*根据不同的 type 值进行阻塞式上锁或解锁*/if(fcntl(fd,F_SETLKW,&lock)0)printf(Lock failed:type=%dn,lock.l_type);return 1;switch(lock.l_type)case F_RDLCK:printf(Read lock set by%dn,getpid();break;case F_WRLCK:printf(Write lock set by%dn,getpid();break;case F_UNLCK:printf(Release lock by%dn,getpid();return 1;break;default:break;/*end of switch*/return 0;/*/*read_lock.cread_lock.c*/*/#include#include#include#include#include#include#include lock_set.cint main(void)int fd;嵌入式 linux 程序开发课程设计报告fcntl()编程实现 陈丽丹07323202Page 9 of 15fd=open(hello,O_RDWR|O_CREAT,0644);if(fd 0)printf(Open file errorn);exit(1);/*给文件上读取锁*/lock_set(fd,F_RDLCK);getchar();/*给文件解锁*/lock_set(fd,F_UNLCK);getchar();close(fd);exit(0);/*/*write_lock.cwrite_lock.c*/*/#include#include#include#include#include#include#include lock_set.cint main(void)int fd;/*首先打开文件*/fd=open(hello,O_RDWR|O_CREAT,0644);if(fd 0)printf(Open file errorn);exit(1);/*给文件上写入锁*/lock_set(fd,F_WRLCK);getchar();/*给文件解锁*/lock_set(fd,F_UNLCK);getchar();close(fd);exit(0);嵌入式 linux 程序开发课程设计报告fcntl()编程实现 陈丽丹07323202Page 10 of 15Make 工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入 Makefile 文件文件的内容来执行大量的编译工作 Makefile 的作用是根据配置的情况,构造出需要编译的源文件列表,然后分别编译,链接。Linux 内核中与 Makefile 相关的文件:顶层 Makefile:整个内核配置、编译的总体控制文件。.config:内核配置文件,包含由用户选择的配置选项,用来存放内核配置后的结果。arch/*/Makefile:位于各种 CPU 体系目录下的 Makefile,如arch/arm/Makefile,是针对特定平台的 Makefile。各个子目录下的 Makefile:比如 drivers/Makefile,负责所在子目录下源代码的管理。Rules.make:规则文件,被所有的 Makefile 使用。Makefile 是 Make 读入的唯一配置文件 由 make 工具创建的目标体(target),通常是目标文件或可执行文件 要创建的目标体所依赖的文件(dependency_file)创建每个目标体时需要运行的命令(command)隐式规则 隐含规则能够告诉 make 怎样使用传统的技术完成任务,这样,当用户使用它们时就不必详细指定编译的具体细节,而只需把目标文件列出即可 C 编译:.c.c 变为.o.o$(CC)c$(CPPFLAGS)$(CFLAGS)C+编译:.cc.cc或或.C.C 变为.o.o$(CXX)-c$(CPPFLAGS)$(CXXFLAGS)模式规则 模式规则是用来定义相同处理规则的多个文件的。它不同于隐式规则,隐式规则仅仅能够用 make 默认的变量来进行操作,而模式规则还能引入用户自定义变量,为多个文件建立相同的规则,从而简化了 Makefile 的编写 模式规则的格式类似于普通规则,这个规则中的相关文件前必须用“%”标明 直接运行 make 选项-C dir 读入指定目录下的 Makefile-f file 读入当前目录下的 file 文件作为 Makefile-i 忽略所有的命令执行错误-I dir 指定被包含的 Makefile 所在目录-n 只打印要执行的命令,但不执行这些命令-p 显示 make 变量数据库和隐含规则-s 在执行命令时不显示命令-w 如果 make 在执行过程中改变目录,打印当前目录名/*/*makefile.cmakefile.c*/*/EXEC_WR=write_lockOBJS_WR=write_lock.oEXEC_RD=read_lock嵌入式 linux 程序开发课程设计报告fcntl()编程实现 陈丽丹07323202Page 11 of 15OBJS_RD=read_lock.oHEADERS=CC=gccINC=-I.CFLAGS=$INC-gall:$EXEC_WR$EXEC_RD$EXEC_WR:$OBJS_WR$CC$CFLAGS$LDFLAGS-o$OBJS_WR$EXEC_RD:$OBJS_RD$CC$CFLAGS$LDFLAGS-o$OBJS_RD$OBJS_WR:$HEADERS$OBJS_RD:$HEADERS.PHONY:cleanclean:-rm-f$OBJS_WR$EXEC_WR$OBJS_RD$EXEC_RD六六G Gcccc 编译器的安装过程编译器的安装过程gcc 是 GNU 的 C 和 C+编译器,它是 Linux 中最重要的软件开发工具。实际上,gcc 能够编译三种语言:C、C+和 Object C(C 语言的一种面向对象扩展)。利用 gcc 命令可同时编译并连接 C 和 C+源程序。汇编语言的编译器为as。编译器被成功的移植到不同的处理平台上。标准Linux 上的CC 是 FORINTELCPU 的,而 ARM 系列开发套件使用的是 FOR arm 系列处理器的 gcc 是和elf-as 及其相应的 GNUBinutils 工具集(如ld 链接工具,等工具)安装步骤:1.共享文件:虚拟机-设置-opintons-(共享文件)shared Folders-添加LinuxV4.0改名为“cld”2.解压安装包,安装交叉编译器 gcc桌面-新建终端命令:cd/mntlscd hgfscd cld嵌入式 linux 程序开发课程设计报告fcntl()编程实现 陈丽丹07323202Page 12 of 15ls./install.sh嵌入式 linux 程序开发课程设计报告fcntl()编程实现 陈丽丹07323202Page 13 of 15如上图群所示,安装 Gcc 编译器七程序运行七程序运行 Gcc 的编译流程分为四个步骤 预处理(Pre-Processing)编译(Compiling)汇编(Assembling)链接(Linking)源代码*.c预处理器头文件*.h编译器目标代码*.o可执行文件引导代码库函数汇编处理链接源代码*.c预处理器头文件*.h编译器目标代码*.o可执行文件引导代码库函数引导代码库函数汇编处理链接嵌入式 linux 程序开发课程设计报告fcntl()编程实现 陈丽丹07323202Page 14 of 15八心得体会八心得体会课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.回顾起此次嵌入式 linux 程序开发,至今我仍感慨颇多,的确,从选题到定稿,从理论到实践,在整整一星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相嵌入式 linux 程序开发课程设计报告fcntl()编程实现 陈丽丹07323202Page 15 of 15结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固通过这次课程设计之后,一定把以前所学过的知识重新温故。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的辛勤指导下,同学的帮助下终于迎刃而解。在次我表示感谢!九参考文献九参考文献1C 语言程序设计教程罗坚 王声决 主编中国铁道出版社2嵌入式 linux 应用程序开发标准教程(第二版)华清远见嵌入式培训中心3C+面向对象程序设计曹静 主编中国水利水电出版社八评分表八评分表