首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
工业控制
» 现场总线的开关量I/O模块设计:操作系统移植与驱动开发(2)
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
现场总线的开关量I/O模块设计:操作系统移植与驱动开发(2)
发短消息
加为好友
forsuccess
当前离线
UID
871057
帖子
6281
精华
0
积分
3141
阅读权限
90
在线时间
282 小时
注册时间
2012-2-21
最后登录
2015-6-23
论坛元老
UID
871057
性别
男
1
#
打印
字体大小:
t
T
forsuccess
发表于 2013-5-27 23:59
|
只看该作者
现场总线的开关量I/O模块设计:操作系统移植与驱动开发(2)
嵌入式
,
应用程序
,
Linux
,
开发
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所示。
收藏
分享
评分
回复
引用
订阅
TOP
返回列表
分立器件
ARM
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议