《嵌入式Linux高级实践教程》由会员分享,可在线阅读,更多相关《嵌入式Linux高级实践教程(28页珍藏版)》请在金锄头文库上搜索。
1、 ARM 嵌入式技术实践教程 1第第 7 章章 嵌入式嵌入式 Linux 操作系统实验操作系统实验7.2 Linux 应用程序编写实验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、基础知识;2. 程序调试的基础知识和方法;3. Linux 的基本操作。7.2.4 实验设备1. 硬件:JXARM9-2410 嵌入式实验箱、PC 机 Pentumn500 以上,硬盘 10G 以上;2. 软件:PC 机操作系统 redhat linux 9.0 Linux 开发环境。7.2.5 基础知识helloworld 程序是一个只在输出控制台(计算机屏幕或者串口控制台)上打印出“Hello, World!”(英语,意为“你好,世界!”)字串的程序。该程序通常是计算机程序设计语言的初学者所要学习编写的第一个程序。它还可以用来确定该语言的编译器、程序开发环境以及运行环境已经正确安装。本实验
3、也将 helloworld 程序作为第一个学写的程序,并通过实际的动作让学生了解嵌入式Linux 应用程序开发和 PC 机中 Linux 应用程序开发的异同。 ARM 嵌入式技术实践教程 21. 交叉编译通常,程序是在一台计算机上编译,然后再分布到将要使用的其他计算机上。当主机系统(运行编译器的系统)和目标系统(产生的程序将在其上运行的系统)不兼容时,该过程就叫做交叉编译。除了兼容性这个明显的好处之外,交叉编译还由于以下两个原因而非常重要:1、当目标系统对其可用的编译工具没有本地设置时;2、当主机系统比目标系统要快得多,或者具有多得多的可用资源时。本实验所使用的开发系统是 x86 体系结构的
4、Linux 系统(RedHat)。而我们的目的是要开发能够运行在 JXARM9-2410 教学实验箱中的 Linux 应用程序。由于 JXARM9-2410 教学实验箱中的Linux 本身不具有自己的编译工具,因此我们必须在 RedHat 中进行交叉编译,编译完成后将执行码下载到 JXARM9-2410 教学实验箱中的 Linux,然后运行或者调试。这样做的另外一个好处是,在采用 RedHat 的主机系统通常其 CPU 速度、接口等软硬件资源都比 JXARM9-2410 教学实验箱中的 Linux 要丰富得多,因此在其上进行交叉编译效率要高得多。在同一平台编译能够运行在不同平台上运行的程序的最
5、主要差别在于所采用的编译器不同。在 Redhat 中编译 x86 平台的采用 gcc 编译器,而编译 ARM 平台的采用 arm-elf-gcc 或者 arm-linux-gcc 编译器。在本实验箱中,所有 Linux 实验均采用 arm-linux-gcc 编译器编译。2. helloworld 的编译helloworld 可以说是最简单的应用程序,通过如下命令进行编译:gcc -o helloworld helloworld.c其中-o 指定输出文件到 helloworld,helloworld.c 为编译的源文件。该命令执行后,将对helloworld.c 文件进行编译,并将生成 hel
6、loworld 可执行文件。这个文件就是在指定平台上可以运行的执行程序,如果使用 gcc 进行编译即为可在 x86 平台上运行的程序,如果使用 arm-linux-gcc 进行编译则为可以在 ARM 平台上运行的程序。3. Makefile 文件Makefile 文件的作用有点类似于 DOS 下的批处理文件,通过编写 Makefile 文件,用户可以将一个很复杂的程序(可能包含上百个甚至更多的源文件或者目录)通过简单的 make 命令进行编译。7.2.6 实验步骤1. 建立工作目录注:本实验以及后续的所有实验中用“$”符号表示在 Linux 控制台上输入的命令行。$cd /home/cvtec
7、h/jx2410/examples$mkdir helloworld$cd helloworld2. 编写程序源代码 ARM 嵌入式技术实践教程 3在 Linux 下的文本编辑器有许多,常用的是 vim, Xwindow 界面下的 gedit 等,我们在开发过程中推荐使用 vi,用户需要学习 vi 的操作方法,请参考附录中的关于 vi 的操作指南。实际的源代码较简单,如下:#include int main()printf(Hello, World!n);3. 编译并运行 x86 平台的 helloworld 程序$gcc -o helloworld helloworld.c$./hellow
8、orld正确的结果将在主机的显示器上打印如下字符串:Hello, World!4. 编译并运行 ARM 平台的 helloworld 程序$arm-linux-gcc -o helloworld helloworld.c由于编译器采用的是 arm-linux-gcc 编译器,因此使用上述命令编译出来的程序只能在 ARM处理器上运行,不能在 x86 平台下运行,如果在 RedHat 中运行该程序将出现如下错误结果。$./helloworldbash: ./helloworld: cannot execute binary file5. 下载 helloworld 程序到 JXARM9-2410
9、中调试通过 ftp 或者 nfs 将第四步编译的程序 helloworld 下载到 JXARM9-2410 的 Linux 的/bin 目录下,JXARM9-2410 中 Linux 应用程序的下载和调试方法请参见用户手册。下载完成后,可以使用 ls 命令查看该文件是否存在,如果存在,然后在控制台(MiniCom)输入如下命令:$cd /bin$chmod 777 helloworld$./helloworld正确的结果将在 MiniCom 上打印如下字符串:Hello, World!6. 编写 Makefile 文件使用 vi 编辑工具编辑 Makefile,请注意文件名的 M 必须大写,其
10、余为小写,如下所示,。注意其中每行前面的空格位置必须使用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) 所采
11、用的编译器和链接器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 进行编译使用如下命令编译
12、 ARM 平台的 helloworld 程序。$make clean$makearm-linux-gcc -c -o helloworld.o helloworld.carm-linux-gcc -o helloworld helloworld.o使用如下命令编译 x86 平台的 helloworld 程序。$make clean$make CC=gccgcc -c -o helloworld.o helloworld.cgcc -o helloworld helloworld.o分别参照步骤 3 和步骤 5 运行两种不同版本的程序,将得到相同的结果。7.2.7 实验报告要求1. 简述交叉编译
13、的基本概念,简述 x86 平台和 ARM 平台编译环境的异同;2. 简述 Makefile 文件的作用和基本组成;3. JXARM9-2410 中怎样将编写的应用程序下载到 Linux 中,怎样在 Linux 中运行该程序? ARM 嵌入式技术实践教程 57.3 Linux 驱动程序编写实验7.3.1 实验目的1. 掌握 Linux 驱动程序 leddrv 的编程;2. 掌握 Linux 应用程序加载驱动程序的方法;3. 掌握 Linux 动态加载驱动程序模块的方法。7.3.2 实验内容1. 编写 leddrv 驱动程序;2. 编写 Makefile 文件;3. 编写 ledtest 应用程序
14、;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 机操作系统 redhat linux 9.0 Linux 开发环境。7.3.5 基础知识1. Linux 驱动程序Linux 是 Unix 操作系统的一种变种,在 Linux 下编写驱动程序的
15、原理和思想完全类似于其他的 Unix 系统,但它 dos 或 window 环境下的驱动程序有很大的区别。在 Linux 环境下设计驱动程序,思想简洁,操作方便,功能也很强大。系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能:1) 对设备初始化和释放;2) 把数据从内核传送到硬件和从硬件读取数据; ARM 嵌入式技术实践教程 63) 读取应用程序传送给设备文件的数据和回送应用程序请求的数据;4) 检测和处理设备出现的错误。在 Linux 操作系统下有三类主要的设备文件类型,字符设备、块设备和网络设备。字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件 I/O 一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,