现场总线的开关量I/O模块设计:操作系统移植与驱动开发
扫描二维码
随时随地手机看文章
5.1常用的嵌入式操作系统
当前常见的嵌入式操作系统主要有嵌入式Linux、Windows CE及VxWorks,在各个领域得到广泛应用,具有各自的特性与优势:
①从系统性能比较
Linux是一个成熟而稳定的网络操作系统,为嵌入式操作系统提供了一个极有吸引力的选择,它是个和Unix相似、以核心为基础的、完全内存保护、多任务、多进程的操作系统,支持广泛的计算机硬件,包括X86 ,Alpha、MIPS、PPC、ARM、NEC、MOTOROLA等现有的大部分芯片,可以定制,其系统内核最小只有约134K B,在信息家电、工控等领域有广泛应用。
WinCE是一个软实时系统,具有模块化、结构化和基于Win32应用程序接口和与处理器无关等特点,主要用于对实时性要求不高,但对界面要求较高的领域,在PDA、手机、显示仪表等领域得到非常广泛应用。
VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),具有多达1800个功能强大的应用程序接口(API ) ,它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中。
②从开发角度比较
Linux程序源码全部公开,任何人可以修改并在GNU通用公共许可证下发行,这样,开发人员可以对操作系统进行定制。同时由于有GPL (General Public License )的控制,大家开发的东西大都相互兼容。Linux用户遇到问题时可以通过Internet向网上成千上万的Linux开发者请教,这使最困难的问题也有办法解决。Linux带有Unix用户熟悉的完善的开发工具,几乎所有的Unix系统的应用软件都已移植到了Linux上。Linux还提供了强大的网络功能,有多种可选择窗口管理(Xwindows )。其强大的语言编译器gcc、g++等也可以很容易得到。目前正在开发的嵌人式系统中,49%的项目选择Linux作为嵌入式操作系统。
就VxWorks与Win CE而言,厂商不但提供了稳定可靠方便的集成开发环境,而且提供了大量针对具体应用的完整解决方案,为具体开发带来极大便捷,但系统开发成本较昂贵。
本论文最终采用嵌入式Linux作为系统开发软件平台。
5.2 BOOTLOADER移植
引导加载程序Bootloader是系统加电后运行的第一段代码。Bootloader就是在操作系统内核或应用程序运行之前的一段程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。Bootloader是依赖于硬件而实现的,特别是在嵌入式系统中。不同的体系结构需求的Bootloader是不同的;除了体系结构,Bootloader还依赖于具体的嵌入式板级设备的配置。
5.2.1 U-Boot简介
U-Boot全称为Universal Bootloader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序。
选择U-Boot的理由:
▶开放源码;
▶支持多种嵌入式操作系统内核,如Linux、NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS;
▶支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale;
▶较高的可靠性和稳定性;高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;
▶丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;
▶较为丰富的开发调试文档与强大的网路技术支持;
5.2.2 U-Boot运行过程分析
U-Boot编译后的代码定义一般不超过100 KB,并且这100KB又分为两个阶段来执行。第一阶段的代码在start.s中定义,大小不超过10KB,它包括从系统上电后在0x00000000地址开始执行的部分。这部分代码运行在Flash中,它包括对S3C2440的一些寄存器的初始化和将U-Boot的第二段代码从Flash复制到SDRAM中。第二段的起始地址是在第一段代码中指定的,被复制到SDRAM后,就第一段跳到这个入口地址开始执行剩余部分代码。第二段主要是进行一些BSS段的设置、堆栈的初始化等工作,最后会跳转到main -loop函数中,接收命令并进行命令处理。
5.2.3 U-Boot移植
本系统用到的U-Boot版本为1.3.2.它不仅提供了对ARM-920T内核的支持,而且直接提供了对于S3C2440的板级支持,这使移植工作量相对减少。
(1) U-Boot版本1.3.2,gccversion4.1.2
(2)在Makefile中加入
zq2440_config:u nconfig @$(MKCONFIG ) $(@ :_config=) arm arm920t zq2440 NULL S3C24x0把板子起名为zq2440
(3)建立board/zq2440目录,复制board/smdk2410下的文件到board/zq2440目录,将smdk2410.c更名为zq2440.c.
(4)cp include/configs/smdk2410.h include/configs/zq2440.h
(5 )添加arm-softfloat-linux-gnu-到Makefile的CROSS_COMPILE=
(6)编译 make zq2440_config
make
(7)通过JTAG口将U-Boot烧写到Flash中,就可以从Nand Flash启动了。
Uboot在超级终端下运行结果如图5.1所示:
5.3嵌入式Linux内核的移植
5.3.1嵌入式Linux简介
嵌入式Linux是将日益流行的Linux操作系统进行裁剪、修改,使之能在嵌入式计算机系统上运行的一种操作系统。
嵌入式系统的软件和硬件往往只需针对某种特别的应用定制,因此嵌入式操作系统需要量体裁衣,除去冗余,同时尽可能发挥系统的潜力。Linux最初目标是一个通用的操作系统,因此必须对其进行面向嵌入式系统和应用环境的改造,以适应嵌入式系统的特殊要求。
嵌入式Linux系统包括内核和应用程序两部分。内核为应用程序提供一个虚拟的硬件平台,以统一的方式对资源进行访问,并且透明地支持多任务。嵌入式Linux内核可以分为六部分:进程调度,内存管理,文件系统,进程间通信,网络,设备驱动。应用程序负责系统的部分初始化,基本的人机界面,必要的命令等内容。
从Linux2.6内核版本开始了实时性革命。Linux内核本身也已经特别注重了向嵌入式系统的应用,Linux2.6内核已经把uCLinux的大部分并入主流内核功能中,同时加入提高中断性能和调度响应时间的改进,有三个最显著的改进:采用可抢占内核、更加有效的调度算法以及同步性的提高。Linux2.6内核在一定程度上是可抢占的,即当有比正在运行的进程优先级更高的进程就绪时,系统可强行剥夺正在运行进程的CPU,提供给具有更高优先级的进程使用,比Linux2.4内核具备更好的实时响应性(不是所有的内核代码段都可以被抢占)。Linux2.6内核加入了多种微控制器的支持,无MM U的处理器已经整合进了新的内核中,而且在无MM U控制器上仍旧支持多任务处理,但没有内存保护功能。对于WLAN、Bluetooth、GPRS、CDMA和WiFi等最新出现的无线网络协议和设备,Linux2.6内核重建了驱动的体系层次和编程模型,可以方便的适应这些网络设备的变化,而且特别提出了NAPI(NewAPI)等模型提高网络处理效率。
5.3.2嵌入式Linux的优势
嵌入式Linux的开发和研究是操作系统领域中的一个热点,目前已经开发成功的嵌入式系统中,大约有一半使用的是Linux.Linux之所以能在嵌入式系统市场上取得如此辉煌的成果,与其自身的优良特性是分不开的。
(1)开放的源码,丰富的软件资源
Linux是自由的操作系统,它的开放源码使用户获得了最大的自由度。Linux上的软件资源十分丰富,每一种通用程序在Linux上都可以找到。
(2)功能强大的内核,性能高效、稳定,多任务
Linux的内核非常稳定,它的高效和稳定性已经在各个领域,尤其在网络服务器领域,得到了事实的验证。Linux内核小巧灵活,易于裁减,这使得它很适合嵌入式系统的应用。
(3)支持多种体系结构,如X86、ARM、MIPS、PowerPC、SPARC等
目前,Linux已经被移植到数十种硬件平台上,几乎支持所有流行的CPU.
(4)完善的网络通讯、图形、文件管理机制
Linux自产生之日起就与网络密不可分,网络是Linux的强项。另外,Linux还支持多种文件和图形系统。
(5)支持大量的周边硬件设备
Linux上的驱动已经非常丰富了,它们支持各种主流硬件设备和最新硬件技术。
(6)大小、功能都可定制
Linux秉承Unix的优秀设计思想,非常灵活,各部分的可定制性都很强。
(7)良好的开发环境,不断发展的开发工具集
Linux有着非常优秀的完整开发工具链,有十几种集成开发环境,其中很多是免费的,大大降低了开发费用。
(8)软件开发者的广泛支持
Linux的自由精神吸引了成千上万的程序员投入到Linux的开发和测试中来,这使得Linux在短时间内就成为一个功能强大的操作系统。
(9)价格低廉
有效降低产品成本,对成本敏感的嵌入式系统来说至关重要,Linux恰好具有这一特性。
5.3.3嵌入式Linux的移植
在同一个硬件平台上可以嵌入不同的嵌入式操作系统,就好比PC既可以安装Windows又 可以安装Linux一样。同样,有些操作系统经过移植后可以运行在不同的硬件平台上。如果一个系统可以在不同硬件平台上运行,那么这个系统就是可移植的。 使某一个平台的代码运行在其他平台上的。过程叫做移植。
在Linux系统内核代码中有arch目录,其中包含了不同平台(包括i386、 ARM)的代码,arch目录中的代码是为多平台设计并使用的,与体系结构相关的代码都存放在arch/
本系统采用Linux2.6.12,Samsung S3C2440已经成为Linux的一个标准支持平台,对内核做简单的修改和配置后,无需任何其他的patch就可以在S3C2440的目标板上运行得很好。
(1)针对内核源码的修改
设置flash分区
内核对flash分区的支持是内核移植成功的一个关键步骤,一共要修改三个文件,分别如下:
指明分区信息
在arch/arm/machs3c2410/devs.c文件中,添加如下内容:
/**************增加的头文件**************/
# include< linux/mtd/partitions.h>
#include < asm/arch/nand.h>
#include < linux/mtd/nand.h>
/**************建立NANDFlash分区表**************/
●指定启动时初始化在
arch/arm/machs3c2410/machsmdk2410.c目录,kernel启动时依据对分区的设置进行初始配置,修改smdk_devices[]:指明初始化时包括前面所设置的flash分区信息,
static struct platform_device*smdk2410_devices[]__initdata={
3c_device_usb,
3c_device_lcd,
3c_device_wdt,
3c_device_i2c,
3c_device_iis,
3c_device_nand,/*添加该语句即可*/
};
●禁止Flash ECC校验kernel是通过bootloader写到Nand Flash的,bootloader通过软件ECC算法产生ECC校验码。这与内核校验的ECC码不一样,内核中的ECC码是由S3C2440中的Nand Flash控制器产生的。
修改drivers/mtd/nand/s3c2410.c文件:找到s3c2410_nand_init_chip( )函数,在该函数体最后加上如下语句。
chip ->eccmode = NAND_ECC_NONE ;
(2)内核配置及编译
主要是在make menuconfig中设置CPU以及设备驱动相关的配置信息,可以参考SMKD2410开发平台上的有关配置,除了自定义的文件系统以及命令行参数外,基本上有关S3C2410处理器开发平台上的配置均相同,在虚拟机上配置界面如图5.2所示。
根目录下只需修改Makefile文件。这个Makefile文件的任务有两个:产生vmlinux件和产生内核模块。为了达到此目的,Makefile将递归进入到内核的各个子目录中,分别调用位于这些子目录中的Makefile.
指定目标平台
ARCH:=arm
指定交叉编译器
CROSS_COMPILE=arm-linux-gcc
设置好交叉编译器之后,执行make clean、makeu Image,生成在IO模块上运行的内核映象文件uImage,通过网口或串口进行烧写。
5. 4嵌入式根文件系统的构建
Linux的一个最重要特点就是它支持许多不同的文件系统。这使Linux非常灵活,能够与许多其他的操作系统共存。Linux支持的常见的文件系统有:JFS、ReiserFS、ext、ext2、ext3、ISO9660、XFS、Minx、MSDOS、UMSDOS、VFAT、NTFS、HPFS、NFS、SMB、SysV、PROC等。随着时间的推移,Linux支持的文件系统数还会增加。
Linux是通过把系统支持的各种文件系统链接到一个单独的树形层次结构中,来实现对多文件系统的支持的。该树形层次结构把文件系统表示成一个整个的独立实体。无论什么类型的文件系统,都被装配到某个目录上,由被装配的文件系统的文件覆盖该目录原有的内容。该个目录被称为装配目录或装配点。在文件系统卸载时,装配目录中原有的文件才会显露出来。
文件系统都会被烧录在与某一存储设备上。在嵌入式设备上很少使用大容量的ID E硬盘作为自己的存储设备,嵌入式设备往往选用ROM、闪存( flash memory )等作为它的主要存储设备。在嵌入式设备上选用哪种文件系统格式与闪存的特点是相关的。
本硬件平台是以NAND Flash (闪存)作为主要的存储媒介,这类存储器与传统存储器最大的不同在于其是按扇区擦除、按位编程。Flash存储介质的这种技术特点使得传统的Linux文件系统已经不再适合在其上构建,比如Ext2文件系统,是专为像IDE那样的块设备设计的,没有提供很好的扇区擦写支持,不支持损耗平衡,没有掉电保护,也没有很好的扇区管理。这些缺点都表明,在Flash存储介质上应用为设备设计的传统文件系统不是一个很好的选择。基于这样的原因,产生了很多专为Flash设备而设计的文件系统。
利用BusyBox构建嵌入式根文件系统
Linux下的根文件系统目录结构如下:
目录 习惯用法
/bin 用户命令所在目录
/dev 硬件设备文件及其它特殊文件
/etc 系统配置文件,包括启动文件等
/home 多用户主目录
/lib 链接库文件目录
/mnt 装配点,用于装配临时文件系统或其他的文件系统
/opt 附加的软件套件目录
/proc 虚拟文件系统,用来显示内核及进程信息
/root root用户主目录
/sbin 系统管理员命令目录
/tmp 临时文件目录/usr用户命令目录
/var 监控程序和工具程序所存放的可变数据
对于用途单一的嵌入式系统,上边的一些用于多用户的目录可以省略,例如/home、/opt、/root目录等。而/bin、/dev、/etc、/lib、/proc、/sbin和/usr目录,是几乎每个系统必备的目录,也是不可或缺的目录。
制作根文件系统,就是创建各种目录,并在里面创建各种文件。比如在/bin、/sbin目录下存放各种可执行程序,在/etc目录下存放配置文件,在/lib目录下存放库文件。使用Busy box制作根文件系统,就是利用Busy box来创建/bin、/sbin等目录下的可执行的文件。
5.4.1 Buybox简介
Buybox被非常形象地称为嵌入式Linux系统中的“瑞士军刀”,它是一个Uinx工具集。它可提供一百多种GNU常用工具、shell脚本工具等。虽然Buybox中的这些工具相对于GNU提供的完全工具有所简化,但是它们都很实用。
Buybox在设计上就充分考虑了硬件资源受限的特殊工作环境。它采用模块化设计,使得它很容易被定制和裁剪。可以根据实际的用途,裁剪出一个最精简的工具集。
Buybox的特色是所有命令都编译成一个文件:Buybox,其他命令工具(如sh、cp、ls等)都是指向Buybox文件的链接。在使用Buybox生成的工具时,会根据工具的文件名链接到特定的处理程序。这样,所有这些程序只需被加载一次,而所有的Buybox工具组件都可以共享相同的代码段,这在很大程度上节省了系统的内存资源也提高了应用程序的执行速度。
Buybox仅需要几百KB的空间就可以运行,这使得Buybox很适合嵌入式系统使用。同时,Buybox的安装脚本也使得它很容易建立基于Buybox的根文件系统。通常只需要添加/dev、/etc等目录以及相关的配置脚本,就可以实现一个简单的根文件系统。
5.4.2 Buybox的配置编译
将Buybox的源码从网站上下载到本地目录,运行命令:
$tarzxvf Buybox-1.1.3.tar.gz
$cd Buybox-1.1.3
$make menuconfig
在虚拟机上配置界面如图5.3所示
典型的Buybox文件大小在动态链接的情况下是300KB左右,静态链接为800KB左右,用它实现的文件系统完全可以控制在1MB以下。
5.4.3根文件系统镜像构建
通常情况下根文件系统镜像是系统构建的最后一步。利用交叉编译工具将应用程序、内核分别配置和编译之后,把获得的C链接库、内核模块以及应用程序按照FHS规则放到相应位置,利用文件系统自带的工具mkyaffs image来最终生成一个根文件系统镜像file system.yaffs.