Board logo

标题: 现场总线的开关量I/O模块设计:操作系统移植与驱动开发(2) [打印本页]

作者: forsuccess    时间: 2013-5-27 23:59     标题: 现场总线的开关量I/O模块设计:操作系统移植与驱动开发(2)

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//和 include/asm-/目录中,architecture是Linux支持的体系结构的简称。例如,ARM体系结构对应的简称是arm.与这种体系结 构相关的代码都存放在arch/arm/以及include/asm-arm /目录下。嵌入式系统是“硬件可剪裁”的,因此工程师设计的硬件电路会有所不同,从而这些代码可能无法正确运行(比如内核解压的地址不同)。因此,在剪裁 系统内核是必须结合硬件电路对内核代码进行修改移植。
本系统采用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.3.3嵌入式Linux的移植
在同一个硬件平台上可以嵌入不同的嵌入式操作系统,就好比PC既可以安装Windows又 可以安装Linux一样。同样,有些操作系统经过移植后可以运行在不同的硬件平台上。如果一个系统可以在不同硬件平台上运行,那么这个系统就是可移植的。 使某一个平台的代码运行在其他平台上的。过程叫做移植。
在Linux系统内核代码中有arch目录,其中包含了不同平台(包括i386、 ARM)的代码,arch目录中的代码是为多平台设计并使用的,与体系结构相关的代码都存放在arch//和 include/asm-/目录中,architecture是Linux支持的体系结构的简称。例如,ARM体系结构对应的简称是arm.与这种体系结 构相关的代码都存放在arch/arm/以及include/asm-arm /目录下。嵌入式系统是“硬件可剪裁”的,因此工程师设计的硬件电路会有所不同,从而这些代码可能无法正确运行(比如内核解压的地址不同)。因此,在剪裁 系统内核是必须结合硬件电路对内核代码进行修改移植。
本系统采用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所示。





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0