欢迎来到天天文库
浏览记录
ID:44440016
大小:1.17 MB
页数:19页
时间:2019-10-22
《嵌入式系统的原理及应用_06》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、嵌入式系统的原理及应用3.3嵌入式Linux系统的开发编写BootLoader;裁减嵌入式Linux内核;裁减嵌入式Linux文件系统;烧写BootLoader到目标板;烧写嵌入式Linux内核和文件系统到目标板。23.3.1编写BootLoader一个嵌入式Linux系统从软件角度看可以分为四个层次:引导加载程序。包括固化在固件(firmware)中的boot代码(可选),和BootLoader两大部分。Linux内核。特定于嵌入式目标板的定制内核以及内核的启动参数。文件系统。包括根文件系统和建立于Flash内存设备之上文件系统。通常用ramdisk来作为rootfs。用户应用程序。特
2、定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式GUI有:Qt、MicroWindows和MiniGUI等等。33.3.1.1基本概念BootLoader所支持的CPU和嵌入式板BootLoader的安装媒介(InstallationMedium)用来控制BootLoader的设备或机制BootLoader的启动过程是单阶段(SingleStage)还是多阶段(Multi-Stage)BootLoader的操作模式(OperationMode)BootLoader与主机之间进行文件传输所用的通信设备及协议4首先我们做一个假定,那就是:假定
3、内核映像与根文件系统映像都被加载到RAM中运行。之所以提出这样一个假设前提是因为,在嵌入式系统中内核映像与根文件系统映像也可以直接在ROM或Flash这样的固态存储设备中直接运行。但这种做法无疑是以运行速度的牺牲为代价的。3.3.1.2BootLoader的主要任务5固态存储设备的典型空间分配结构3.3.1.2BootLoader的主要任务kernelRootfilesystemBootparametersBootLoader6一个典型的BootLoader:VIVI从操作系统的角度看,BootLoader的总目标就是正确地调用内核来执行。另外,由于BootLoader的实现依赖于CPU
4、的体系结构,因此大多数BootLoader都分为stage1和stage2两大部分。依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而stage2则通常用C语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。这里以韩国MIZI公司的VIVI为例来说明BootLoader的主要任务。7VIVI的阶段1head.S程序.sgcc可以编译的汇编语言源程序,但不进行预处理,即不处理#define、#include、#undef等等。.Sgcc可以编译的汇编语言源程序,进行预处理,因为要进行预处理
5、,因此C语言中的宏、头文件和条件式编译均可接受#define、#include、#undef、#ifdef,C语言中的注释也可以如/**/、//等。8head.S通常完成如下几件事情:(1)关WATCHDOG:上电后,WATCHDOG默认是开着的;(2)禁止所有中断:vivi中没用到中断(不过这段代码实在多余,上电后中断默认是关闭的);(3)初始化系统时钟:启动MPLL,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz,“CPUbusmode”改为“Asynchronousbusmode”;(4)初始化内存控制寄存器(还记得那13个寄存器吗?);9head.S通常完成
6、如下几件事情:(5)检查是否从掉电模式唤醒,若是,则调用WakeupStart函数进行处理——这是一段没用上的代码,vivi不可能进入掉电模式;(6)点亮所有LED(7)初始化UART0:a.设置GPIO,选择UART0使用的引脚b.初始化UART0,设置工作方式(不使用FIFO)、波特率1152008N1、无流控等,请参考实验:UART10head.S通常完成如下几件事情:(8)将vivi所有代码(包括阶段1和阶段2)从nandflash复制到SDRAM中:a.设置nandflash控制寄存器b.设置堆栈指针——调用C函数时必须先设置堆栈c.设置即将调用的函数nand_read_ll的
7、参数:r0=目的地址(SDRAM的地址),r1=源地址(nandflash的地址),r2=复制的长度(以字节为单位)d.调用nand_read_ll进行复制e.进行一些检查工作:上电后nandflash最开始的4K代码被自动复制到一个称为“Steppingstone”的内部RAM中(地址为0x00000000-0x00001000);在执行nand_read_ll之后,这4K代码同样被复制到SDRAM中(地址为0x33f00000-
此文档下载收益归作者所有