嵌入式Linux高级实践教程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

ARM嵌入式技术实践教程1第第77章章嵌嵌入入式式LLiinnuuxx操操作作系系统统实实验验7.2Linux应用程序编写实验7.2.1实验目的1.熟悉JXARM9-2410教学系统中的Linux开发环境;2.掌握简单的Linux应用程序-helloworld的编译;3.掌握JXARM9-2410教学系统中Linux应用程序的调试。7.2.2实验内容1.编写helloworld应用程序;2.编写Makefile文件;3.编译helloworld应用程序;4.下载并调试helloworld应用程序。7.2.3预备知识1.C语言的基础知识;2.程序调试的基础知识和方法;3.Linux的基本操作。7.2.4实验设备1.硬件:JXARM9-2410嵌入式实验箱、PC机Pentumn500以上,硬盘10G以上;2.软件:PC机操作系统redhatlinux9.0+Linux开发环境。7.2.5基础知识helloworld程序是一个只在输出控制台(计算机屏幕或者串口控制台)上打印出“Hello,World!”(英语,意为“你好,世界!”)字串的程序。该程序通常是计算机程序设计语言的初学者所要学习编写的第一个程序。它还可以用来确定该语言的编译器、程序开发环境以及运行环境已经正确安装。本实验也将helloworld程序作为第一个学写的程序,并通过实际的动作让学生了解嵌入式Linux应用程序开发和PC机中Linux应用程序开发的异同。ARM嵌入式技术实践教程21.交叉编译通常,程序是在一台计算机上编译,然后再分布到将要使用的其他计算机上。当主机系统(运行编译器的系统)和目标系统(产生的程序将在其上运行的系统)不兼容时,该过程就叫做交叉编译。除了兼容性这个明显的好处之外,交叉编译还由于以下两个原因而非常重要:1、当目标系统对其可用的编译工具没有本地设置时;2、当主机系统比目标系统要快得多,或者具有多得多的可用资源时。本实验所使用的开发系统是x86体系结构的Linux系统(RedHat)。而我们的目的是要开发能够运行在JXARM9-2410教学实验箱中的Linux应用程序。由于JXARM9-2410教学实验箱中的Linux本身不具有自己的编译工具,因此我们必须在RedHat中进行交叉编译,编译完成后将执行码下载到JXARM9-2410教学实验箱中的Linux,然后运行或者调试。这样做的另外一个好处是,在采用RedHat的主机系统通常其CPU速度、接口等软硬件资源都比JXARM9-2410教学实验箱中的Linux要丰富得多,因此在其上进行交叉编译效率要高得多。在同一平台编译能够运行在不同平台上运行的程序的最主要差别在于所采用的编译器不同。在Redhat中编译x86平台的采用gcc编译器,而编译ARM平台的采用arm-elf-gcc或者arm-linux-gcc编译器。在本实验箱中,所有Linux实验均采用arm-linux-gcc编译器编译。2.helloworld的编译helloworld可以说是最简单的应用程序,通过如下命令进行编译:gcc-ohelloworldhelloworld.c其中-o指定输出文件到helloworld,helloworld.c为编译的源文件。该命令执行后,将对helloworld.c文件进行编译,并将生成helloworld可执行文件。这个文件就是在指定平台上可以运行的执行程序,如果使用gcc进行编译即为可在x86平台上运行的程序,如果使用arm-linux-gcc进行编译则为可以在ARM平台上运行的程序。3.Makefile文件Makefile文件的作用有点类似于DOS下的批处理文件,通过编写Makefile文件,用户可以将一个很复杂的程序(可能包含上百个甚至更多的源文件或者目录)通过简单的make命令进行编译。7.2.6实验步骤1.建立工作目录注:本实验以及后续的所有实验中用“$”符号表示在Linux控制台上输入的命令行。$cd/home/cvtech/jx2410/examples$mkdirhelloworld$cdhelloworld2.编写程序源代码ARM嵌入式技术实践教程3在Linux下的文本编辑器有许多,常用的是vim,Xwindow界面下的gedit等,我们在开发过程中推荐使用vi,用户需要学习vi的操作方法,请参考附录中的关于vi的操作指南。实际的源代码较简单,如下:#includestdio.hintmain(){printf(Hello,World!\n);}3.编译并运行x86平台的helloworld程序$gcc-ohelloworldhelloworld.c$./helloworld正确的结果将在主机的显示器上打印如下字符串:Hello,World!4.编译并运行ARM平台的helloworld程序$arm-linux-gcc-ohelloworldhelloworld.c由于编译器采用的是arm-linux-gcc编译器,因此使用上述命令编译出来的程序只能在ARM处理器上运行,不能在x86平台下运行,如果在RedHat中运行该程序将出现如下错误结果。$./helloworldbash:./helloworld:cannotexecutebinaryfile5.下载helloworld程序到JXARM9-2410中调试通过ftp或者nfs将第四步编译的程序helloworld下载到JXARM9-2410的Linux的/bin目录下,JXARM9-2410中Linux应用程序的下载和调试方法请参见用户手册。下载完成后,可以使用ls命令查看该文件是否存在,如果存在,然后在控制台(MiniCom)输入如下命令:$cd/bin$chmod777helloworld$./helloworld正确的结果将在MiniCom上打印如下字符串:Hello,World!6.编写Makefile文件使用vi编辑工具编辑Makefile,请注意文件名的M必须大写,其余为小写,如下所示,。注意其中每行前面的空格位置必须使用’Tab’键。CC=arm-linux-gccLD=arm-linux-ldEXEC=helloworldOBJS=helloworld.oCFLAGS+=LDFLAGS+=all:$(EXEC)ARM嵌入式技术实践教程4$(EXEC):$(OBJS)$(CC)$(LDFLAGS)-o$@$(OBJS)$(LDLIBS$(LDLIBS_$@))clean:-rm-f$(EXEC)*.elf*.gdb*.o上述为一个典型的Makefile脚本文件的格式。下面简单介绍一下各个部分的含义:1)所采用的编译器和链接器CC=arm-linux-gccLD=arm-linux-ld2)生成的执行文件和链接过程中的目标文件EXEC=helloworldOBJS=helloworld.o3)编译和链接的参数$(EXEC):$(OBJS)CFLAGS+=LDFLAGS+=4)编译命令,执行完成将生成helloworld映像文件$(CC)$(LDFLAGS)-o$@$(OBJS)$(LDLIBS$(LDLIBS_$@))5)清除clean:-rm-f$(EXEC)*.elf*.gdb*.o$(OBJS):6)使用make进行编译使用如下命令编译ARM平台的helloworld程序。$makeclean$makearm-linux-gcc-c-ohelloworld.ohelloworld.carm-linux-gcc-ohelloworldhelloworld.o使用如下命令编译x86平台的helloworld程序。$makeclean$makeCC=gccgcc-c-ohelloworld.ohelloworld.cgcc-ohelloworldhelloworld.o分别参照步骤3和步骤5运行两种不同版本的程序,将得到相同的结果。7.2.7实验报告要求1.简述交叉编译的基本概念,简述x86平台和ARM平台编译环境的异同;2.简述Makefile文件的作用和基本组成;3.JXARM9-2410中怎样将编写的应用程序下载到Linux中,怎样在Linux中运行该程序?ARM嵌入式技术实践教程57.3Linux驱动程序编写实验7.3.1实验目的1.掌握Linux驱动程序leddrv的编程;2.掌握Linux应用程序加载驱动程序的方法;3.掌握Linux动态加载驱动程序模块的方法。7.3.2实验内容1.编写leddrv驱动程序;2.编写Makefile文件;3.编写ledtest应用程序;4.编译leddrv和ledtest应用程序;5.下载并调试leddrv和ledtest应用程序。7.3.3预备知识1.C语言的基础知识;2.软件调试的基础知识和方法;3.Linux的基本操作;4.Linux应用程序的编写。7.3.4实验设备1.硬件:JXARM9-2410嵌入式实验箱、PC机Pentumn500以上,硬盘10G以上;2.软件:PC机操作系统redhatlinux9.0+Linux开发环境。7.3.5基础知识1.Linux驱动程序Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统,但它dos或window环境下的驱动程序有很大的区别。在Linux环境下设计驱动程序,思想简洁,操作方便,功能也很强大。系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能:1)对设备初始化和释放;2)把数据从内核传送到硬件和从硬件读取数据;ARM嵌入式技术实践教程63)读取应用程序传送给设备文件的数据和回送应用程序请求的数据;4)检测和处理设备出现的错误。在Linux操作系统下有三类主要的设备文件类型,字符设备、块设备和网络设备。字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如果不能,就调用请求函数来进行实际的I/O操作。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。用户进程是通过设备文件来与实际的硬件打交道.每个设备文件都都有其文件属性(c/b),表示是字符设备还是块设备,另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区分他们。设备文件的的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序。2.编写简单的驱动程序本实验将编写一个简单的字符设备驱动程序。虽然它的功能很简单,但是通过它可以了解Linux的设备驱动程序的工作原理。该程序leddrv实现对JXARM9-2410中的跑马灯进行控制。它主要包含如下几个部分:1)包含文件#includelinux/kernel.h#includelinux/module.h#includelinux/fs.h#includelinux/errno.h/*for-EBUSY*/#includelinux/ioport.h/*forverify_area*/#includelinux/init.h/*formodule_init*/#includeasm/uaccess.h/*forget_userandput_user*/#includeasm-arm/arch-s3c2410/s3c2410.h#includeleddrv.h2)模块初始化由于用户进程是通过设备文件同硬件打交道,对设备文件的操作方式不外乎就是一些系统调用,如open,read,write,close...

1 / 28
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功