当前位置:首页 » 操作系统 » rtems源码

rtems源码

发布时间: 2023-03-05 20:30:37

1. “干货”嵌入式linux系统移植的四大步骤(上)


在学习系统移植的相关知识,在学习和调试过程中,发现了很多问题,也解决了很多问题,但总是对于我们的开发结果有一种莫名其妙的感觉,纠其原因,主要对于我们的开发环境没有一个深刻的认识,有时候几个简单的命令就可以完成非常复杂的功能,可是我们有没有想过,为什么会有这样的效果?


如果没有去追问,只是机械地完成,并且看到实验效果,这样做其实并没有真正的掌握系统移植的本质。


在做每一个步骤的时候, 首先问问自己,为什么要这样做,然后再问问自己正在做什么? 搞明白这几个问题,我觉得就差不多了,以后不管更换什么平台,什么芯片,什么开发环境,你都不会迷糊,很快就会上手。对于嵌入式的学习方法,我个人方法就是:从宏观上把握(解决为什么的问题),微观上研究(解决正在做什么的问题),下面以自己学习的arm-cortex_a8开发板为目标,介绍下自己的学习方法和经验。


嵌入式Linux系统移植主要由四大部分组成:


一、搭建交叉开发环境
二、bootloader的选择和移植
三、kernel的配置、编译、和移植
四、根文件系统的制作


第一部分:搭建交叉开发环境


先介绍第一分部的内容:搭建交叉开发环境,首先必须得思考两个问题,什么是交叉环境? 为什么需要搭建交叉环境?


先回答第一个问题,在嵌入式开发中,交叉开发是很重要的一个概念,开发的第一个环节就是搭建环境,第一步不能完成,后面的步骤从无谈起,这里所说的交叉开发环境主要指的是:在开发主机上(通常是我的pc机)开发出能够在目标机(通常是我们的开发板)上运行的程序。嵌入式比较特殊的是不能在目标机上开发程序(狭义上来说),因为对于一个原始的开发板,在没有任何程序的情况下它根本都跑不起来,为了让它能够跑起来,我们还必须要借助pc机进行烧录程序等相关工作,开发板才能跑起来,这里的pc机就是我们说的开发主机,想想如果没有开发主机,我们的目标机基本上就是无法开发,这也就是电子行业的一句名言:搞电子,说白了,就是玩电脑!


然后回答第二个问题,为什么需要交叉开发环境?主要原因有以下几点:


原因 1: 嵌入式系统的硬件资源有很多限制,比如cpu主频相对较低,内存容量较小等,想想让几百MHZ主频的MCU去编译一个Linux kernel会让我们等的不耐烦,相对来说,pc机的速度更快,硬件资源更加丰富,因此利用pc机进行开发会提高开发效率。


原因2: 嵌入式系统MCU体系结构和指令集不同,因此需要安装交叉编译工具进行编译,这样编译的目标程序才能够在相应的平台上比如:ARM、MIPS、 POWEPC上正常运行。


交叉开发环境的硬件组成主要由以下几大部分


1.开发主机
2.目标机(开发板)
3.二者的链接介质,常用的主要有3种方式:(1)串口线 (2)USB线 (3)网线


对应的硬件介质,还必须要有相应的软件“介质”支持:


1.对于串口,通常用的有串口调试助手,putty工具等,工具很多,功能都差不多,会用一两款就可以;


2.对于USB线,当然必须要有USB的驱动才可以,一般芯片公司会提供,比如对于三星的芯片,USB下载主要由DNW软件来完成;


3.对于网线,则必须要有网络协议支持才可以, 常用的服务主要两个


第一:tftp服务:

主要用于实现文件的下载,比如开发调试的过程中,主要用tftp把要测试的bootloader、kernel和文件系统直接下载到内存中运行,而不需要预先烧录到Flash芯片中,一方面,在测试的过程中,往往需要频繁的下载,如果每次把这些要测试的文件都烧录到Flash中然后再运行也可以,但是缺点是:过程比较麻烦,而且Flash的擦写次数是有限的;另外一方面:测试的目的就是把这些目标文件加载到内存中直接运行就可以了,而tftp就刚好能够实现这样的功能,因此,更没有必要把这些文件都烧录到Flash中去。


第二: nfs服务:

主要用于实现网络文件的挂载,实际上是实现网络文件的共享,在开发的过程中,通常在系统移植的最后一步会制作文件系统,那么这是可以把制作好的文件系统放置在我们开发主机PC的相应位置,开发板通过nfs服务进行挂载,从而测试我们制作的文件系统是否正确,在整个过程中并不需要把文件系统烧录到Flash中去,而且挂载是自动进行挂载的,bootload启动后,kernel运行起来后会根据我们设置的启动参数进行自动挂载,因此,对于开发测试来讲,这种方式非常的方便,能够提高开发效率。


另外,还有一个名字叫 samba 的服务也比较重要,主要用于文件的共享,这里说的共享和nfs的文件共享不是同一个概念,nfs的共享是实现网络文件的共享,而samba实现的是开发主机上 Windows主机和Linux虚拟机之间的文件共享,是一种跨平台的文件共享 ,方便的实现文件的传输。


以上这几种开发的工具在嵌入式开发中是必备的工具,对于嵌入式开发的效率提高做出了伟大的贡献,因此,要对这几个工具熟练使用,这样你的开发效率会提高很多。等测试完成以后,就会把相应的目标文件烧录到Flash中去,也就是等发布产品的时候才做的事情,因此对于开发人员来说,所有的工作永远是测试。


通过前面的工作,我们已经准备好了交叉开发环境的硬件部分和一部分软件,最后还缺少交叉编译器,读者可能会有疑问,为什么要用交叉编译器?前面已经讲过,交叉开发环境必然会用到交叉编译工具,通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,开发主机PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行,虽然两个平台用的都是Linux系统。相对于交叉编译,平常做的编译叫本地编译,也就是在当前平台编译,编译得到的程序也是在本地执行。用来编译这种跨平台程序的编译器就叫交叉编译器,相对来说,用来做本地编译的工具就叫本地编译器。所以要生成在目标机上运行的程序,必须要用交叉编译工具链来完成。

这里又有一个问题,不就是一个交叉编译工具吗?为什么又叫交叉工具链呢?原因很简单,程序不能光编译一下就可以运行,还得进行汇编和链接等过程,同时还需要进行调试,对于一个很大工程,还需要进行工程管理等等,所以,这里 说的交叉编译工具是一个由 编译器、连接器和解释器 组成的综合开发环境,交叉编译工具链主要由binutils(主要包括汇编程序as和链接程序ld)、gcc(为GNU系统提供C编译器)和glibc(一些基本的C函数和其他函数的定义) 3个部分组成。有时为了减小libc库的大小,也可以用别的 c 库来代替 glibc,例如 uClibc、dietlibc 和 newlib。

那么,如何得到一个交叉工具链呢?是从网上下载一个“程序”然后安装就可以使用了吗?回答这个问题之前先思考这样一个问题,我们的交叉工具链顾名思义就是在PC机上编译出能够在我们目标开发平台比如ARM上运行的程序,这里就又有一个问题了,我们的ARM处理器型号非常多,难道有专门针对我们某一款的交叉工具链吗?若果有的话,可以想一想,这么多处理器平台,每个平台专门定制一个交叉工具链放在网络上,然后供大家去下载,想想可能需要找很久才能找到适合你的编译器,显然这种做法不太合理,且浪费资源!因此,要得到一个交叉工具链,就像我们移植一个Linux内核一样,我们只关心我们需要的东西,编译我们需要的东西在我们的平台上运行,不需要的东西我们不选择不编译,所以,交叉工具链的制作方法和系统移植有着很多相似的地方,也就是说,交叉开发工具是一个支持很多平台的工具集的集合(类似于Linux源码),然后我们只需从这些工具集中找出跟我们平台相关的工具就行了,那么如何才能找到跟我们的平台相关的工具,这就是涉及到一个如何制作交叉工具链的问题了。


通常构建交叉工具链有如下三种方法:


方法一 : 分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。该方法相对比较困难,适合想深入学习构建交叉工具链的读者。如果只是想使用交叉工具链,建议使用下列的方法二构建交叉工具链。


方法二: 通过Crosstool-ng脚本工具来实现一次编译,生成交叉编译工具链,该方法相对于方法一要简单许多,并且出错的机会也非常少,建议大多数情况下使用该方法构建交叉编译工具链。


方法三 : 直接通过网上下载已经制作好的交叉编译工具链。该方法的优点不用多说,当然是简单省事,但与此同时该方法有一定的弊端就是局限性太大,因为毕竟是别人构建好的,也就是固定的,没有灵活性,所以构建所用的库以及编译器的版本也许并不适合你要编译的程序,同时也许会在使用时出现许多莫名其妙的错误,建议读者慎用此方法。

crosstool-ng是一个脚本工具,可以制作出适合不同平台的交叉编译工具链,在进行制作之前要安装一下软件:
$ sudo apt-get install g++ libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk
crosstool脚本工具可以在http://ymorin.is-a-geek.org/projects/crosstool下载到本地,然后解压,接下来就是进行安装配置了,这个配置优点类似内核的配置。主要的过程有以下几点:
1. 设定源码包路径和交叉编译器的安装路径
2. 修改交叉编译器针对的构架

3. 增加编译时的并行进程数,以增加运行效率,加快编译,因为这个编译会比较慢。
4. 关闭JAVA编译器 ,减少编译时间
5. 编译
6. 添加环境变量
7. 刷新环境变量。
8. 测试交叉工具链

到此,嵌入式Linux系统移植四大部分的第一部分工作全部完成,接下来可以进行后续的开发了。



第二部分:bootloader的选择和移植


01 Boot Loader 概念


就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境,他就是所谓的引导加载程序(Boot Loader)。


02 为什么系统移植之前要先移植BootLoader?


BootLoader的任务是引导操作系统,所谓引导操作系统,就是启动内核,让内核运行就是把内核加载到内存RAM中去运行,那先问两个问题:第一个问题,是谁把内核搬到内存中去运行?第二个问题:我们说的内存是SDRAM,大家都知道,这种内存和SRAM不同,最大的不同就是SRAM只要系统上电就可以运行,而SDRAM需要软件进行初始化才能运行,那么在把内核搬运到内存运行之前必须要先初始化内存吧,那么内存是由谁来初始化的呢?其实这两件事情都是由bootloader来干的,目的是为内核的运行准备好软硬件环境,没有bootloadr我们的系统当然不能跑起来。

03 bootloader的分类


首先更正一个错误的说法,很多人说bootloader就是U-boot,这种说法是错误的,确切来说是u-boot是bootloader的一种。也就是说bootloader具有很多种类,


由上图可以看出,不同的bootloader具有不同的使用范围,其中最令人瞩目的就是有一个叫U-Boot的bootloader,是一个通用的引导程序,而且同时支持X86、ARM和PowerPC等多种处理器架构。U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目,是由德国DENX小组开发的用于多种嵌入式CPU的bootloader程序,对于Linux的开发,德国的u-boot做出了巨大的贡献,而且是开源的。

u-boot具有以下特点:

① 开放源码;
② 支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;
③ 支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale;
④ 较高的可靠性和稳定性;
⑤ 高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;
⑥ 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;
⑦ 较为丰富的开发调试文档与强大的网络技术支持;
其实,把u-boot可以理解为是一个小型的操作系统。

04 u-boot的目录结构


* board 目标板相关文件,主要包含SDRAM、FLASH驱动;
* common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测;
* cpu 与处理器相关的文件。如mpc8xx子目录下含串口、网口、LCD驱动及中断初始化等文件;
* driver 通用设备驱动,如CFI FLASH驱动(目前对INTEL FLASH支持较好)
* doc U-Boot的说明文档;
* examples可在U-Boot下运行的示例程序;如hello_world.c,timer.c;
* include U-Boot头文件;尤其configs子目录下与目标板相关的配置头文件是移植过程中经常要修改的文件;
* lib_xxx 处理器体系相关的文件,如lib_ppc, lib_arm目录分别包含与PowerPC、ARM体系结构相关的文件;
* net 与网络功能相关的文件目录,如bootp,nfs,tftp;
* post 上电自检文件目录。尚有待于进一步完善;
* rtc RTC驱动程序;
* tools 用于创建U-Boot S-RECORD和BIN镜像文件的工具;

05 u-boot的工作模式


U-Boot的工作模式有 启动加载模式和下载模式 。启动加载模式是Bootloader的正常工作模式,嵌入式产品发布时,Bootloader必须工作在这种模式下,Bootloader将嵌入式操作系统从FLASH中加载到SDRAM中运行,整个过程是自动的。 下载模式 就是Bootloader通过某些通信手段将内核映像或根文件系统映像等从PC机中下载到目标板的SDRAM中运行,用户可以利用Bootloader提供的一些令接口来完成自己想要的操作,这种模式主要用于测试和开发。

06 u-boot的启动过程


大多数BootLoader都分为stage1和stage2两大部分,U-boot也不例外。依赖于cpu体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现,而stage2则通常用c语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。


1、 stage1(start.s代码结构)
U-boot的stage1代码通常放在start.s文件中,它用汇编语言写成,其主要代码部分如下:
(1) 定义入口。由于一个可执行的image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在rom(Flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。
(2)设置异常向量(exception vector)。
(3)设置CPU的速度、时钟频率及中断控制寄存器。
(4)初始化内存控制器 。
(5)将rom中的程序复制到ram中。
(6)初始化堆栈 。
(7)转到ram中执行,该工作可使用指令ldrpc来完成。


2、 stage2(C语言代码部分)

lib_arm/board.c中的start armboot是C语言开始的函数,也是整个启动代码中C语言的主函数,同时还是整个u-boot(armboot)的主函数,该函数主要完成如下操作:
(1)调用一系列的初始化函数。
(2)初始化flash设备。
(3)初始化系统内存分配函数。
(4)如果目标系统拥有nand设备,则初始化nand设备。
(5)如果目标系统有显示设备,则初始化该类设备。
(6)初始化相关网络设备,填写ip,c地址等。
(7)进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。

07 基于cortex-a8的s5pc100bootloader启动过程分析


s5pc100支持两种启动方式,分别为USB启动方式和NandFlash启动方式:


1. S5PC100 USB启动过程

[1] A8 reset, 执行iROM中的程序
[2] iROM中的程序根据S5PC100的配置管脚(SW1开关4,拨到4对面),判断从哪里启动(USB)
[3] iROM中的程序会初始化USB,然后等待PC机下载程序
[4] 利用DNW程序,从PC机下载SDRAM的初始化程序到iRAM中运行,初始化SDRAM
[5] SDRAM初始化完毕,iROM中的程序继续接管A8, 然后等待PC下载程序(BootLoader)
[6] PC利用DNW下载BootLoader到SDRAM
[7] 在SDRAM中运行BootLoader

2. S5PC100 Nandflash启动过程

[1] A8 reset, 执行IROM中的程序
[2] iROM中的程序根据S5PC100的配置管脚(SW1开关4,拨到靠4那边),判断从哪里启动(Nandflash)
[3] iROM中的程序驱动Nandflash
[4] iROM中的程序会拷贝Nandflash前16k到iRAM
[5] 前16k的程序(BootLoader前半部分)初始化SDRAM,然后拷贝完整的BootLoader到SDRAM并运行
[6] BootLoader拷贝内核到SDRAM,并运行它
[7] 内核运行起来后,挂载rootfs,并且运行系统初始化脚本

08 u-boot移植(基于cortex_a8的s5pc100为例)


1.建立自己的平台

(1).下载源码包2010.03版本,比较稳定
(2).解压后添加我们自己的平台信息,以smdkc100为参考版,移植自己s5pc100的开发板
(3).修改相应目录的文件名,和相应目录的Makefile,指定交叉工具链。
(4).编译
(5).针对我们的平台进行相应的移植,主要包括修改SDRAM的运行地址,从0x20000000
(6).“开关”相应的宏定义
(7).添加Nand和网卡的驱动代码
(8).优化go命令
(9).重新编译 make distclean(彻底删除中间文件和配置文件) make s5pc100_config(配置我们的开发板) make(编译出我们的u-boot.bin镜像文件)
(10).设置环境变量,即启动参数,把编译好的u-boot下载到内存中运行,过程如下:
1. 配置开发板网络
ip地址配置:
$setenv ipaddr 192.168.0.6 配置ip地址到内存的环境变量
$saveenv 保存环境变量的值到nandflash的参数区

网络测试:
在开发开发板上ping虚拟机:
$ ping 192.168.0.157(虚拟机的ip地址)

如果网络测试失败,从下面几个方面检查网络:
1. 网线连接好
2. 开发板和虚拟机的ip地址是否配置在同一个网段
3. 虚拟机网络一定要采用桥接(VM--Setting-->option)
4. 连接开发板时,虚拟机需要设置成 静态ip地址

2. 在开发板上,配置tftp服务器(虚拟机)的ip地址
$setenv serverip 192.168.0.157(虚拟机的ip地址)
$saveenv
3. 拷贝u-boot.bin到/tftpboot(虚拟机上的目录)
4. 通过tftp下载u-boot.bin到开发板内存
$ tftp 20008000(内存地址即可) u-boot.bin(要下载的文件名)

如果上面的命令无法正常下载:
1. serverip配置是否正确
2. tftp服务启动失败,重启tftp服务
#sudo service tftpd-hpa restart

5. 烧写u-boot.bin到nandflash的0地址
$nand erase 0(起始地址) 40000(大小) 擦出nandflash 0 - 256k的区域
$nand write 20008000((缓存u-boot.bin的内存地址) 0(nandflash上u-boot的位置) 40000(烧写大小)

6. 切换开发板的启动方式到nandflash
1. 关闭开发板
2. 把SW1的开关4拨到4的那边
3. 启动开发板,它就从nandflash启动

2. 嵌入式操作系统有哪些

常见的嵌入式操作系统有WINDOWS CE、iOS、Linux、Android、FreeRTOS。

1、WINDOWS CE,WINDOWS CE是微软开发的一个开放的、可升级的32位嵌入式操作系统,是基于掌上型电脑类的电子设备操作系统。Windows CE具有模块化、结构化和基干Win32应用程序接日以及与处理器无关等特点。

2、iOS,苹果的iOS系统可以说是苹果公司赖以生存的核心技术,在iPhone、iPad、iTouch、iPod等设备上运行的iOS具备了嵌入式的全部特性。

3、Linux,Linux是一个类似于Unix的操作系统。Linux从1991年问世到现在,短短10年的时间内已发展成为一个功能强大、设计完善的操作系统,Linux系统不仅能够运行于PC平台,还在嵌入式系统方面大放光芒,在各种嵌人式Linux OS迅速发展的状况下,Linux OS逐渐形成了可与Windows CE等EOS进行抗衡的局面。

4、Android,Android是一个包括操作系统,中间件以及一些重要应用程序的专门针对移动设备的层次结构的软件集。Android操作系统内置了一部分应用程序,包括电子邮件客户端、SMS程序、日历、地图、浏览器、通讯录以及其他的程序。

5、FreeRTOS,FreeRTOS是一个迷你操作系统内核的小型嵌入式系统。功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。

3. linux mkimages 文件在哪

下载:
两种途径得到mkImage工具uImage,
解决方法:
方法一:

安装mkimage工具,载ubuntu11.10下执行以下命令进行安装:
#sudo apt-get install uboot-mkimage
方法二:
编译uboot源码,编译成功后载uboot/tools目录下会生成mkimgage工具,将mkimage工具拷贝到/usr/bin/目录下即可。

使用:

uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件。
mkimage在制作映象文件的时候,是在原来的可执行映象文件的前面加上一个0x40字节的头,记录参数所指定的信息,这样uboot才能识别这个映象是针对哪个CPU体系结构的,哪个OS的,哪种类型,加载内存中的哪个位置, 入口点在内存的那个位置以及映象名是什么
root@Glym:/tftpboot# ./mkimage
Usage: ./mkimage -l image
-l ==> list image header information
./mkimage -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image
-A ==> set architecture to 'arch'
-O ==> set operating system to 'os'
-T ==> set image type to 'type'
-C ==> set compression type 'comp'
-a ==> set load address to 'addr' (hex)
-e ==> set entry point to 'ep' (hex)
-n ==> set image name to 'name'
-d ==> use image data from 'datafile'
-x ==> set XIP (execute in place)
参数说明:
-A 指定CPU的体系结构:
取值 表示的体系结构
alpha Alpha
arm A RM
x86 Intel x86
ia64 IA64
mips MIPS
mips64 MIPS 64 Bit
ppc PowerPC
s390 IBM S390
sh SuperH
sparc SPARC
sparc64 SPARC 64 Bit
m68k MC68000
-O 指定操作系统类型,可以取以下值:
openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos
-T 指定映象类型,可以取以下值:
standalone、kernel、ramdisk、multi、firmware、script、filesystem
-C 指定映象压缩方式,可以取以下值:
none 不压缩
gzip 用gzip的压缩方式
bzip2 用bzip2的压缩方式
-a 指定映象在内存中的加载地址,映象下载到内存中时,要按照用mkimage制作映象时,这个参数所指定的地址值来下载
-e 指定映象运行的入口点地址,这个地址就是-a参数指定的值加上0x40(因为前面有个mkimage添加的0x40个字节的头)
-n 指定映象名
-d 指定制作映象的源文件

U-BOOT下使用bootm引导内核方法

一、在开始之前先说明一下bootm相关的东西。
1、 首先说明一下,S3C2410架构下的bootm只对sdram中的内核镜像文件进行操作(好像AT91架构提供了一段从flash复制内核镜像的代码, 不过针对s3c2410架构就没有这段代码,虽然可以在u-boot下添加这段代码,不过好像这个用处不大),所以请确保你的内核镜像下载到sdram 中,或者在bootcmd下把flash中的内核镜像复制到sdram中。
2、-a参数后是内核的运行地址,-e参数后是入口地址。

3、
1)如果我们没用mkimage对内核进行处理的话,那直接把内核下载到0x30008000再运行就行,内核会自解压运行(不过内核运行需要一个tag来传递参数,而这个tag建议是由bootloader提供的,在u-boot下默认是由bootm命令建立的)。

2)如果使用mkimage生成内核镜像文件的话,会在内核的前头加上了64byte的信息,供建立tag之用。bootm命令会首先判断bootm xxxx 这个指定的地址xxxx是否与-a指定的加载地址相同。
(1)如果不同的话会从这个地址开始提取出这个64byte的头部,对其进行分析,然后把去掉头部的内核复制到-a指定的load地址中去运行之
(2)如果相同的话那就让其原封不同的放在那,但-e指定的入口地址会推后64byte,以跳过这64byte的头部。

二、好,接着介绍使用mkimage生成镜像文件并下载运行的方法。

方法一、
1、首先,用u-boot/tools/mkimage这个工具为你的内核加上u-boot引导所需要的文件头,具体做法如下:
[root@localhost tftpboot]#mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage zImage.img
Image Name: linux-2.6.14
Created: Fri Jan 12 17:14:50 2007
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1262504 Bytes = 1232.91 kB = 1.20 MB
Load Address: 0x30008000
Entry Point: 0x30008000
这里解释一下参数的意义:
-A ==> set architecture to 'arch'
-O ==> set operating system to 'os'
-T ==> set image type to 'type'
-C ==> set compression type 'comp'
-a ==> set load address to 'addr' (hex)
-e ==> set entry point to 'ep' (hex)
-n ==> set image name to 'name'
-d ==> use image data from 'datafile'
-x ==> set XIP (execute in place)
2 、下载内核
U-Boot 1.1.3 (Jan 12 2007 - 16:16:36)
U-Boot code: 33F80000 -> 33F9BAC0 BSS: -> 33F9FBAC
RAM Configuration:
Bank #0: 30000000 64 MB
Nor Flash: 512 kB
Nand Flash: 64 MB
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
sbc2410=>tftp 0x31000000 zImage.img
TFTP from server 192.168.1.115; our IP address is 192.168.1.128
Filename 'zImage.img'.
Load address: 0x31000000
Loading: #################################################################
#################################################################
#################################################################
####################################################
done
Bytes transferred = 1263324 (1346dc hex)

3.运行
sbc2410=>bootm 0x31000000
## Booting image at 31000000 ...
Image Name: linun-2.6.14
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1263260 Bytes = 1.2 MB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
OK
Starting kernel ...
Uncompressing Linux.............................................................Linux version 2.6.14 (root@luofuchong) (gcc version 3.4.1) #21 Fri Oct 20 17:206CPU: ARM920Tid(wb) [41129200] revision 0 (ARMv4T)
Machine: SMDK2410
Memory policy: ECC disabled, Data cache writeback
CPU S3C2410A (id 0x32410002)
S3C2410: core 202.800 MHz, memory 101.400 MHz, peripheral 50.700 MHz
S3C2410 Clocks, (c) 2004 Simtec Electronics
CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
USB Control, (c) 2006 sbc2410
CPU0: D VIVT write-back cache
CPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets
CPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets
Built 1 zonelists
Kernel command line: console="ttySAC0" root="/dev/nfs" nfsroot="192".168.1.115:/frien"irq: clearing subpending status 00000002
PID hash table entries: 512 (order: 9, 8192 bytes)
timer tcon="00500000", tcnt a509, tcfg 00000200,00000000, usec 00001e4c
Console: colour mmy device 80x30
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 64MB = 64MB total
Memory: 62208KB available (1924K code, 529K data, 108K init)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
softlockup thread 0 started up.
NET: Registered protocol family 16
S3C2410: Initialising architecture
SCSI subsystem initialized
usbcore: registered new driver usbfs
usbcore: registered new driver hub
S3C2410 DMA Driver, (c) 2003-2004 Simtec Electronics
DMA channel 0 at c4800000, irq 33
DMA channel 1 at c4800040, irq 34
DMA channel 2 at c4800080, irq 35
DMA channel 3 at c48000c0, irq 36
NetWinder Floating Point Emulator V0.97 (double precision)
devfs: 2004-01-31 Richard Gooch ([email protected])
devfs: devfs_debug: 0x0
devfs: boot_options: 0x1
yaffs Oct 18 2006 12:39:51 Installing.
Console: switching to colour frame buffer device 30x40
fb0: s3c2410fb frame buffer device
fb1: Virtual frame buffer device, using 1024K of video memory
led driver initialized
s3c2410 buttons successfully loaded
s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2410
s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2410
s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2410
io scheler noop registered
io scheler anticipatory registered
io scheler deadline registered
io scheler cfq registered
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
usbcore: registered new driver ub
Cirrus Logic CS8900A driver for Linux (Modified for SMDK2410)
eth0: CS8900A rev E at 0xe0000300 irq="53", no eeprom , addr: 08: 0:3E:26:0A:5B
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c2410-nand: mapped registers at c4980000
s3c2410-nand: timing: Tacls 10ns, Twrph0 30ns, Twrph1 10ns
NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bi)Scanning device for bad blocks
Bad eraseblock 1884 at 0x01d70000
Creating 4 MTD partitions on "NAND 64MiB 3,3V 8-bit":
0x00000000-0x00020000 : "vivi"
0x00020000-0x00030000 : "param"
0x00030000-0x00200000 : "kernel"
0x00200000-0x04000000 : "root"
usbmon: debugfs is not available
s3c2410-ohci s3c2410-ohci: S3C24XX OHCI
s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1
s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
Initializing USB Mass Storage driver...
usbcore: registered new driver usb-storage
USB Mass Storage support registered.
usbcore: registered new driver usbmouse
drivers/usb/input/usbmouse.c: v1.6:USB HID Boot Protocol mouse driver
mice: PS/2 mouse device common for all mice
s3c2410 TouchScreen successfully loaded
UDA1341 audio driver initialized
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 4096 (order: 2, 16384 bytes)
TCP bind hash table entries: 4096 (order: 2, 16384 bytes)
TCP: Hash tables configured (established 4096 bind 4096)
TCP reno registered
TCP bic registered
NET: Registered protocol family 1
IP-Config: Complete:
device=eth0, addr="192".168.1.128, mask="255".255.255.0, gw="192".168.1.1,
host="luofuchong", domain=, nis-domain=(none),
bootserver="192".168.1.1, rootserver="192".168.1.115, rootpath=
Looking up port of RPC 100003/2 on 192.168.1.115
Looking up port of RPC 100005/1 on 192.168.1.115
VFS: Mounted root (nfs filesystem).
Mounted devfs on /dev
Freeing init memory: 108K
init started: BusyBox v1.1.3 (2006.09.20-14:52+0000) multi-call binary
Starting pid 696, console /dev/tts/0: '/etc/init.d/rcS'
Please press Enter to activate this console.

方法二、
1、首先,用u-boot/tools/mkimage这个工具为你的内核加上u-boot引导所需要的文件头,具体做法如下:
[root@localhost tftpboot]#mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage zImage.img
Image Name: linux-2.6.14
Created: Fri Jan 12 17:14:50 2007
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1262504 Bytes = 1232.91 kB = 1.20 MB
Load Address: 0x30008000
Entry Point: 0x30008040

2 、下载内核
U-Boot 1.1.3 (Jan 12 2007 - 16:16:36)
U-Boot code: 33F80000 -> 33F9BAC0 BSS: -> 33F9FBAC
RAM Configuration:
Bank #0: 30000000 64 MB
Nor Flash: 512 kB
Nand Flash: 64 MB
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
sbc2410=>tftp 0x30008000 zImage.img
TFTP from server 192.168.1.115; our IP address is 192.168.1.128
Filename 'zImage.img'.
Load address: 0x30008000
Loading: #################################################################
#################################################################
#################################################################
####################################################
done
Bytes transferred = 1263324 (1346dc hex)

3.运行
sbc2410=>bootm 0x30008000
## Booting image at 30008000 ...
Image Name: linux-2.6.14
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1261056 Bytes = 1.2 MB
Load Address: 30008000
Entry Point: 30008040
Verifying Checksum ... OK
XIP Kernel Image ... OK

4. 介绍几种主流嵌入式操作系统的特点,并分析比较 哥们,我现在纠结这个问题,可以给点指点吗

如果你是学习阶段的话,那LINUX和UCOS-II是比较合适的
uc/os和uclinux操作系统是两种性能优良源码公开且被广泛应用的的免费嵌入式操作系统,可以作为研究实时操作系统和非实时操作系统的典范。本文通过对 uc/os和uclinux的对比,分析和总结了嵌入式操作系统应用中的若干重要问题,归纳了嵌入式系统开发中操作系统的选型依据。
两种开源嵌入式操作系统介绍
uc/os和uclinux操作系统,是当前得到广泛应用的两种免费且公开源码的嵌入式操作系统。uc/os适合小型控制系统,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2k。uclinux则是继承标准linux 的优良特性,针对嵌入式处理器的特点设计的一种操作系统,具有内嵌网络协议、支持多种文件系统,开发者可利用标准linux先验知识等优势。其编译后目标文件可控制在几百k量级。
uc/os是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。其内核提供任务调度与管理、时间管理、任务间同步与通信、内存管理和中断服务等功能。
uclinux是一种优秀的嵌入式linux版本。uclinux是micro-conrol-linux的缩写。同标准linux相比,它集成了标准linux操作系统的稳定性、强大网络功能和出色的文件系统等主要优点。但是由于没有mmu(内存管理单元),其多任务的实现需要一定技巧。
两种嵌入式操作系统主要性能比较
嵌入式操作系统是嵌入式系统软硬件资源的控制中心,它以尽量合理的有效方法组织多个用户共享嵌入式系统的各种资源。其中用户指的是系统程序之上的所有软件。所谓合理有效的方法,指的就是操作系统如何协调并充分利用硬件资源来实现多任务。复杂的操作系统都支持文件系统,方便组织文件并易于对其规范化操作。
嵌入式操作系统还有一个特点就是针对不同的平台,系统不是直接可用的,一般需要经过针对专门平台的移植操作系统才能正常工作。进程调度、文件系统支持和系统移植是在嵌入式操作系统实际应用中最常见的问题,下文就从这几个角度入手对uc/os和uclinux进行分析比较。
进程调度
任务调度主要是协调任务对计算机系统内资源(如内存、i/o设备、cpu)的争夺使用。进程调度又称为cpu调度,其根本任务是按照某种原则为处于就绪状态的进程分配cpu。由于嵌入式系统中内存和i/o设备一般都和cpu同时归属于某进程,所以任务调度和进程调度概念相近,很多场合不加区分,下文中提到的任务其实就是进程的概念。
进程调度可分为"剥夺型调度"和"非剥夺型调度"两种基本方式。所谓"非剥夺型调度"是指:一旦某个进程被调度执行,则该进程一直执行下去直至该进程结束,或由于某种原因自行放弃cpu进入等待状态,才将cpu重新分配给其他进程。所谓"剥夺型调度"是指:一旦就绪状态中出现优先权更高的进程,或者运行的进程已用满了规定的时间片时,便立即剥夺当前进程的运行(将其放回就绪状态),把cpu分配给其他进程
作为实时操作系统,uc/os是采用的可剥夺型实时多任务内核。可剥夺型的实时内核在任何时候都运行就绪了的最高优先级的任务。uc/os中最多可以支持64 个任务,分别对应优先级0~63,
其中0为最高优先级。调度工作的内容可以分为两部分:最高优先级任务的寻找和任务切换。
其最高优先级任务的寻找是通过建立就绪任务表来实现的。uc/os中的每一个任务都有独立的堆栈空间,并有一个称为任务控制块tcb(task control block)数据结构,其中第一个成员变量就是保存的任务堆栈指针。任务调度模块首先用变量 ostcbhighrdy记录当前最高级就绪任务的tcb地址,然后调用os_task_sw() 函数来进行任务切换。
uclinux的进程调度沿用了linux的传统,系统每隔一定时间挂起进程,同时系统产生快速和周期性的时钟计时中断,并通过调度函数(定时器处理函数)决定进程什么时候拥有它的时间片。然后进行相关进程切换,这是通过父进程调用fork 函数生成子进程来实现的。
uclinux系统fork调用完成后,要么子进程代替父进程执行(此时父进程已经 sleep),直到子进程调用exit退出;要么调用exec执行一个新的进程,这个时候产生可执行文件的加载,即使这个进程只是父进程的拷贝,这个过程也不可避免。当子进程执行exit或exec后,子进程使用wakeup把父进程唤醒,使父进程继续往下执行。
uclinux由于没有mmu管理存储器,其对内存的访问是直接的,所有程序中访问的地址都是实际的物理地址。操作系统队内存空间没有保护,各个进程实际上共享一个运行空间。这就需要实现多进程时进行数据保护,也导致了用户程序使用的空间可能占用到系统内核空间,这些问题在编程时都需要多加注意,否则容易导致系统崩溃。
由上述分析可以得知,uc/os内核是针对实时系统的要求设计实现的,相对简单,可以满足较高的实时性要求。而uclinux则在结构上继承了标准linux的多任务实现方式,仅针对嵌入式处理器特点进行改良。其要实现实时性效果则需要使系统在实时内核的控制下运行,rt-linux就是可以实现这一个功能的一种实时内核。
文件系统
所谓文件系统是指负责存取和管理文件信息的机构,也可以说是负责文件的建立、撤销、组织、读写、修改、复制及对文件管理所需要的资源(如目录表、存储介质等)实施管理的软件部分。
uc/os是面向中小型嵌入式系统的,如果包含全部功能(信号量、消息邮箱、消息队列及相关函数),编译后的uc/os内核仅有6~10kb,所以系统本身并没有对文件系统的支持。但是uc/os具有良好的扩展性能,如果需要的话也可自行加入文件系统的内容。
uclinux则是继承了linux完善的文件系统性能。其采用的是romfs文件系统,这种文件系统相对于一般的ext2文件系统要求更少的空间。空间的节约来自于两个方面,首先内核支持romfs文件系统比支持ext2文件系统需要更少的代码,其次romfs文件系统相对简单,在建立文件系统超级块(superblock)需要更少的存储空间。romfs文件系统不支持动态擦写保存,对于系统需要动态保存的数据采用虚拟ram盘的方法进行处理(ram盘将采用ext2文件系统)。
uclinux还继承了linux网络操作系统的优势,可以很方便的支持网络文件系统且内嵌tcp/ip协议,这为uclinux开发网络接入设备提供了便利。
由两种操作系统对文件系统的支持可知,在复杂的需要较多文件处理的嵌入式系统中uclinux是一个不错的选择。而uc/os则主要适合一些控制系统。
操作系统的移植
嵌入式操作系统移植的目的是指使操作系统能在某个微处理器或微控制器上运行。uc/os和uclinux都是源码公开的操作系统,且其结构化设计便于把与处理器相关的部分分离出来,所以被移植到新的处理器上是可能的。
以下对两种系统的移植分别予以说明。
(1)uc/os的移植
要移植uc/os,目标处理器必须满足以下要求;
·处理器的c编译器能产生可重入代码,且用c语言就可以打开和关闭中断;
·处理器支持中断,并能产生定时中断;
·处理器支持足够的ram(几k字节),作为多任务环境下的任务堆栈;
·处理器有将堆栈指针和其他cpu寄存器读出和存储到堆栈或内存中的指令。
在理解了处理器和c编译器的技术细节后,uc/os的移植只需要修改与处理器相关的代码就可以了。
具体有如下内容:
·os_cpu.h中需要设置一个常量来标识堆栈增长方向;
·os_cpu.h中需要声明几个用于开关中断和任务切换的宏;
·os_cpu.h中需要针对具体处理器的字长重新定义一系列数据类型;
·os_cpu_a.asm需要改写4个汇编语言的函数;
·os_cpu_c.c需要用c语言编写6个简单函数;
·修改主头文件include.h,将上面的三个文件和其他自己的头文件加入。
(2)uclinux的移植
由于uclinux其实是linux针对嵌入式系统的一种改良,其结构比较复杂,相对 uc/os,uclinux的移植也复杂得多。一般而言要移植uclinux,目标处理器除了应满足上述uc/os应满足的条件外,还需要具有足够容量(几百k字节以上)外部rom和ram。
uclinux的移植大致可以分为3个层次:
·结构层次的移植,如果待移植处理器的结构不同于任何已经支持的处理器结构,则需要修改linux/arch目录下相关处理器结构的文件。虽然uclinux内核代码的大部分是独立于处理器和其体系结构的,但是其最低级的代码也是特定于各个系统的。这主要表现在它们的中断处理上下文、内存映射的维护、任务上下文和初始化过程都是独特的。这些例行程序位于linux/arch/目录下。由于linux所支持体系结构的种类繁多,所以对一个新型的体系,其低级例程可以模仿与其相似的体系例程编写。
·平台层次的移植,如果待移植处理器是某种uclinux已支持体系的分支处理器,则需要在相关体系结构目录下建立相应目录并编写相应代码。如mc68ez328就是基于无mmu的m68k内核的。此时的移植需要创建 linux/arch/m68knommu/platform/ mc68ez328目录并在其下编写跟踪程序(实现用户程序到内核函数的接口等功能)、中断控制调度程序和向量初始化程序等。
·板级移植,如果你所用处理器已被uclinux支持的话,就只需要板级移植了。板级移植需要在linux/arch/?platform/中建立一个相应板的目录,再在其中建立相应的启动代码crt0_rom.s或crt0_ram.s和链接描述文档rom.ld或ram.ld就可以了。板级移植还包括驱动程序的编写和环境变量设置等内容。
结语
通过对uc/os和uclinux的比较,可以看出这两种操作系统在应用方面各有优劣。 uc/os占用空间少,执行效率高,实时性能优良,且针对新处理器的移植相对简单。uclinux则占用空间相对较大,实时性能一般,针对新处理器的移植相对复杂。但是,uclinux具有对多种文件系统的支持能力、内嵌了tcp/ip协议,可以借鉴linux丰富的资源,对一些复杂的应用,uclinux具有相当优势。例如cisco 公司的 2500/3000/4000 路由器就是基于uclinux操作系统开发的。总之,操作系统的选择是由嵌入式系统的需求决定的。简单的说就是,小型控制系统可充分利用uc/os小巧且实时性强的优势,如果开发pda和互联网连接终端等较为复杂的系统则uclinux是不错的选择。

还有就是如果从开发的工具方便好用,易用的角度来看,那些收费的系统用起来更爽一些

5. 嵌入式操作系统是什么

引用的资料: 嵌入式操作系统EOS(Embedded OperatingSystem)是一种用途广泛的系统软件,过去它主要应用于工业控制和国防系统领域。EOS负责嵌入系统的全部软、硬件资源的分配、调度工作,控制协调并发活动;它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能。目前,已推出一些应用比较成功的EOS产品系列。随着Internet技术的发展、信息家电的普及应用及EOS的微型化和专业化,EOS开始从单一的弱功能向高专业化的强功能方向发展。嵌人式操作系统在系统实时高效性、硬件的相关依赖性、软件固态化以及应用的专用性等方面具有较为突出的特点。EOS是相对于一般操作系统而言的,它除具备了一般操作系统最基本的功能,如任务调度、同步机制、中断处理、文件功能等外,还有以下特点:
(1)可装卸性。开放性、可伸缩性的体系结构。
(2)强实时性。EOS实时性一般较强,可用于各种设备控制当中。
(3)统一的接口。提供各种设备驱动接入.
(4)操作方便、简单、提供友好的图形GUI,图形界面,追求易学易用.
(5)提供强大的网络功能,支持TCP/IP协议及其它协议,提供TCP/UDP/IP/PPP协议支持及统一的MAC访问层接口,为各种移动计算设备预留接口.
(6)强稳定性,弱交互性。嵌入式系统一旦开始运行就不需要用户过多的干预,这就要负责系统管理的EOS具有较强的稳定性。嵌入式操作系统的用户接口一般不提供操作命令,它通过系统调用命令向用户程序提供服务。
(7)固化代码。在嵌入系统中,嵌入式操作系统和应用软件被固化在嵌入式系统计算机的ROM中。辅助存储器在嵌入式系统中很少使用,因此,嵌入式操作系统的文件管理功能应该能够很容易地拆卸,而用各种内存文件系统.
(8)更好的硬件适应性,也就是良好的移植性.
国际上用于信息电器的嵌入式操作系统有40种左右。现在,市场上非常流行的EOS产品,包括3Corn公司下属子公司的Palm OS,全球占有份额达50%,Microsoft公司的Windows CE不过29%。在美国市场,Palm OS更以80%的占有率远超Windows CE。开放源代码的Linux很适于做信息家电的开发.
比如:中科红旗软件技术有限公司开发的红旗嵌入式Linux和美商网虎公司开发的基于Xlinux的嵌人式操作系统“夸克"。“夸克”是目前全世界最小的Linux,它有两个很突出的特点,就是体积小和使用GCS编码。
常见的嵌入式系统有:Linux、uClinux、WinCE、PalmOS、Symbian、eCos、uCOS-II、VxWorks、pSOS、Nucleus、ThreadX 、Rtems 、QNX、INTEGRITY、OSE、C Executive .
嵌入式操作系统的种类
一般情况下,嵌入式操作系统可以分为两类,一类是面向控制、通信等领域的实时操作系统,如WindRiver公司的VxWorks、ISI的pSOS、QNX系统软件公司的QNX、ATI的Nucleus等;另一类是面向消费电子产品的非实时操作系统,这类产品包括个人数字助理(PDA)、移动电话、机顶盒、电子书、WebPhone等。
a. 非实时操作系统
早期的嵌入式系统中没有操作系统的概念,程序员编写嵌入式程序通常直接面对裸机及裸设备。在这种情况下,通常把嵌入式程序分成两部分,即前台程序和后台程序。前台程序通过中段来处理事件,其结构一般为无限循环;后台程序则掌管整个嵌入式系统软、硬件资源的分配、管理以及任务的调度,是一个系统管理调度程序。这就是通常所说的前后台系统。一般情况下,后台程序也叫任务级程序,前台程序也叫事件处理级程序。在程序运行时,后台程序检查每个任务是否具备运行条件,通过一定的调度算法来完成相应的操作。对于实时性要求特别严格的操作通常由中断来完成,仅在中断服务程序中标记事件的发生,不再做任何工作就退出中断,经过后台程序的调度,转由前台程序完成事件的处理,这样就不会造成在中断服务程序中处理费时的事件而影响后续和其他中断。
实际上,前后台系统的实时性比预计的要差。这是因为前后台系统认为所有的任务具有相同的优先级别,即是平等的,而且任务的执行又是通过FIFO队列排队,因而对那些实时性要求高的任务不可能立刻得到处理。另外,由于前台程序是一个无限循环的结构,一旦在这个循环体中正在处理的任务崩溃,使得整个任务队列中的其他任务得不到机会被处理,从而造成整个系统的崩溃。由于这类系统结构简单,几乎不需要RAM/ROM的额外开销,因而在简单的嵌入式应用被广泛使用。
b. 实时操作系统
实时系统是指能在确定的时间内执行其功能并对外部的异步事件做出响应的计算机系统。其操作的正确性不仅依赖于逻辑设计的正确程度,而且与这些操作进行的时间有关。“在确定的时间内”是该定义的核心。也就是说,实时系统是对响应时间有严格要求的。
实时系统对逻辑和时序的要求非常严格,如果逻辑和时序出现偏差将会引起严重后果。实时系统有两种类型:软实时系统和硬实时系统。软实时系统仅要求事件响应是实时的,并不要求限定某一任务必须在多长时间内完成;而在硬实时系统中,不仅要求任务响应要实时,而且要求在规定的时间内完成事件的处理。通常,大多数实时系统是两者的结合。实时应用软件的设计一般比非实时应用软件的设计困难。实时系统的技术关键是如何保证系统的实时性。
实时多任务操作系统是指具有实时性、能支持实时控制系统工作的操作系统。其首要任务是调度一切可利用的资源完成实时控制任务,其次才着眼于提高计算机系统的使用效率,重要特点是要满足对时间的限制和要求。实时操作系统具有如下功能:任务管理(多任务和基于优先级的任务调度)、任务间同步和通信(信号量和邮箱等)、存储器优化管理(含ROM的管理)、实时时钟服务、中断管理服务。实时操作系统具有如下特点:规模小,中断被屏蔽的时间很短,中断处理时间短,任务切换很快。
实时操作系统可分为可抢占型和不可抢占型两类。对于基于优先级的系统而言,可抢占型实时操作系统是指内核可以抢占正在运行任务的CPU使用权并将使用权交给进入就绪态的优先级更高的任务,是内核抢了CPU让别的任务运行。不可抢占型实时操作系统使用某种算法并决定让某个任务运行后,就把CPU的控制权完全交给了该任务,直到它主动将CPU控制权还回来。中断由中断服务程序来处理,可以激活一个休眠态的任务,使之进入就绪态;而这个进入就绪态的任务还不能运行,一直要等到当前运行的任务主动交出CPU的控制权。使用这种实时操作系统的实时性比不使用实时操作系统的系统性能好,其实时性取决于最长任务的执行时间。不可抢占型实时操作系统的缺点也恰恰是这一点,如果最长任务的执行时间不能确定,系统的实时性就不能确定。
可抢占型实时操作系统的实时性好,优先级高的任务只要具备了运行的条件,或者说进入了就绪态,就可以立即运行。也就是说,除了优先级最高的任务,其他任务在运行过程中都可能随时被比它优先级高的任务中断,让后者运行。通过这种方式的任务调度保证了系统的实时性,但是,如果任务之间抢占CPU控制权处理不好,会产生系统崩溃、死机等严重后果。
嵌入式操作系统的发展
嵌入式操作系统伴随着嵌入式系统的发展经历了4个比较明显的阶段。
第一阶段是无操作系统的嵌入算法阶段,是以单芯片为核心的可编程控制器形式的系统,同时具有与监测、伺服、指示设备相配合的功能。这种系统大部分应用于一些专业性极强的工业控制系统中,一般没有操作系统的支持,通过汇编语言编程对系统进行直接控制,运行结束后清除内存。这一阶段系统的主要特点是:系统结构和功能都相对单一,处理效率较低,存储容量较小,几乎没有用户接口。由于这种嵌入式系统使用简便、价格很低,以前在国内工业领域应用较为普遍,但是已经远远不能适应高效的、需要大容量存储介质的现代化工业控制和新兴的信息家电等领域的需求。
第二阶段是以嵌入式CPU为基础、以简单操作系统为核心的嵌入式系统。这一阶段系统的主要特点是:CPU种类繁多,通用性比较差;系统开销小, 效率高;一般配备系统仿真器,操作系统具有一定的兼容性和扩展性;应用软件较专业,用户界面不够友好;系统主要用来控制系统负载以及监控应用程序运行。
第三阶段是通用的嵌入式实时操作系统阶段,是以嵌入式操作系统为核心的嵌入式系统。这一阶段系统的主要特点是:嵌入式操作系统能运行于各种不同类型的微处理器上,兼容性好;操作系统内核精小、效率高,并且具有高度的模块化和扩展性;具备文件和目录管理、设备支持、多任务、网络支持、图形窗口以及用户界面等功能;具有大量的应用程序接口(API),开发应用程序简单;嵌入式应用软件丰富。
第四阶段是以基于Internet为标志的嵌入式系统,这是一个正在迅速发展的阶段。目前大多数嵌入式系统还孤立于Internet之外,但随着Internet的发展以及Internet技术与信息家电、工业控制技术等结合日益密切,嵌入式设备与Internet的结合将代表着嵌入式技术的真正未来。
使用实时操作系统的必要性
嵌入式实时操作系统在目前的嵌入式应用中用得越来越广泛,尤其在功能复杂、系统庞大的应用中显得愈来愈重要。
首先,嵌入式实时操作系统提高了系统的可靠性。在控制系统中,出于安全方面的考虑,要求系统起码不能崩溃,而且还要有自愈能力。不仅要求在硬件设计方面提高系统的可靠性和抗干扰性,而且也应在软件设计方面提高系统的抗干扰性,尽可能地减少安全漏洞和不可靠的隐患。长期以来的前后台系统软件设计在遇到强干扰时,使得运行的程序产生异常、出错、跑飞,甚至死循环,造成了系统的崩溃。而实时操作系统管理的系统,这种干扰可能只是引起若干进程中的一个被破坏,可以通过系统运行的系统监控进程对其进行修复。通常情况下,这个系统监视进程用来监视各进程运行状况,遇到异常情况时采取一些利于系统稳定可靠的措施,如把有问题的任务清除掉。
其次,提高了开发效率,缩短了开发周期。在嵌入式实时操作系统环境下,开发一个复杂的应用程序,通常可以按照软件工程中的解耦原则将整个程序分解为多个任务模块。每个任务模块的调试、修改几乎不影响其他模块。商业软件一般都提供了良好的多任务调试环境。
再次,嵌入式实时操作系统充分发挥了32位CPU的多任务潜力。32位CPU比8、16位CPU快,另外它本来是为运行多用户、多任务操作系统而设计的,特别适于运行多任务实时系统。32位CPU采用利于提高系统可靠性和稳定性的设计,使其更容易做到不崩溃。例如, CPU运行状态分为系统态和用户态。将系统堆栈和用户堆栈分开,以及实时地给出CPU的运行状态等,允许用户在系统设计中从硬件和软件两方面对
实时内核的运行实施保护。如果还是采用以前的前后台方式,则无法发挥32位CPU的优势。
从某种意义上说,没有操作系统的计算机(裸机)是没有用的。在嵌入式应用中,只有把CPU嵌入到系统中,同时又把操作系统嵌入进去,才是真正的计算机嵌入式应用。
实时操作系统的优缺点
在嵌入式实时操作系统环境下开发实时应用程序使程序的设计和扩展变得容易,不需要大的改动就可以增加新的功能。通过将应用程序分割成若干独立的任务模块,使应用程序的设计过程大为简化;而且对实时性要求苛刻的事件都得到了快速、可靠的处理。通过有效的系统服务,嵌入式实时操作系统使得系统资源得到更好的利用。
但是,使用嵌入式实时操作系统还需要额外的ROM/RAM开销,2~5%的CPU额外负荷,以及内核的费用。

6. 嵌入式系统、软件开发环境、嵌入式处理器

呵呵,我做了嵌入式十年了,应该不算菜鸟吧。我来回答你的问题。

1:嵌入式系统有那些?
常用企业常用的有linux、wince、vxworks,还有一些手机的系统也算是嵌入式的系统android(google基于linux)、symbian、windows mobile,还有一些uC/OS、RTLinux、eCos、uclinux、QNX、LynxOS、EEOS。基本上常见我都列出来了。

2:嵌入式开发环境是什么?
linux uclinux ecos uc/os android RTlinux这些都可以用GCC来编译程序,具体是什么GCC和你的处理器有关系,比如arm,就用arm-linux-gcc,mips的处理可能就是用mips-linux-gcc,名字不固定,但是一般都是基于gcc来开发和移植的。还有wince主要是用platform builder来开发的。
在企业的应用中,当然开发环境其实不是固定的,关键是看芯片厂商根据不同的嵌入式系统提供的不同的开发环境。

3:嵌入式处理器有那些?
主流的处理器,如arm,目前ARM处理器主要有6大系列:ARM7、ARM9、ARM9E、ARM10、ARM11,SecurCore。还有与Intel合作实现的StrongARM和XScale处理器。
还有其他的处理器。比如MIPS处理器、PowerPC处理器,这些是市场上主流的。
当然,国产也有一些芯片,比如龙芯,但是这些其实不算什么分类,都是类MIPS的。

4:其实这些都是一些基本的介绍,如果你想深入了解这些东西,那需要一定的时间的。关于这些方面的知识,该怎么学习呢?我刚才看到一篇很不错的文章,是一个专科生介绍自己如何自学嵌入式,并找到嵌入式的工作,里面介绍了他的学习方法和学习过程,希望对你有帮助。

专科生学嵌入式到找到工作的前前后后--学习的榜样

先做个自我介绍,我07年考上一所很烂专科民办的学校,学的是生物专业,具体的学校名称我就不说出来献丑了。09年我就辍学了,我在那样的学校,一年学费要1万多,但是根本没有人学习,我实在看不到希望,我就退学了。

退学后我也迷茫,大专都没有毕业,我真的不知道我能干什么,我在纠结着我能做什么。所以辍学后我一段时间,我想去找工作,因为我比较沉默寡言,不是很会说话,我不适合去应聘做业务。我想应聘做技术的,可是处处碰壁。

一次偶然的机会,我才听到嵌入式这个行业。那天我去新华书店,在计算机分类那边想找本书学习。后来有个女孩子走过来,问我是不是读计算机的,有没有兴趣学习嵌入式,然后给我介绍了一下嵌入式现在的火热情况,告诉我学嵌入式多么的有前景,给我了一份传单,嵌入式培训的广告。听了她的介绍,我心里痒痒的,确实我很想去学会一门自己的技术,靠自己的双手吃饭。

回家后,我就上网查了下嵌入式,确实是当今比较热门的行业,也是比较好找工作的,工资也是相对比较高。我就下决心想学嵌入式了。于是我去找嵌入式培训的相关信息,说真的,我也很迷茫,我不知道培训是否真的能像他们宣传的那样好,所以我就想了解一段时间再做打算。

后来,我在网络知道看到一篇让我很鼓舞的文章《如何学习嵌入式》,是一个嵌入式高手介绍没有基础的朋友怎么自学入门学嵌入式,文章写的很好,包含了如何学习,该怎么学习。他提到一个方法就是看视频,因为看书实在太枯燥和费解的,很多我们也看不懂。这点我真的很认同,我自己看书往往看不了几页。

我在想,为什么别人都能自学成才,我也可以的!我要相信自己,所以我就想自学,如果实在学不会我再去培训。

主意一定,我就去搜索嵌入式的视频,虽然零星找到一些嵌入式的视频,但是都不系统,我是想找一个能够告诉我该怎么学的视频,一套从入门到精通的视频,一个比较完整的资料,最好能有老师教,不懂可以请教的。

后来我又找到一份很好的视频,是在嵌入式学习网推出的一份视频《从零基础开始学嵌入式》,网址:http://www.002r.com/embedvideo.htm
里面的教程还不错,很完整,可以让我从基础的开始学起。视频不便宜啊,但是我也忍了,毕竟买几本书都要几百了,何况他们还有半年的技术咨询和服务,算值了。

下面介绍下我的学习流程,希望对和我一样完全没有基础的朋友有所帮助。

收到他们寄过来的光盘后,我就开始学习了,由于我没有什么基础,我就从最简单的C语言视频教程学起,话说简单,其实我还是很多不懂的,我只好请教他们,他们还是很热心的,都帮我解决了。C语言我差不多学了一个礼拜,接下来我就学了linux的基本命令,我在他们提供linux虚拟机上都有做练习,敲linux的基本命令,写简单的C语言代码,差不多也就三个礼拜。我每天都在不停的写一些简单的代码,这样一月后我基本掌握了C和linux的基本操作。

接下来我就去学习了人家的视频的培训教程,是整套的,和去参加培训没有多大的区别,这一看就是两个月,学习了ARM的基本原理,学习嵌入式系统的概念,也掌握了嵌入式的环境的一些搭建,对linux也有更深层次的理解了,明白了嵌入式应用到底是怎么做的,但是驱动我只是有一点点的了解,这个相对难一点,我想以后再慢慢啃。

这两个月,除了吃饭睡觉,我几乎都在学习。因为我知道几乎没有基础,比别人差劲,我只能坚持努力着,我不能放弃,我必要要靠自己来养活自己,必须学好这门技术,同时我不懂的就问,这里真的很感谢他们的技术客服对我的任何问题都是耐心的解答,每天都我几乎都有好几个问题问他们,然后我就把不懂的问题总结记下来,这样慢慢积累了一段时间,我发现自己真的有点入门了。

最后的一个月,我就去看关于实践部分的内容,了解嵌入式项目具体的开发流程,需要什么样的知识,我就开始准备这方面的知识,也就是学习这方面的视频,同时他们建议我去找了找一些嵌入式面试的题目,为自己以后找工作做准备。我就到网上找了很多嵌入式的题目,把他们理解的记下来,这样差不多准备了20天左右

我觉得自己差不多入门了,会做一些简单的东西了。我就想去找工作看看,于是我就到51job疯狂的投简历,因为我学历的问题,专科没有毕业,说真的,大公司没有人会要我,所以我投的都是民营的小公司,我希望自己的努力有所回报。没有想过几天过后,就有面试了,但是第一次面试我失败了,虽然我自认为笔试很好,因为我之前做了准备,但是他们的要求比较严格,需要有一年的项目经验,所以我没有被选中。

后来陆续面试了几家公司,终于功夫不负有心人。我终于面试上的,是在闵行的一家民营的企业,公司规模比较小,我的职务是嵌入式linux应用开发,做安防产品的应用的。我想我也比较幸运,经理很看重我的努力,就决定录用我,开的工资是3500一个月,虽然我知道在上海3500只能过温饱的生活,但是我想我足够了。我至少不用每天都要靠父母养,我自己也能养活自己的。我想只要我继续努力,我工资一定会翻倍的。

把本文写出来,希望能让和我一样的没有基础的朋友有信心,其实我们没有必要自卑,我们不比别人笨,只要我们肯努力,我们一样会成功。

最后祝愿所有想学嵌入式的朋友更早的入门!

5:希望我的回答能帮到你,更希望你早日学好嵌入式。

7. 什么是嵌入式操作系统

嵌入式操作系统EOS(Embedded OperatingSystem)是一种用途广泛的系统软件,过去它主要应用于工业控制和国防系统领域。EOS负责嵌人系统的全部软、硬件资源的分配、调度工作,控制协调并发活动;它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能。目前,已推出一些应用比较成功的EOS产品系列。随着Internet技术的发展、信息家电的普及应用及EOS的微型化和专业化,EOS开始从单一的弱功能向高专业化的强功能方向发展。嵌人式操作系统在系统实时高效性、硬件的相关依赖性、软件固态化以及应用的专用性等方面具有较为突出的特点。EOS是相对于一般操作系统而言的,它除具备了一般操作系统最基本的功能,如任务调度、同步机制、中断处理、文件功能等外,还有以下特点:

(1)可装卸性。开放性、可伸缩性的体系结构。

(2)强实时性。EOS实时性一般较强,可用于各种设备控制当中。

(3)统一的接口。提供各种设备驱动接日.

(4)操作方便、简单、提供友好的图形GUI,图形界面,追求易学易用.

(5)提供强大的网络功能,支持TCP门P协议及其它协议,提供TCP/UDP/IP/PPP协议支持及统一的MAC访问层接口,为各种移动计算设备预留接口.

(6)强稳定性,弱交互性。嵌入式系统一旦开始运行就不需要用户过多的干预,这就要负责系统管理的EOS臭有较强的稳定性。嵌入式操作系统的用户接日一般不提供操作命令,它通过系统调用命令向用户程序提供服务。

(7)固化代码。在嵌入系统中,嵌入式操作系统和应用软件被固化在嵌入式系统计算机的ROM中。辅助存储器在嵌入式系统中很少使用,因此,嵌入式操作系统的文件管理功能应该能够很容易地拆卸,而用各种内存文件系统.

(8)更好的硬件适应性,也就是良好的移植性.

国际上用于信息电器的嵌入式操作系统有40种左右。现在,市场上非常流行的EOS产品,包括3Corn公司下属子公司的Palm OS,全球占有份额达50%,MicroS。fi公司的Wind。ws CE不过29%。在美国市场,Palm OS更以80%的占有率远超Windows CE。开放源代码的Linux很适于做信息家电的开发.

比如:中科红旗软件技术有限公司开发的红旗嵌入式Linux和美商网虎公司开发的基于Xlinux的嵌人式操作系统“夸克”。“夸克”是目前全世界最小的Linux,它有两个很突出的特点,就是体积小和使用GCS编码。

常见的嵌入式系统有:Linux、uClinux、WinCE、PalmOS、Symbian、eCos、uCOS-II、VxWorks、pSOS、Nucleus、ThreadX 、Rtems 、QNX、INTEGRITY、OSE、C Executive .

嵌入式操作系统的发展
1. 引言
嵌入式操作系统与嵌入式系统密不可分。嵌入式系统主要由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,它是集软硬件于一体的可独立工作的“器件”。
嵌入式技术的发展,大致经历了四个阶段[1]。
第一阶段是以单芯片为核心的可编程控制器形式的系统,同时具有与监测、伺服、指示设备相配合的功能。这种系统大部分应用于一些专业性极强的工业控制系统中,一般没有操作系统的支持,通过汇编语言编程对系统进行直接控制,运行结束后清除内存。
第二阶段是以嵌入式CPU为基础、以简单操作系统为核心的嵌入式系统。这一阶段的操作系统具有一定的兼容性和扩展性,但用户界面不够友好。
第三阶段是以嵌入式操作系统为标志的嵌入式系统。这一阶段系统的主要特点是:嵌入式操作系统能运行于各种不同类型的微处理器上,兼容性好;操作系统内核精小、效率高,并且具有高度的模块化和扩展性;具备文件和目录管理、设备支持、多任务、网络支持、图形窗口以及用户界面等功能;具有大量的应用程序接口(API),开发应用程序简单;嵌入式应用软件丰富。
第四阶段是以基于Internet 为标志的嵌入式系统,这是一个正在迅速发展的阶段。目前大多数嵌入式系统还孤立于Internet之外,但随着Internet的发展以及 Internet技术与信息家电、工业控制技术等结合日益密切,嵌入式设备与Internet的结合将代表着嵌入式技术的真正未来[2]。
嵌入式系统的发展对嵌入式操作系统提出了更高的要求。因此,对嵌入式操作系统的结构、设计、用户界面等诸多方面进行深入研究,将有助于嵌入式系统的应用和发展。
2. 嵌入式操作系统的特点
2.1 嵌入式系统的开发人员对操作系统的依赖性
早期的硬件设备很简单,软件的编程和调试工具也很原始,与硬件系统配套的软件都必须从头编写。程序大都采用宏汇编语言,调试是一件很麻烦的事。随着系统越来越复杂,操作系统就显得很必要。
(1)操作系统能有效管理越来越复杂的系统资源。
(2)操作系统能够把硬件虚拟化,使得开发人员从繁忙的驱动程序移植和维护中解脱出来。
(3)操作系统能够提供库函数、驱动程序、工具集以及应用程序。
在70年代的后期,出现了嵌入式系统的操作系统。在80年代末,市场上出现了几个着名的商业嵌入式操作系统,包括Vxwork、Neculeus、QNX和Windows CE等,这些系统提供性能良好的开发环境,提高了应用系统的开发效率。
2.2 嵌入式操作系统的特点
与其他类型的操作系统相比,嵌入式操作系统具有以下一些特点。
(1)体积小。嵌入式系统有别于一般的计算机处理系统,它不具备像硬盘那样大容量的存储介质,而大多使用闪存(Flash Memory)作为存储介质。这就要求嵌入式操作系统只能运行在有限的内存中,不能使用虚拟内存,中断的使用也受到限制。因此,嵌入式操作系统必须结构紧凑,体积微小。
(2)实时性。大多数嵌入式系统都是实时系统,而且多是强实时多任务系统,要求相应的嵌入式操作系统也必须是实时操作系统(RTOS)[8]。实时操作系统作为操作系统的一个重要分支已成为研究的一个热点,主要探讨实时多任务调度算法和可调度性、死锁解除等问题。
(3)特殊的开发调试环境。提供完整的集成开发环境是每一个嵌入式系统开发人员所期待的。一个完整的嵌入式系统的集成开发环境一般需要提供的工具是编译/连接器、内核调试/跟踪器和集成图形界面开发平台。其中的集成图形界面开发平台包括编辑器、调试器、软件仿真器和监视器等。
3. 嵌入式操作系统的发展状况
国外嵌入式操作系统已经从简单走向成熟,主要有Vxwork、 QNX、PalmOS、Windows CE等。国内的嵌入式操作系统研究开发有2种类型,一类是基于国外操作系统二次开发完成的,如海信的基于Windows CE的机顶盒系统;另一类是中国自主开发的嵌入式操作系统,如凯思集团公司自主研制开发的嵌入式操作系统Hopen OS(“女娲计划”)等。
Windows CE内核较小,能作为一种嵌入式操作系统应用到工业控制等领域。其优点在于便携性、提供对微处理器的选择以及非强行的电源管理功能。内置的标准通信能力使 Windows CE能够访问Internet并收发E_mail或浏览Web。除此之外,Windows CE特有的与Windows类似的用户界面使最终用户易于使用。Windows CE的缺点是速度慢、效率低、价格偏高、开发应用程序相对较难。
3Com公司的Palm OS在掌上电脑和PDA市场上独占其霸主地位,它有开放的操作系统应用程序接口(API),开发商可根据需要自行开发所需的应用程序。
QNX是由加拿大QSSL公司开发的分布式实时操作系统,它由微内核和一组共操作的进程组成,具有高度的伸缩性,可灵活地剪裁,最小配置只占用几十KB内存。因此,可以广泛地嵌入到智能机器、智能仪器仪表、机顶盒、通讯设备、PDA等应用中去[6][7]。
Hopen OS是凯思集团自主研制开发的嵌入式操作系统,由一个体积很小的内核及一些可以根据需要进行定制的系统模块组成。其核心Hopen Kernel一般为10KB左右大小,占用空间小,并具有实时、多任务、多线程的系统特征。
在众多的实时操作系统和嵌入式操作系统产品中,WindRiver公司的VxWorks是较为有特色的一种实时操作系统[5]。VxWorks 支持各种工业标准,包括POSIX、ANSI C 和TCP/IP网络协议。VxWorks 运行系统的核心是一个高效率的微内核,该微内核支持各种实时功能,包括快速多任务处理、中断支持、抢占式和轮转式调度。微内核设计减轻了系统负载并可快速响应外部事件。在美国宇航局的“极地登陆者”号、“深空二号”和火星气候轨道器等登陆火星探测器上,就采用了VxWorks,负责火星探测器全部飞行控制,包括飞行纠正、载体自旋和降落时的高度控制等,而且还负责数据收集和与地球的通信工作。目前在全世界装有VxWorks 系统的智能设备数以百万计,其应用范围遍及互联网、电信和数据通信、数字影像、网络、医学、计算机外设、汽车、火控、导航与制导、航空、指挥、控制、通信和情报、声纳与雷达、空间与导弹系统、模拟和测试等众多领域。
4. Linux
4.1 嵌入式Linux的应用开发前景
Linux是个与生俱来的网络操作系统,成熟而且稳定。Linux是源代码开放软件,不存在黑箱技术,任何人都可以修改它,或者用它开发自己的产品。Linux系统是可以定制的,系统内核目前已经可以做得很小。一个带有中文系统及图形化界面的核心程序也可以做到不足1MB,而且同样稳定。Linux作为一种可裁减的软件平台系统,是发展未来嵌入设备产品的绝佳资源,遍布全球的众多Linux爱好者又能给予Linux开发者强大的技术支持。因此,Linux作为嵌入式系统新的选择,是非常有发展前途的。
(1)与硬件芯片的紧密结合
后PC时代的智能设备已经逐渐地模糊了硬件与软件的界限,SOC系统(System On Chip)的发展就是这种软硬件无缝结合趋势的证明。随着处理器片内微码的发展,在将来可能出现在处理器片内嵌进操作系统的代码模块。
嵌入式Linux的一大特点是:与硬件芯片(如SOC等)的紧密结合。它不是一个纯软件的Linux系统,而比一般操作系统更加接近于硬件。嵌入式Linux的进一步发展,逐步地具备了嵌入式RTOS的一切特征:实时性及与嵌入式处理器的紧密结合。
(2)开放的源代码
嵌入式Linux的另一大特点是:代码的开放性。代码的开放性是与后PC时代的智能设备的多样性相适应的。代码的开放性主要体现在源代码可获得上,Linux代码开发就像是“集市式”开发,任意选择并按自己的意愿整合出新的产品。
对于嵌入式Linux,事实上是把BIOS层的功能实现在Linux的driver层。目前,在Linux领域,已经出现了专门为Linux操作系统定制的自由软件的BIOS代码,并在多款主板上实现此类的BIOS层功能。
(3)嵌入式Linux与硬件芯片的紧密结合
对于许多信息家电的应用来说,嵌入的性能指标是最难满足的,只有靠提高芯片的集成度与装配密度来解决。嵌入式Linux与标准Linux的一个重要区别是嵌入式Linux与硬件芯片的紧密结合。这是一个不可逾越的难点,也是嵌入式Linux技术的关键之处。嵌入式Linux和商用专用RTOS一样,需要编写BSP(Board Support Package),这相当于编写PC的BIOS。这不仅仅是嵌入式Linux的难点,也是使用商用专用RTOS开发的难点。硬件芯片(SOC芯片或者是嵌入式处理器)的多样性也决定了代码开放的嵌入式Linux的成功。嵌入式系统的发展,必然导致软硬件无缝结合的趋势,逐渐地模糊了硬件与软件的界限,在将来可能出现SOC片内的操作系统代码模块。
随着处理器片内微码的发展,在将来应出现在处理器片内嵌进操作系统的代码模块,很显然模块将具有安全性好、健壮性强、代码执行效率高等特点。着眼于未来的嵌入式系统的发展,我们基于对嵌入式Linux技术的深入研究,对嵌入式处理器及SOC系统的深刻理解和研究;对EDA技术的深入研究;对模拟数字混合集成电路芯片的深入研究;对SOC片内进行嵌入式Linux操作系统代码的植入研究。此类的研究有可能减轻系统开发者对BSP开发的难度要求,并使得嵌入式Linux能够成为普及的嵌入式操作系统,而大大提高嵌入式Linux的易用性,提高其开发出的高智能设备的安全性、稳定性,同时也大大提高智能设备的计算能力、处理能力。
4.2 部分嵌入式Linux产品[3][4]
嵌入式Linux 一般是按照嵌入式目标系统的要求而设计,由一个体积很小的内核及一些可以根据需要进行随意裁减的系统模块组成。一般来说整个系统所占用的空间不会超过几M 大小。目前,国外不少大学、研究机构和知名公司都加入了嵌入式Linux的开发工作,较成熟的嵌入式Linux产品不断涌现。
由美国新墨西哥理工学院开发的基于标准Linux 的嵌入式操作系统RTLinux,已成功地应用于航天飞机的空间数据采集、科学仪器测控、电影特技图像处理等领域。RTLinux开发者并没有针对实时操作系统的特性重写Linux的内核,这样做工作量会非常大,而且要保证兼容性也非常困难。为此,RTLinux提供了一个精巧的实时内核,并把标准的 Linux核心作为实时核心的一个进程同用户的实时进程一起调度,这样做的好处是对Linux的改动量最小,充分利用了Linux平台下现有的丰富的软件资源。
由嵌入式Linux行业主要厂商之一Lineo推出的Embedix,是根据嵌入式应用系统的特点重新设计的Linux发行版本。Embedix提供了超过25种的Linux系统服务,包括Web服务器等。系统需要最小8M内存,3M只读内存或闪存。Embedix基于Linux 2.2核心,并已经成功地移植到了Intel X86和PowerPC处理器系列上。
由美国网虎公司推出的XLinux,号称是世界上最小的嵌入式Linux系统,核心只有143K字节,而且还在不断减小。
致力于国产嵌入式Linux 操作系统和应用软件开发的广州博利思软件公司推出的嵌入式Linux中文操作系统POCKETIX,基于标准的Linux内核,并包括一些可以根据需要进行定制的系统模块。支持标准以太网和TCP/IP协议、支持标准的X Window,中文支持采用国际化标准,提供桌面和窗口管理功能、带WEB浏览器和文件管理器,并支持智能拼音和五笔字型输入。可适应个人PDA、WAP 手机、机顶盒等广泛的智能信息产品。
4.3 开发嵌入式Linux的几个问题
(1)Linux的移植。如果Linux不支持选用的平台,就需要把Linux内核中与硬件平台相关的部分改写,使之支持所选用的平台。
(2)内核的裁剪。嵌入式产品的可用资源比较少,所以它的内核相对嵌入式系统来说就显得有点大,需要进行剪裁到可利用的大小。
(3)桌面系统。现代的操作系统如果没有一个友好的界面是没有说服力的。现在的台式机Linux系统使用了传统的X Window系统的模式—Client/Server结构。和硬件有关的部分即是Server端,实现一个标准的显示接口;应用程序通过对Server的服务请求,实现程序的显示。在此之上,实现窗口的管理功能。但X Window对于嵌入式系统来说显得很庞大。现在国内有MiniGUI,国外有MicroWindow,都在致力于嵌入式Linux GUI的开发。适用于嵌入式Linux上的X Window的工作也在进行。
(4)驱动程序的开发。Linux内核更新的很快,许多最新的硬件驱动很快就被支持。但嵌入式系统应用领域是多种多样的,所选用的硬件设备也不同,并且不可能都有Linux的驱动程序,因此,设备驱动程序的开发也是重要的工作。
(5)应用软件的开发。
(6)中文的支持。
5. 结束语
目前,绝大部分嵌入式系统的硬件平台还掌握在外国公司的手中,国产的嵌入式操作系统在技术含量、兼容性、市场运作模式等方面也还有很多工作要做,我们应该在跟踪国外嵌入式操作系统的最新技术的同时,坚持自主产权,力争找到自己的突破点,探索出一条自己的发展道路。

热点内容
红米note扩展存储卡 发布:2025-08-20 21:27:10 浏览:862
验证你的电子邮件地址不能连接服务器 发布:2025-08-20 21:27:09 浏览:63
存储区是什么意思 发布:2025-08-20 21:26:31 浏览:53
压缩袋是什么 发布:2025-08-20 20:48:27 浏览:618
服务器减容会有什么影响 发布:2025-08-20 20:40:23 浏览:150
我的世界怎么联服务器 发布:2025-08-20 20:34:31 浏览:498
c语言编译或解释 发布:2025-08-20 20:27:17 浏览:601
vsm编程 发布:2025-08-20 20:16:31 浏览:913
脚本刷黑石塔 发布:2025-08-20 19:50:08 浏览:982
网上学编程可靠吗 发布:2025-08-20 19:45:13 浏览:650