WinCE系统下BootLoader的开发

引言
windows ce.net是微软公司向嵌入式领域推出的一款操作系统。它最大程度继承了桌面版windows操作系统的丰富功能,同时又副入了许多新特性,以适应嵌入式领域的实际情况和要求。无论是商业应用需求,还是人们的多媒体消费需求,都能被采用ce操作系统的设备很轻松的满足。最新的.net版本较之3.0版本,在实时性和稳定性上有大幅度提高,开始广泛地被平板电脑、数码相机、彩屏手机、pda等多种高性能产品所采用。
但是,ce并不是一个通用的安装版操作系统,在形形色色的嵌入式硬件设备世界里, 一款ce系统通常只会针对某一种硬件平台生成。所以,作为原始设备生产商,必须根据自己的硬件平台和应用场合定制ce,最主要的工作就是编写适合于自己的板级支持包(bsp)。在bsp中,包含了一个重要的组成部分——bootloader。创建一未功能完善的bootloader,是开发wince系统的第一步,也是极为关键的一步。本文将结合开发实例,介绍如何开发适合于自己硬件的bootloader。
1 定制ce操作系统的基本知识
定制ce操作系统是采用微软的工具软件:platform builder(pb)。该工具能够根据用户的需求,选择构建具有不同内核功能的ce系统。同时,它也是一个集成的编译环境,可以为所有ce支持的cpu目标代码编译c/c++程序。前面所说的bsp和bootloader程序就是在该环境下编译,并整合到ce系统中去的。一旦成功地编译了一个ce系统,就会得到一个名为nk.bin的映像文件。只要将该文件下载到目标平台(device端),就能够运行ce了。
2 bootloader
bootloader是一段单独的程序代码,它存放于目标平台的非易失存储介质中,如rom或flash。在开发ce的过程中,它主要用于启动硬件和下载nk.bin到目标板上,并有一定的监控作用。
图1描述了wince的bsp基本结构以及bootloader所处的位置。
一般来说,对于bootloader的功能要求并不是严格定义的,不同的场合区别很大。比如,在pc的硬件平台上,由于硬件启动根本就不是通过bootloader(而是通过bios),所以bootloader就不需要对cpu加电后的初始化做任何工作;而在笔者的开发平台(mips32)上,bootloader是最先被执行的程序,所以就必须包括加电初始化程序。通常,bootloader必须包含下载ce映像文件的功能。另外,管理监控硬件设备通常也是必须的,因为这可以极大地方便工程开发。由于bootloader涉及到基本的硬件操作,如cpu的结构、指令等,同时又涉及到以太网下载协议(tftp,当然也可能通过串口)和策软设定的映像文件格式。因此从零实现的话,会需要相当长的过程。好在微软为每种类型的cpu都提供了某种标准开发板的bootloader例程,因此通常的做法是:从这些例程中寻找与硬件平台最接近的作为标本程序,然后再从自己的硬件平台上入手做相应的改动。一些新的评估板可能会由第三方的厂商来提供bootloader。如果硬件平台是从这样的基板设计而来的话,那么最好去寻求这些厂商获取bootloader来移植,以减少工作量。
笔者使用的硬件平台基于mips32架构,下载端口采用的是以太网口,同时还具备一个串口,主机相连,通过超级终端对该平台加以控制。该平台是参考amd的一款标准估计板设计的,bootloader以该板的bootloader为参考进行了移植。
3 编写bootloader源程序
前面已经提到,由于硬件的不同,bootloader的功能可能有多有少,此处笔者以自己开发bootloader的过程进行叙述。图2是笔者bootloader的工程流程。
3.1 启动部分
首先要实现初台化硬件的功能。在参考板的bootloader目录下,会发现一些.s文件,可能会是init.s或者是reset.s等,这样的文件是cpu加电后最先执行的代码。由于此处是用汇编语言编写的,所以与cpu关系紧密。一般参考板的cpu与开发平台的cpu会是相同或者是同一个架构的。笔者使用的是属于同一种cpu的情况,所以对寄存器的定义和初始化流程都可以不加改动。接着就是对于平台配置的分析,包括平台存储空间的分配、外围设备的工作设定等。一般这里的区别是非常大的。所以必须要对cpu寄存器的值作相应设定。这部分工作可能需要cpu提供商方面的帮助。
应该说,这部分工作是bootloader的一大重点,但由于和实际的硬件非常大,所以不可能做进一步的详细叙述。
3.2 主控部分
从这一部分开始,均用c语言编写。
为了增加bootloader对平台的控制,一般bootloader都会设计成支持命令输入的方式,通过串口来接收用户的命令。这种机制中,如果参考板有loader支持的话,那么可以自己添加有实用价值的命令,完成一些需要的功能。
从图2中可以看出,一般在平台调试完毕后,可以在不用人工干预的情况下自动加载ce(这也是bootloader必需的功能之一);而在调试阶段,基本上是通过loader所支持的命令来进行操作的。提供足够丰富的命令,能极大简化和全面测试开发平台。如表1所列,是笔者loader所提供的命令。
表1
命 令 说 明
help 列出所有支持的命令并加以说明
eboot 从开发台下载ce映像并加载
write 向某一内存地址写入数据
read 显示某一内存地址的数据
jump 跳转到某一地址执行程序
xmodem 从计算机的超级终端接收以xmodem协议传送的文件
toy 测试平台cpu的计数器是否运转
flash 擦除或者更新flash中的数据
tlbread 显示cpu的所有tlb表
tlbwrit 设置cpu的tlb
macaddr 设置cpu的mac地址
seti 设置平台的ip地址
这些命令涉及到平台调试的各个方面,像内存检测、flash操作、文件下载等。借助于这些命令,不仅可以完成硬件平台的部分测试,还完成了作为ce的bootloader程序最为重要的一个功能——下载ce映像。
3.3 下载部分
在用platform builder编译生成ce的映像文件后,接下来就需要将该文件下载到目标板上。如果说硬件调试功能可以由其它的程序代替而不放入bootloader中,但是下载映像文件却是bootloader必需的功能。
ce映像文件通常叫做nk.bin,它是windows ce二进制数据格式文件,不仅包含了有效的程序代码,还有按照一定规则加入的控制信息。当然,也可以选择生成.sre格式的代码文件,但是相于对前一种格式,它的代码要长很多,所需要的下载时间也更长。在这里,我们以下载.bin格式的文件来说明下载的实现。
首先看一下图3所示的bootloader下载部分的流程图。
通常,在platform builder自带的代码中,会包含完成tftp连接的了基本的函数。
*初始化tftp连接:用函数ebootinittftp()和ebootinittftpd()完成。
*登记解析.bin格式数据的回调函数:用eboottftpdserverregister()完成。
*发出连接请求:用ebootsendbootme()完成。
*接收主机端发出的数据包:用eboottftpreceiver()完成。
在这里,需要重点说明的有两点。
①对于接收数据包的函数eboottftpreceiver(),它只能处理已经存入内存的以太网包,也就是说,从以太网控制器接收数据的功能必须要用户去完成。由于这一功能与硬件密切相关,所以不能使用pb自带的函数来完成。
②函数eboottftpdserverregister()会登记一个回调函数,一般用户可以自己定义这个函数,该函数用于完成,bin格式数据的解析和保存,有效数据至目的地ram。pb有自带的例程函数可作参考。一般来说,如果目的地就是ram的话,直接参考例程函数即可。但是如果目的地就是flash,不要直接存入flash(字为单位),应先存入内存中待下载完毕以后再导入flash。当然,这种方法必须要有足够的内存。如果没有足够的内存,也可以缓存部分数据后,分段写入flash。
3.4 支持doc
对于wince操作系统而言,丰富的多媒体功能是其一大特点,使其成为当前消费类电子产品操作系统中的一个不错选择。但是随之而来的问题是,系统的容易已经大大超过出了传统嵌入式系统上百kb的数量级。一般来说,如果选择了图形界面和汉语支持,容量一般会超过16mb。doc(disk on chip)则提供了一种相对廉价的大存储容量的解决方案。
doc本质上是一种加以软件控制的nand格式的flash,通过tffs这一软件层提供对wince的支持。
由于doc不能像内存一样被直接访问,所以其加载wince的过程有些特殊,必须要在bootloader中加入专门的代码,才能使用doc来存放wince映像文件。
为了说明怎样在loader文件中提供对doc的支持,先看一下如何采用doc系统启动ce,如图4所示。从图4可以看出,当采用doc作为存储体的时候,实际上是在启动的时候把映像文件拷贝到内存中执行。为了实现这一启动过程,就必须涉及到doc的读写操作。首先要从m-system的网站上获取doc的boot软件开发包。在这个开发包里,提供了一系列doc的操作函数。将此开发包嵌入到ce的bootloader中去,然后按照图4的步骤,调用相应的读写函数完成这一过程。对于开发包中相关函数的说明,笔者就不具体介绍了,可以参考开发包的说明文档。
4 bootloader的编译、链接和下载
bootloader程序可以通过pb的集成编译环境编译链接,控制文件为.bib文件,下面是一个简单的bootloader的.bib文件。
memory
cli 9fc00000 00050000 ramimage
ram 80080000 00070000 ram
config
compression=on
sre=on
romstart=9fc00000
romsize=00020000
romwidth=32
romoffet=000000
modules
nk.exe $(_flatreleasedir).exe cli
memory部分定义了生成的映像文件的目标地址,以及程序运行可以使用的内存空间。
config部分:compression是否对目标代码进行压缩;sre是否生成格式为sre的目标代码;romstart与romsize、romwidth、romoffset共同定义了开发平台上存放bootloader物理介质的起始地址、大小、宽度和偏移量。
modules部分定义了bootloader所包含的文件,一般就只有一个文件:cli.exe。
编译过程中,首先用命令build-c编译生成文件cli.exe,然后用romimage cli.bib命令产生最后的映像文件cli.sre。
对于bootloader文件的下载;有很多种方法:可以通过仿真器下载;也可以通过其它调试程序下载;还可以直接烧写到flash中。需要说明的一点是,这些方法可能会要求不同的映像格式。在pb环境下,可以生成的有.sre格式、纯二进制格式(用于直接烧写flash)以及和ce映像一样的.bin格式。
结语
从ce的bootloader开发流程可以看出,bootloader在完成下载ce映像和加载映像的主要功能外,还具有一些调试硬件的功能。当然,这些功能不是必需的,随不同的用户可能有自己的定义。但是不管loader的功能设计得多么简单或者是多么复杂,都是在开发ce系统中不可跳过的一环。实际上,由于loader有和ce系统交互数据的区域,所以还有对ce启动过程的控制作用,也是pb控制目标板ce启动的一个窗口。可以说,一个功能齐全的loader,不论是对调试硬件,还是控制和检测ce系统,甚至是成为产品之后的维护工作,都是大有帮助的。
编写bootloader是开发wince系统第一步,也是关键的一步。只有得到一个稳定工作的loader程序,才能够更进一步开发wince的bsp,直至最后整个系统的成功。

以单片机PIC16LF873A为核心实现便携式磁记忆检测仪的设计
看看这款号称“零”硬件利润的手机内部怎样?红米Note2拆解
常用的电流互感器接线图图解
如何减少锡膏在回流焊、波峰焊接中锡珠出现的几率?
光纤传感器的结构原理
WinCE系统下BootLoader的开发
非线性电阻柜的工作原理及主要特点
康佳特为恩智浦i.MX 8处理器推出全新解决方案平台,满足易用性要求
三星通过HDR10+技术 不断丰富电视屏幕的功能
人民日报头条报道中国量子计算
2019款保时捷卡宴车发动机故障灯异常点亮
Azure AI与Open AI合作开发AGI软硬件平台和AI超算技术
SpaceX即将进行第二次商业载人(Crew-2)发射
极进网络:关于Wi-Fi的十大误解
Qorvo新网站正式上线 交互式工具简化RF设计
dma在高分子分析的优点
旅游迎宾机器人带动旅游业,激励旅游产业的创新
ADI发布开源激光雷达(LiDAR)原型制作平台
工业互联网领先者蘑菇物联宣布完成B+轮融资
华为荣耀V9:不仅有颜还很有料!