《嵌入式LINUX概述.ppt》由会员分享,可在线阅读,更多相关《嵌入式LINUX概述.ppt(44页珍藏版)》请在三一办公上搜索。
1、第二章 嵌入式LINUX概述,2.1 嵌入式LINUX简介2.2 嵌入式LINUX开发流程和环境2.3 GCC工具简要介绍,结 束,2.1 嵌入式LINUX简介,2.1.1 嵌入式LINUX的发展2.1.2 嵌入式LINUX的优点2.1.3 嵌入式LINUX的缺点,返回本章首页,嵌入式LINUX的发展,Linux 正在嵌入式开发领域稳步发展。Linux 使用 GPL,所有对特定开发板、PDA、掌上机、可携带设备等嵌入式 Linux 系统感兴趣的人都可以从因特网上免费下载其内核和应用程序,并开始移植和开发。许多 Linux 改良品种迎合了嵌入式市场,它们包括 RTLinux(实时 Linux)、
2、uclinux(用于非 MMU 设备的 Linux)、Montavista Linux(用于 ARM、MIPS、PPC 的 Linux 分发版)、ARM-Linux(ARM 上的 Linux)和其它 Linux 系统。,嵌入式 Linux 的发展比较迅速。NEC、索尼已经在销售个人视频录像机等基于 Linux的消费类电子产品,摩托罗拉则计划在其未来的大多数手机上使用 Linux,IBM 也制定了在手持机上运行 Linux 的计划。数年来,“Linux 标准库”组织一直在从事对在服务器上运行的 Linux 进行标准化的工作,现在,嵌入式计算领域也开始了这一工作。嵌入式 Linux标准吸引了“Li
3、nux 标准库”以及Unix 组织中有益的元素。,返回本节,嵌入式LINUX的优点,典型的 Linux 系统经过打包,在拥有硬盘和大容量内存的 PC 机上运行,嵌入式系统不需要这么高的配置。一个功能完备的 Linux 内核要求大约 1 MB 内存。而 Linux 微内核只占用其中很小一部分内存,包括虚拟内存和所有核心的操作系统功能在内,只需占用系统约 100 K 内存。只要有 500 K 的内存,一个有网络栈和基本实用程序的完全的 Linux 系统就可以在一台 8 位总线(SX)的 Intel 386 微处理器上运行的很好了。,由于内存要求常常是需要的应用所决定的,因此它是一个瞄准嵌入式市场的
4、轻量级操作系统。与传统的实时操作系统相比(RTOS),采用象嵌入式 Linux这样的开放源码的操作系统的另外一个好处是 Linux 开发团体看来会比 RTOS 的供应商更快地支持新的 IP 协议和其它协议。例如,用于 Linux 的设备驱动程序要比用于商业操作系统的设备驱动程序多,如网络接口卡(NIC)驱动程序以及并口和串口驱动程序。核心 Linux 操作系统本身的微内核体系结构相当简单。,网络和文件系统以模块形式置于微内核的上层。驱动程序和其它部件可在运行时作为可加载模块编译到或者是添加到内核。这为构造定制的可嵌入系统提供了高度模块化的构件方法。而在典型情况下该系统需结合定制的驱动程序和应用
5、程序以提供附加功能。,返回本节,嵌入式LINUX的缺点,嵌入式LINUX不是一个实时嵌入式操作系统。在嵌入式系统上运行 Linux 的一个缺点是 Linux 体系提供实时性能需要添加实时软件模块。而这些模块运行的内核空间正是操作系统实现调度策略、硬件中断异常和执行程序的部分,容易引起严重错误。,返回本节,2.2嵌入式LINUX开发流程和环境,2.2.1 嵌入式LINUX的开发流程2.2.2 嵌入式LINUX的开发环境建立,返回本章首页,嵌入式LINUX的开发流程,嵌入式 linux 开发,根据应用需求的不同有不同的配置开发方法,但是一般都要经过以下过程:建立开发环境。操作系统一般使用 REDH
6、AT LINUX,版本7 到9 都可以,选择定制安装或全部安装,通过网络下载相应的 GCC 交叉编译器进行安装,或者安装产品厂家提供的交叉编译器。,配置开发主机。配置 MINICOM,一般参数为波特率 115200,数据位 8 位,停止位 1,无奇偶校验,软硬件控制流设为无。MINICOM 软件的作用是作为调试嵌入式开发板信息输出的监视器和键盘输入的工具;配置网络,主要是配置 NFS 网络文件系统,需要关闭防火墙,简化嵌入式网络调试环境设置过程。,建立引导装载程序 BOOTLOADER。从网络上下载一些公开源代码的 BOOTLOADER,如U-BOOT、VIVI、等,根据自己具体芯片进行移植修
7、改。有些芯片没有内置引导装载程序,比如三星的 ARM7、ARM9 系列芯片,这样就需要编写烧写开发板上flash 的烧写程序,网络上有免费下载的 WINDOWS下通过 JTAG并口简易仿真器烧写 ARM 外围 flash 芯片的程序。,也有 LINUX下公开源代码的 J-FLASH 程序。如果不能烧写自己的开发板,就需要根据自己的具体电路进行源代码修改。这是让系统可以正常运行的第一步。如果你购买了厂家的仿真器当然比较容易烧写 flash 了,但是其核心技术是无法了解的。这对于需要迅速开发应用的人来说是可以提高进度的。,下载别人已经移植好的 LINUX 操作系统,如 UCLINUX、ARM-LI
8、NUX、PPC-LINUX 等。如果有专门针对你所使用的 CPU 移植好的LINUX 操作系统那是再好不过,下载后再添加自己的特定硬件的驱动程序,进行调试修改,对于带 MMU 的CPU 可以使用模块方式调试驱动,对于UCLINUX 这样的系统好像只能编译进内核进行调试。,建立根文件系统,从 下载使用BUSYBOX 软件进行功能裁减,产生一个最基本的根文件系统,再根据自己的应用需要添加其他的程序。默认的启动脚本一般都不会符合应用的需要,所以就要修改根文件系统中的启动脚本。,建立应用程序的 flash磁盘分区,一般使用 JFFS2或 YAFFS文件系统,这需要在内核中提供这些文件系统的驱动,有的系
9、统使用一个线性 flash(NOR 型)512K32M,有的系统使用非线性 flash(NAND 型)8512M,有的两个同时使用,需要根据应用规划 flash的分区方案。,开发应用程序,可以下载到根文件系统中,也可以放入 YAFFS、JFFS2 文件系统中,有的应用程序不使用根文件系统,而是直接将应用程序和内核设计在一起,这有点类似于 UCOS-II的方式。,返回本节,嵌入式LINUX的开发环境建立,通常的嵌入式系统的软件开发采用一种交叉编译调试的方式。交叉编译调试环境建立在宿主机(即一台 PC 机)上,对应的开发板叫做目标板。在进行嵌入式开发前第一步的工作就是要安装一台装有指定操作系统的
10、PC 机作宿主开发机,对于嵌入式 LINUX,宿主机上的操作系统一般要求为 REDHAT LINUX。,嵌入式开发通常要求宿主机配置有网络,支持 NFS(为交叉开发时 mount 所用)。然后要在宿主机上建立交叉编译调试的开发环境。环境的建立需要许多的软件模块协同工作,这将是一个比较繁杂的工作,不过这些工作都已经由专业人士完成,我们所做的就是依样画葫芦。,主机中,LINUX安装后,需要配置网络,包括配置 IP地址、NFS 服务、防火墙。网络配置主要是要安装好以太网卡,对于一般常见的 RTL8139 网卡,REDHAT9.0 可以自动识别并自动安装好,完全不要用户参与因此建议使用该网卡。然后配置
11、宿主机 IP 为 192.168.0.121。如果是在有多台计算机使用的局域网环境使用此开发设备,IP地址可以根据具体情况设置。,对于 REDHAT9.0,它默认的是打开了防火墙,因此对于外来的 IP 访问它全部拒绝,这样其它网络设备根本无法访问它,即无法用 NFS mount 它,许多网络功能都将无法使用。因此网络安装完毕后,应立即关闭防火墙。在系统设置菜单中选择服务器设置菜单,再选中服务菜单,将 iptables 服务的勾去掉,并确保 nfs 选项选中。,配置 NFS:点击主菜单运行系统设置-服务器设置-NFS服务器(英文为:SETUP-SYSTEM SERVICE-NFS),点击增加出现
12、如下在界面,在目录(Drictory):中填入需要共享的路径,在主机(Hosts):中填入允许进行连接的主机 IP地址。并选择允许客户对共享目录的操作为只读(Readonly)或读写(Read/write)。当将远程根用户当作本地根用户时,对于操作比较方便,但是安全性较差。,配置MINICOM:在终端的命令行提示符后输入 minicom,回车,你就会看到 minicom的启动画面。minicom启动后,先按 CtrlA键,再按Z 键(注意不是连续按,Ctrl+A松开后才按 Z),进入主配置界面。按“O”进入配置界面。按上下键选择 Serial port setup,进入端口设置界面,这里有几个
13、重要选项改为如下值:,Serial Device:/dev/ttyS0(端口号使用串口 1)BPS/par/bits:/115200 8N1(波特率)F,E 硬件流,软件流都改为 NO,若要使用 PC 机的串口 2 来接板子的串口 1 做监控,改为:/dev/ttyS1 即可。,返回本节,2.3 GCC工具简要介绍,2.3.1 GCC概述2.3.2 GCC的执行过程2.3.3 GCC的基本用法和选项2.3.4 GCC的使用实例,返回本章首页,GCC概述,在LINUX开发环境下,GCC是进行C程序开发不可或缺的编译工具。它包含了预处理器、编译器、汇编器、链接器等组件。对于一般的开发者,GCC可提
14、供简单的使用方法,即只要给它提供C源代码文件,它将完成预处理器、编译、汇编、链接所有工作,最后生成一个可执行文件。对于中高级开发者,它提供了足够多的参数,可让开发者全面控制代码的生成,这对于嵌入式系统级软件开发者相当重要。,通常linux系统上的默认gcc都是针对PC机自身的硬件平台,一般来说是X86系列或者是兼容机。但是在嵌入式系统开发中,针对的是目标机进行开发,所需的gcc工具并不一定针对X86及其兼容系列。ARM公司已经提供了在LINUX平台上进行交叉开发的gcc工具,arm-linux-gcc、arm-uclibc-gcc等。它们是针对ARM硬件平台进行开发的。我们可以从网上下载这些工
15、具。一般的教学设备经销商也都提供这些工具。,GCC识别的主要文件扩展名如下表所示。这里原码文件的扩展名就清楚地区别GCC使用的预处理器和汇编器。使用源码文件来产生某种形式的目标文件。在这一系列的处理过程中,文件的名没有改变,改变的是扩展名。在链接阶段中,一个目标文件中对其他文件符号中符号参考引用被解释和替换。,返回本节,GCC的执行过程,虽然我们称GCC是C语言的编译器,但使用GCC由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking
16、)。,命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。,当所有的目标文件都生成之后,gcc就调用 ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。,返回本节,GCC的基本用
17、法和选项,在使用gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。gcc编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数。,GCC最基本的用法是gcc options filenames 其中options就是编译器所需要的参数,filenames给出相关的文件名称。-c,只编译,不链接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。,-o output_filename,确定输出文件的名称output_filename,同时这个名称不能和源文件同名。如果不给出
18、这个选项,gcc就给出预设的可执行文件a.out-g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。-O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。,-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。-Wall,编译警告选项,在编译的过程中如果gcc遇到一些它认为可能会发生错误的地方就会提出一些相应的警告和提示信息。提示我们注意这个地方是不是有什么失误导致的错误。-Idirname,将dirname所指出的
19、目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。,C程序中的头文件包含两种情况 A)#include B)#include“myinc.h”其中,A类使用尖括号(),B类使用双引号(“”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件。,而对于B类,cpp在当前目录中搜寻头文件,这个选项的作用是告诉cpp,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。在程序设计中,如果我们需要的这种包含文件分别分布在不同的目录中,就需要逐个使用-I选项给出搜索路径。,-Ldirname,将dirname所指出的目录加入到
20、程序函数档案库文件的目录列表中,是在连接过程中使用的参数。在预设状态下,连接程序ld 在系统的预设路径中(如/usr/lib)寻找所需要的档案库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后到系统预设路径中寻找,如果函数库存放在多个目录下,就需要依次使用这个选项,给出相应的存放目录。,-lname,在连接时,装载名字为“libname.a”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下。例如,-lm表示连接名为“libm.a”的数学函数库。,GCC编译器如果发现源程序中有错误,就无法继续进行,也无法生成最终的可执行文件。为了便于修改,gcc给出错误资讯,我们必须
21、对这些错误资讯逐个进行分析、处理,并修改相应的语言,才能保证源代码的正确编译连接。gcc给出的错误资讯一般可以分为四大类,分别是:C语法错误 头文件错误 档案库错误 未定义符号,返回本节,GCC的使用实例,学习的最好方法是实践,下面我们就开始一个非常简单的Hello World实例。#include int main(int argc,char*argv)char*pszStr=Hello worldn;printf(Hello,worldn);exit(0);,1)使用缺省方法编译该程序 gcc hello.c 使用缺省方法编译以后,会生成一个a.out程序2)使用o参数 gcc o hello hello.c 使-o参数编译以后,会生成一个hello执行文件。,3)使用Wall选项查看是否有警告信息 gcc-o hello hello.c-Wall hello.c:In function mainhello.c:5:warning:unused variable pszStr hello.c:8:warning:control reaches end of non-void function 两个警告信息。一个是第五行申明的变量*pszStr没有被使用到,我们可以删除,一个是我们申明函数返回int型,但是没有返回一个返回值。,返回本节,