嵌入式.docx
《嵌入式.docx》由会员分享,可在线阅读,更多相关《嵌入式.docx(8页珍藏版)》请在冰豆网上搜索。
![嵌入式.docx](https://file1.bdocx.com/fileroot1/2023-5/15/f3d5a123-aa76-4794-bff6-1dcc8655af48/f3d5a123-aa76-4794-bff6-1dcc8655af481.gif)
嵌入式
课程简介
嵌入式系统是一种“完全嵌入受控器件内部,为特定应用而设计的专用计算机系统”,根据英国电气工程师协会的定义,嵌入式系统为控制、监视或辅助设备、机器或用于工厂运作的设备。
嵌入式系统是用来控制或者监视机器、装置、工厂等大规模设备的系统。
国内普遍认同的嵌入式系统定义为:
以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。
通常,嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板。
结构特点
嵌入式系统是面向用户、面向产品、面向应用的,它必须与具体应用相结合才会具有生命力、才更具有优势。
因此可以这样理解上述三个面向的含义,即嵌入式系统是与应用紧密结合的,它具有很强的专用性,必须结合实际系统需求进行合理的裁减利用。
一般而言,嵌入式系统的构架可以分成四个部分:
处理器、存储器、输入输出(I/O)和软件(由于多数嵌入式设备的应用软件和操作系统都是紧密结合的,在这里我们对其不加区分,这也是嵌入式系统和一般的PC操作系统的最大区别)。
可以看出嵌入式系统的几个重要特征:
1.系统内核小。
2.专用性强。
3.系统精简。
4.高实时性的系统软件(OS)是嵌入式软件的基本要求。
5.嵌入式软件开发要想走向标准化,就必须使用多任务的操作系统。
6.嵌入式系统开发需要开发工具和环境。
一个嵌入式系统装置一般都由嵌入式计算机系统和执行装置组成,嵌入式计算机系统是整个嵌入式系统的核心,由硬件层、中间层、系统软件层和应用软件层组成。
执行装置也称为被控对象,它可以接受嵌入式计算机系统发出的控制命令,执行所规定的操作或任务。
执行装置可以很简单,如手机上的一个微小型的电机,当手机处于震动接收状态时打开;也可以很复杂,如SONY智能机器狗,上面集成了多个微小型控制电机和多种传感器,从而可以执行各种复杂的动作和感受各种状态信息。
硬件层
硬件层中包含嵌入式微处理器、存储器(SDRAM、ROM、Flash等)、通用设备接口和I/O接口(A/D、D/A、I/O等)。
在一片嵌入式处理器基础上添加电源电路、时钟电路和存储器电路,就构成了一个嵌入式核心控制模块。
其中操作系统和应用程序都可以固化在ROM中。
中间层
硬件层与软件层之间为中间层,也称为硬件抽象层或板级支持包(BSP),它将系统上层软件与底层硬件分离开来,使系统的底层驱动程序与硬件无关,上层软件开发人员无需关心底层硬件的具体情况,根据BSP层提供的接口即可进行开发。
该层一般包含相关底层硬件的初始化、数据的输入/输出操作和硬件设备的配置功能。
BSP具有以下两个特点。
硬件相关性:
因为嵌入式实时系统的硬件环境具有应用相关性,而作为上层软件与硬件平台之间的接口,BSP需要为操作系统提供操作和控制具体硬件的方法。
操作系统相关性:
不同的操作系统具有各自的软件层次结构,因此,不同的操作系统具有特定的硬件接口形式。
实际上,BSP是一个介于操作系统和底层硬件之间的软件层次,包括了系统中大部分与硬件联系紧密的软件模块。
设计一个完整的BSP需要完成两部分工作:
嵌入式系统的硬件初始化以及BSP功能,设计硬件相关的设备驱动。
系统软件层
系统软件层由实时多任务操作系统(RTOS)、文件系统、图形用户接口、网络系统及通用组件模块组成。
RTOS是嵌入式应用软件的基础和开发平台。
嵌入式Linux系统启动过程
摘要:
引导加载程序(Bootloader)是嵌入式系统CPU上电后第一段运行的代码.在内核映像执行之前完成相关的底层硬件初始化,建立内存空间映射图等重要工作,为内核提供引导参数,启动内核.通过对Bootloader的体系结构和工作机理进行深入研究,并结合德国DENX开发的具有强大功能的U-BOOT启动程序,给出了U-BOOT在.基于AT91RM9200处理器的嵌入式系统板上的启动过程.
关键词:
引导加载程序初始化启动过程引导程序
一个嵌入式Linux系统从软件角度看可以分为四个部分:
引导加载程序(Bootloader),Linux内核,文件系统,应用程序。
当系统首次引导时,或系统被重置时,处理器会执行一个位于Flash/ROM中的已知位置处的代码,Bootloader就是这第一段代码。
它主要用来初始化处理器及外设,然后调用Linux内核。
Linux内核在完成系统的初始化之后需要挂载某个文件系统作为根文件系统(RootFilesystem),然后加载必要的内核模块,启动应用程序。
这就是嵌入式Linux系统启动过程Linux引导的整个过程。
根文件系统是Linux系统的核心组成部分,它可以作为Linux系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用软件所需要的库。
应用程序可以说是嵌入式系统的“灵魂”,它所实现的功能通常就是设计该嵌入式系统所要达到的目标。
如果没有应用程序的支持,任何硬件上设计精良的嵌入式系统都没有实用意义。
从以上分析可以看出Bootloader在运行过程中虽然具有初始化系统和执行用户输入的命令等作用,但它最根本的功能就是为了启动Linux内核,让我们进一步分析Bootloader和Linux内核在嵌入式系统中的关系和作用。
1、Bootloader基本概述
嵌入式系统是以应用为中心、以计算机为基础、软硬件可裁剪,适用于系统对功能、可靠性、成本、功耗严格要求的专用计算机系统。
计算机系统都具有相应的引导程序,对于嵌入式系统在执行主程序之前要执行一些初始化的过程来完成对系统的初始化,并创造嵌入式程序运行的环境。
我们熟悉的PC中的引导程序一般BIOS和位于MBR的OSbootloader(例如LILO或者GRUB)一起组成。
Bootloader是嵌入式系统的引导加载程序,它是系统上电后运行的第一段程序,其作用类似于PC机上的BIOS。
Bootloader是依赖于硬件而实现的,特别是在嵌入式领域,为嵌入式系统建立一个通用的Bootloader是很困难的,但为了能达到启动Linux内核的目的,所有的Bootloader都必须具备以下功能:
1)初始化RAM
因为Linux内核一般都会在RAM中运行,所以在调用Linux内核之前Bootloader必须设置和初始化RAM,为调用Linux内核做好准备。
初始化RAM的任务包括设置CPU的控制寄存器参数,以便能正常使用RAM以及检测RAM大小等。
2)初始化串口端口
在Linux的启动过程中有着非常重要的作用,它是Linux内核和用户交互的方式之一。
Linux在启动过程中可以将信息通过串口输出,这样便可清楚的了解Linux的启动过程。
虽然它并不是Bootloader必须要完成的工作,但是通过串口输出信息是调试Bootloader和Linux内核的强有力的工具,所以一般的Bootloader都会在执行过程中初始化一个串口作为调试端口。
3)检测处理器类型
Bootloader在调用Linux内核前必须检测系统的处理器类型,并将其保存到某个常量中提供给Linux内核。
Linux内核在启动过程中会根据该处理器类型调用相应的初始化程序。
4)设置Linux启动参数
Bootloader在执行过程中必须设置和初始化Linux的内核启动参数。
5)调用Linux内核映像
Bootloader完成的最后一项工作便是调用Linux内核。
如果Linux内核存放在Flash中,并且可直接在上面运行(这里的Flash指NorFlash),那么可直接跳转到内核中去执行。
但由于在Flash中执行代码会有种种限制,而且速度也远不及RAM快,所以一般的嵌入式系统都是将Linux内核拷贝到RAM中,然后跳转到RAM中去执行。
2、Bootloader启动过程
嵌入式Linux系统通过Bootloader引导,一上电,就要执行Bootloader来初始化系统。
在完成对系统的初始化任务之后,它会将非易失性存储器(通常是Flash或DOC等)中的Linux内核拷贝到RAM中去,然后跳转到内核的第一条指令处继续执行,从而启动Linux内核。
Bootloader和Linux内核有着密不可分的联系。
Bootloader多数有两个阶段的启动过程:
Stage1:
基本的硬件初始化
为加载stage2准备RAM空间
拷贝内核映像和文件系统映像到RAM中
设置堆栈指针sp
跳到stage2的入口点
Stage2:
初始化本阶段要使用到的硬件设备
检测系统的内存映射
加载内核映像和文件系统映像
设置内核的启动参数
嵌入式系统中广泛采用的非易失性存储器通常是Flash,而Bootloader就位于该存储器的最前端,所以系统上电或复位后执行的第一段程序便是Bootloader。
Bootloader在flash中的存储示意图如下:
Bootloader启动流程图
3、Bootloader的启动方式
3.1网络启动方式
这种方式的开发板不需要较大的存储介质,跟无盘工作站有点类似,但是使用这种启动方式之前,需要把Bootloader安装到板上的EPROM或者Flash中。
Bootloader通过以太网接口远程下载Linux内核映像或者文件系统。
Bootloader下载文件一般都使用TFTP网络协议,还可以通过DHCP的方式动态配置IP地址。
3.2硬盘启动方式
传统的Linux系统运行在台式机或者服务器上,这些计算机一般都使用BIOS引导,并使用磁盘作为存储介质。
Linux传统上是LILO(LinuxLoader)引导,后来又出现了GUN的软件(GrandUnifiedBootloader)。
这两种Bootloader广泛应用在X86的Linux系统上。
3.3Flash启动方式
大多数嵌入式系统上都使用Flash存储介质。
Flash有很多类型,包括NORFlash、NANDFlash和其它半导体盘。
它们之间的不同在于:
NORFlash支持芯片内执行(XIP,eXecuteInPlace),这样代码可以在Flash上直接执行而不必拷贝到RAM中去执行。
而NANDFlash并不支持XIP,所以要想执行NANDFlash上的代码,必须先将其拷贝到RAM中去,然后跳到RAM中去执行。
NORFlash使用最为普遍。
Bootloader一般放在Flash的底端或者顶端,这需要根据处理器的复位向量来进行设置。
可以配置成MTD设备来访问Flash分区。
4、Bootloader种类
嵌入式Linux系统已经有各种各样的Bootloader,种类划分的方法也不是唯一的,一般可以按照它所支持处理器体系结构不同进行划分,如下表:
Bootloader
Mointor
描述
X86
ARM
PowerPC
LILO
否
Linux磁盘引导程序
是
否
否
Grub
否
GNU引导的LILO替代程序
是
否
否
Loadlin
否
从DOS引导Linux
是
否
否
ROLO
否
从ROM引导Linux而不需要BIOS
是
否
否
Etherboot
否
通过以太网启动Linux引导程序
是
否
否
LinuxBIOS
否
完全替代BUIS的Linux引导程序
是
否
否
Blob
否
LART等硬件平台的引导程序
否
是
否
U-Boot
是
通用引导程序
是
是
是
RedBoot
是
基于eCos的引导程序
是
是
是
常见嵌入式Linux的Bootloader有:
Blob、Redboot、U-Boot
Linux内核的启动过程
Linux内核有两种映像:
一种是非压缩内核,叫Image,另一种是它的压缩版本,叫zImage。
根据内核映像的不同,Linux内核的启动在开始阶段也有所不同。
ZImage是Image经过压缩形成的,所以它的大小比Image小。
但为了能使用zImage,必须在它的开头加上解压缩的代码,将ZImage解压缩之后才能执行,因此它的执行速度比Image要慢。
但考虑到嵌入式系统的存储空容量一般比较小,采用zImage可以占用较少的存储空间,因此牺牲一点性能上的代价也是值得的。
所以一般的嵌入式系统均采用压缩内核的方式。
在Bootloader将Linux内核映像拷贝到RAM以后,解压内核映像和初始化,完成剩余的与硬件平台相关的初始化工作,再进行一系列与内核相关的初始化后,调用第一个用户进程-init进程并等待用户进程的执行,这样整个Linux内核便启动完毕。
在很多情况下,我们可以调用一个简单的shell脚本来启动必需的嵌入式应用程序。
BootLoader是操作系统和硬件的枢纽,它为操作系统内核的启动提供了必要的条件和参数。
启动过程中BootLoader的初始化过程就是初始化CPU内部关键的寄存器、配置外围硬件电路相关寄存器、建立中断向量表等,然后跳转到一般由高级语言编写的主函数的应用程序代码去执行,这样就可以利用高级语言来编写完成系统设计所要求的各种功能。
参考文献
[1]陈文智.《嵌入式系统开发原理与实践》清华大学出版社,2005.
[2]严菊明.《基于ARM嵌入式系统的通用Bootloader的设计与实现》东南大学出版社,2005.
[3]王田苗、魏洪兴.《嵌入式系统设计与实例开发(第3版)》清华大学出版社,2008.