嵌入式系统启动代码一般由两部分构成:引导代码和操作系统执行环境初始化代码。其中引导代码一般也由两部分构成:第一部分是板级、片级初始化代码,主要功能是设置寄存器初始化硬件工作方式,如设置时钟、中断控制寄存器等,完成内存映射、初始化MMU等;第二部分是装载程序,其功能是将操作系统和应用程序映像从只读存储器装载拷贝到系统RAM中,并跳转到相应代码处继续执行。操作系统执行环境初始化代码主要由硬件抽象层HAL代码、设备驱动程序初始化代码和操作系统执行体初始代码三部分构成。
本文以摩托罗拉MPC860处理器和具有自主知识产权操作系统CRTOSII为例,研究嵌入式系统引导程序设计和实现技术。嵌入式软件开发涉及调试模式和固化模式两种运行状态。调试模式主要解决如何目标板上调试正确性未经验证程序问题;而固化模式主要解决如何引导已调试成功程序问题。相应,引导代码设计应针对两种模式分别进行。
1 调试模式系统引导
1.1 调试模式引导代码作用
1 调试模式系统引导
1.1 调试模式引导代码作用
一个完整嵌入式软件解决方案大致包括四方面:①硬件平台配置初始化和系统引导代码;②操作系统软件执行环境初始化代码;③操作系统;④应用程序。
上述四方面中,引导代码是本研究中力求解决问题。事实上,板级初始化、操作系统硬件抽象层、设备驱动程序三者整合到一起,就构成了嵌入式系统中BSP(板级支持包)主体。BSP代码与具体目标板硬件设计相关,同时也与应用程序设计要求相关,针对应用程序提出不同要求,例如不同设备驱动程序、不同中断源个数、不同中断优先级安排、是否启用MMU机制等,BSP部分应作出相应安排。上述第四部分应用程序是建立前三部分正确运行基础上,并需反复调试。
由上述分析可知,BSP和应用程序代码正确性一次编写不能到保证,需要经历“调试——修改——调试”反复过程,需要建立一个可靠调试环境。该环境建立基础正是调模式下引导代码。
1.2 引导代码调试方法
本研究实验采用一种称作BDM(Background Debug Mode)OCD(On Chip Debuging)调试技术。BMD是由Motorola公司提供一种硬件调试方法,类似于JTAG调试。它利用处理器提供调试端口调试。MPC860采用一种特殊BDM——EPBDM,其运作相当于用处理器内嵌调试模块接管中断及异常处理,用户设置调试许可寄存器(debug enable register)指定哪些中断或异常发生后处理器直接进入调试状态,而操作系统处理程序。进入调试状态后,内嵌调试模块向外部调试通信接口发出信号,通知一直通信接口监听主机调试器,然后调试器便可调试模块使处理器执行系统指令(相当于特权态)。专用片级调试接口装置(BDI2000)支持,不需要目标端配备相应调试代理(Monitor)软件。
1.3 调试模式引导代码实现
调试模式引导代码核心使用BDM协议解析微指令,调试接口向MPC860发送信号,初始化调试环境。MPC860采用RISC结构,初始化部分主设置处理器内部寄存器,这个过程包括三方面内容:
(1)对处理器相关寄存器进行初始化:主处理器状态寄存器(MSR、SRR1、SIUMCR等),中断、时钟相关模块(SYPCR、SCCR、PLPRCR、TBSCR等)。
(2)对BDM调试端口初始化:包括调试使能寄存器DER、支持指令断点寄存器ICTRL等。
(3)对片级、板级内存映射初始化:包括内部内存映射寄存器IMMR,内存控制相关寄存器OR0~0R7、BR0~BR7等。它们主要功能是址映射、片选信号选择、内存控制器选择(UMPA、UMPB、GPCM)。选择UPM,UPM控制采用微指令方式,而这些微指令内存不同(SRAM、SDRAM、DRAM等),需要设计人员自行编写代码写入MPC860内部存储区相应位置。需要实时刷新存储体(如SDRAM),还需设置刷新控制微指令。
上述初始化代码以执行,依赖于目标机MPC860提供调试接口支持,另也需要宿主机GDB支持。宿主机系统,可能选择Linux,其下配置GBD;也可以选择Windows2000,使用可视化调试工具LambdaTools GDB(Coretek公司产品,不支持硬件断点),使用BDI2000(支持硬件断点仿真器)。使用哪种调试工具,都可以使用该调试器能够识别脚本文伯存放初始化指令。这些脚本功能上是等效,指令描述一般都采用如下格式:
操作码 寄存器 数值
如嵌入式Linux下SDRAM初始化代码片断为:
mpcbdm spr MDR=0x1FF77C35
mpcbdm spr MDR=0xEFEABC34
mpcbdm spr MDR=0x1FB57C35
……
而Windows2000下使用BDI2000代码为:
WUPM 0x00000005 0x1FF77C35
WUPM 0x00000006 0xEFEABC34
WUPM 0x00000007 0x1FB57C35
……
脚本描述指令执行后,MPC860预先设想进入一个可以正常工作状态,可以用装载器将程序下载到SDRAM中调试执行。这个程序主要包含中断表、操作系统和应用程序映象两部分,其格式可以为bin、elf、coff等。图1给出了下载完毕后内存映象。
当程序下载完成后,PC指针指向Image代码段(text段)首条指令,可以利用调试器提供命令开始调试。
2 固化模式系统引导
2.1 概述
调试后,OS和上层应用程序构成Image正确性到了保证,这个Image不能自主运行。调试模式下,是BDM接口初始化处理器,BDM接口将程序下载到RAM中去运行。实际应用环境中,Image必须被存储非易失性存储器中,如Flash、EPROM等,本文选择Flash。系统启动时,处理器执行一段引导程序替代调试模式下调试脚本和装载程序功能。启动代码主要考虑以下几个问题:
(1)系统上电和复位时程序如何执行,需要初始化哪些寄存器,重点仍然是内存映射相关部分;
(2)启动代码为几部分,每部分代码应该全部部分放到FlashRAM中执行;
(3)时间效率和空间效率折衷。
2.2 上电初始化
两种引导模式下,上电初始化总是必要步骤。它涉及各种核心寄存器初始化、址映射等问题处理。
2.2.1 址映射
MPC860复位是一种异常中断来处理(可理解为CPU自己产生中断),向量号为0x100。异常向量表基址加上复位向量号即为复位向量,也就是CPU开始执行指令方。异常向量表内存空间可能位置有两个:0x0000000和0xFFF00000。PowerPC复位向量为0x100或0xFFF00100。复位向量为0xFFF00100,系统有128K字节Flash,并准备把它映射到CPU内存空间0xFE000000开始址。MPC860内部CS0片选信号是默认系统启动片选信号,已被连接到Flash片选线上。上电时,内存控制器会忽略所有参与征选逻辑址线高17位,CS0总是有效。这样,Flash总会被选中,CPU从Flash偏移0x100方取指令,此时CPU4GB内存空间每个128KB块都被映射到Flash。
2.2.2 寄存器初始化
固化方式下大致相同,不再采用脚本文件编写,直接将一段MPC860汇编程序存放一个start.s文件中。与调试模式初始化程序一样,主要完成以下处理:
(1)初始化CPU核心寄存器;
(2)设置机器状态寄存器;
(3)禁止ceche;
(4)初始化IMMR;
(5)初始化系统接口单元(SIU);
(6)初始化时钟和中断控制寄存器;
(7)初始化通信处理机(CPM);
(8)初始化内存控制器(UPM);
(9)初始化C语言堆栈。
2.2.3 址空间重映射
上电时,一个片选信号有效,它选通了Flash,而RAM和其它存储设备址无效,需要址空间重映射才能访问。MPC860址空间重映射是设置0R0~OR7、BR0~BR7这十六个寄存器完成。上电时4GB址空间均被Flash占用,0xFFF00100这个址仍Flash偏移0x100处。寄存器初始化过程中,需要把SDRAM、MPC860内部寄存器空间以及外设等也映射进来。进行这些操作前,需要把Flash位置固定下来,例如映射到0xFE000000,这个操作是设置OR0和BR0寄存器实现。但写OR0时,CPU仍然0xFFF00000那一块取指令,而Flash即将被映射到0xFE000000块,程序必定出现“跑飞”现象,必须对程序计数器(PC)进行调整,PC指针对程序员是不可见,必须用跳转指令修改它。Flash址映射完成后,设置OR1~OR7、BR1~BR7可以完成对所有存储器空间映射,各种存储设备可映射CPU址空间中任意位置,但相互之间不能冲突。
2.3 引导代码构成和运行
系统启动所涉及代码由寄存器初始化汇编文件start.s、一个Load程序以及操作系统与应用程序Image三部分构成,引导代码则只包含start.s和Load程序。Load程序作用是将操作系统与应用程序构成Image从Flash拷贝到SDRAM中,并跳转到Image首条指令。
调试完成后Image有两种运行模式:
Flash-resident image:Load程序仅仅 把Image中数据段(data+bss)复制到RAM中,代码段(text)Flash中直接运行。
Flash-based image:Load程序把Image完全搬到RAM中执行,包括image中代码段(text)和数据段(data+bss)。
图2和图3分别描述了两种Image存贮映象,以及从Flash到SDRAM装载过程。
2.4 时间效率和空间效率上折衷
嵌入式系统应用过程中,针对不同应用环境,对时间效率和空间效率有不同要求,基于MPC860启动代码对此有比较充分解决方案。
2.4.1 时间限制
时间限制主要包括两种情况:系统要求快速启动和系统启动后要求程序高速执行。
要求快速启动系统,应该使Flash中执行初始化程序尽量简短,诸如循环语句之类语法应该尽量减少,尽快将程序装载到RAM中执行,这样做原因Flash访存时间与RAM访存时间存数量级上差距。必须代码量以及存储器特片进行权衡。,RAM中捃速度快,将Flash中代码复制到RAM中操作会带来一定开销。可见,启动时间由Flash中引导代码运行时间、代码从Flash拷贝到RAM时间以及RAM中后续启动代码运行时间三部分组成。启动时间最小值是这三者和最小值。
启动后要求程序高速执行系统,主要受处理器、存储器特性以及I/O速度等影响。软件方面,应该采用了上述Flash-based image方式,使代码段RAM中运行,提高运行速度。
2.4.2 空间限制
空间限制主要包括两种情况:Flash等非易失性存储空间有限和RAM等易失性空间有限两种系统。
采用高性能非易失性存储器系统,出于成本因素,Flash等存储设备不能太大,它又是系统存放启动代码和操作系统Image方。存放Image时,可以先使用gzip等压缩工具进行压缩,将Image加载到RAM时采用逆向解压缩算法解压。同时,出于实时性考虑,压缩算法不能过于复杂,否则压缩解压过程消耗大量时间将与启动时间限制发生严重冲突。采用压缩策略并不一定会增加系统启动时间,压缩解压过程消息了一定时间,Image体积减小,由Flash复制到RAM中时间相应减少,有可能减少了时间消耗。
采用高性能RAM系统,同样出于成本因素,RAM空间有一定限制,此时一般采用前文描述Flashresident image方式:Load程序把Image中数据段复制到RAM中,代码段Flash中运行。折衷同样存,code段低速Flash中运行,节省空间同时,却牺牲了时间。
本文介绍了基于嵌入式处理器操作系统引导方法,重点研究嵌入式系统引导模式以及不同类别引导方法。以MPC860C处理器上引导CRTOSII操作系统为例,阐述了调试模式和固化模式下引导代码构成、作及执行方式,并对不同引导模式下时空效率折衷进行了分析。最终,借助BDI2000仿真器对编写引导代码进行调试,成功实现了调试模式和固化模式下操作系统引导。后续工作包括:继续研究不同硬件平台上操作系统引导方法,例如最流行ARM、X86系列;同一平台上,可以研究不同操作系统启动方法,例如嵌入式Linux、Vxworks、WinCE等。同时,可以引入数字模型对时间、空间性能进行量化分析,不同环境下采取比较合适引导方案。
共0条 [查看全部] 网友评论