WindowsCE内核定制(嵌入式开发流程)
时间:2005-09-18 来源:purewall
WindowsCE内核定制:
WindowsCE内核定制是开发的一个重点,它不同于一般应用程序的开发,因为它涉及到硬件,内核定制包括定制板级支持包BSP、定制系统模块、定制原始设备商适配层( OAL)及设备驱动等程序。WindowsCE内核定制是靠Platform Builder完成的,它是微软提供的专业软件,可以从官方网站得到他的评估板,现在发展到了Platform Builder5.0。
以下从几个方面来探讨WindowsCE内核定制过程。
1.Platform Builder环境搭建:
微软的Platform Builder集成开发环境包含一系列开发工具、上下文相关菜单、工具栏和快捷键。熟练使用Platform Builder提供的配置文件和开发调试工具可以快速定制适合目标平台的WindowsCE操作系统,缩短平台开发周期。适当修改和设置Platform Builder的配置文件可以裁剪和添加相关组件,正确配置各种设备驱动程序。
安装Platform Builder时,首先确保您的计算机可以胜任开发工作,然后在WINCE的安装光盘下运行SETUP.EXE,点击INSTALL以安装WINCE。这个安装的过程中要选择CPU,每个CPU的文件都非常之大,所以不用的就不要选啦,我的开发板是Sitsang,是ARMV4I的,所以这个选上,根据自己需要选CPU,这个装完后,Platform Builder就装好了。
2.定制板级支持包BSP:
BSP的开发主要包括BootLoader的开发、OAL的开发、驱动程序开发及平台文件的配置等等。以下分别来讨论。
2.1BootLoader的开发
编写BootLoader是开发WinCE系统第一步,也是关键的一步。只有得到一个稳定工作的Loader程序,才能够更进一步开发WinCE的BSP,直至最后整个系统的成功。
BootLoader是一段单独的程序代码,它存放于目标平台的非易失存储介质中,如ROM或Flash。在开发CE的过程中,它主要用于启动硬件和下载nk.bin到目标板上,并有一定的监控作用。
一般来说,对于BootLoader的功能要求并不是严格定义的,不同的场合区别很大。比如,在PC的硬件平台上,由于硬件启动根本就不是通过BootLoader(而是通过BIOS),所以BootLoader就不需要对CPU加电后的初始化做任何工作;而一般的嵌入式开发平台上,BootLoader是最先被执行的程序,所以就必须包括加电初始化程序。通常,BootLoader必须包含下载CE映像文件的功能。另外,管理监控硬件设备通常也是必须的,因为这可以极大地方便工程开发。由于BootLoader涉及到基本的硬件操作,如CPU的结构、指令等,同时又涉及到以太网下载协议(TFTP,当然也可能通过串口)和映像文件格式。因此从零实现的话,会需要相当长的过程。好在微软为每种类型的CPU都提供了某种标准开发板的BootLoader例程,因此通常的做法是:从这些例程中寻找与硬件平台最接近的作为标本程序,然后再从自己的硬件平台上入手做相应的改动。一些新的评估板可能会由第三方的厂商来提供Bootloader。如果硬件平台是从这样的基板设计而来的话,那么最好去寻求这些厂商获取Bootloader来移植,以减少工作量。
BootLoader程序可以通过PB的集成编译环境编译链接,控制文件为.bib文件,这里不进行详细论述了。
2.2OAL的开发:
OAL(OEM Adaptation Layer)既OEM 适配层,从逻辑上讲位于Windows CE内核和硬件之间,从物理上讲OAL各个模块代码被编译后(.lib)和其它内核库链接到一起形成Windows CE的内核可执行文件nk.exe。
Windows CE内核在OAL层暴露了大量的函数和全局变量,利用这些函数和全局变量OEM可以编写中断处理、RTC、电源管理、调试端口、通用I/O控制代码等。CE安装目录的子目录中包含了OAL的部分源码,大多数情况下开发者对OAL只要修改即可,甚至无需修改。
OAL的开发可分为四步:
第一步:初始化内核。
这一步完成必要的准备工作,描述系统配置,例如平台的参考设计和Config.bib文件设计。这些描述关系到系统的初始化等方面,如MMU初始化必须首先了解物理内存的大小和布局要求。
第二步:创建基本的OAL。
这一步确保系统在启动时能够进行初始化、启动调试用串行化、初始化通信设置和建立系统节拍。因此本步骤应该实现基本的系统初始化代码,使之能够进一步调试,并保证内核初始化完成,符合设计要求。
第三步:加强OAL功能。
承接上一步,实现系统其他功能,例如实现ISR,管理时钟和记时器,配置调制选项,启动电源管理,以及向应用系统提供系统信息,并能保证整个系统可以启动。
第四步:完成OAL。
这一步实现其他附加功能。
2.3编写驱动程序:
在Windows CE中,所有的驱动程序都以dll形式存在。Dll文件可以用EVC来开发,也可以使用PB来开发,使用PB开发驱动程序,可以跟NK同时进行编译,要比EVC来的方便一点。就只要介绍用PB来进行dll库开发的方法。
使用PB来开发,首先应该在你的工作平台下面建立一个目录,用来存放源文件,同时要修改dir文件,使得编译的时候能够进到源文件所在的目录。
编写dll的方法这里略去,实际上是写一堆的函数,这里主要解释一下使用PB编译,需要增加的文件。
第一个文件是sources文件,这里给出了一个sources文件的例子:
TARGETNAME=led
使用TARGETNAME来指示生成目标的文件名(不包含扩展名,扩展名PB会自动加上)。
RELEASETYPE=PLATFORM
RELEASETYPE指示该文件将要生成的类型,一共有五个取值:
SDK:使用该类型将使得生成的目标文件被存储到%_PUBLICROOT%Oak目录,而lib文件被放置到%_PUBLICROOT%Sdk目录。
DDK:使用该类型将使得生成的目标文件被存储到%_PUBLICROOT%Oak目录,而lib文件被放置到%_PUBLICROOT%Ddk。
PLATFORM:使用该类型将使得生成的文件受平台控制。
LOCAL:该类型使得生成的文件全部放置到当前路径。
CUSTOM:该类型使得生成的文件放置到TARGETPATH制定的位置(也就是说必须要有TARGETPATH参数设置)。
TARGETTYPE=DYNLINK
生成的目标类型,LIBRARY表示是一个lib库,DYNLINK则表示是dll,而PROGRAM则是一个exe文件。
TARGETLIBS=
$(_COMMONSDKROOT)lib$(_CPUINDPATH)coredll.lib
TARGETLIBS指示连接需要的库的名字。
SOURCELIBS=mm.lib
SOURCELIBS指示将于某一个lib一起连接。上面一个lib是需要什么就取什么,而这个lib则是连接所有的。
DEFFILE=led.def
DLL文件的def文件名。
INCLUDES=....inc
指定include的路径。
SOURCES=
led.c
指定参与该规则的所有的源文件。
第二个则是makefile文件,该文件只需要INCLUDE $(_MAKEENVROOT)makefile.def就可以了,建议不要修改。
第三个文件是def文件,下面是一个该文件的实例
LIBRARY led
生成的库(.lib)文件名(PB自动生成扩展名)。
EXPORTS
mm_init
EXPORTS指定了需要导出的函数名称
建立好这些文件之后,选择PB的build菜单的open build releasee directory,到达所在的目录,执行build -c,如果没有错误,就按照我们的要求生成文件了。
2.4平台文件配置:
配置文件包括4种文件类型:二进制映像生成文件.BIB、注册表文件.REG、目录和文件分配表文件.DAT、数据库文件.DB。通过修改这些配置文件可以裁剪优化Windows CE。用户根据需要可以创建自己的配置文件。
2.4.1.BIB文件
.BIB文件是文本文件,标识包含在Windows CE映像中的目标模块、组件和文件。一个.BIB文件包含4个部分:FILES、MODULES、MEMORY和CONFIG。
FILES部分
FILES分配一部分内存空间给静态数据文件。这部分主要包括字体文件(.TTF)、文本文件(.TXT)、位图文件(.BMP)和声音文件(.WAV)等。例如:
;Name Path Memory Type
;------- --------- ------------ ---------
Tahoma.ttf $(_FLATRELEASEDIR).ttf NK SHU
Name:在Windows CE系统中的文件名。
Path:文件在开发工作站中的位置。
Memory:文件所属的内存区。
Type:定义文件属性。Windows CE中的文件有以下文件属性:S为系统文件、H为隐含文件、U为非压缩文件、R为压缩资源文件、C为压缩文件。1个文件可以同时具有几种属性。
上例说明NK内存区包含开发工作站的$(_FLATRELEASEDIR).ttf文件。在Windows CE系统中,tahoma.ttf的文件属性是系统隐含的非压缩文件。
MODULES部分
列出加载在内存中的目标模块和组件,包括所有的可执行文件.EXE和动态链接库.DLL。例如:
;Name Path Memory Type
;------- ---------------- --------------- --------
device.exe $(_FLATRELEASEDIR).exe NK SH
device模块加载到内存区。Windows CE系统中device.exe具有系统和隐含属性。
MEMEORY部分
把物理内存分成2个部分:数据存储区和程序存储区。例如
;Name Start address size(bytes) Type
;------- -------------- ------------ --------------
NK 80200000 00600000 RAMIMAGE
RAM 80800000 00800000 RAM
在Windows CE系统中,内存分成3种类型:RAM、RAMIMG和RESERVED。RAM规定内存大小;RAMIMG规定ROM空间;RESERVED为保留的内存空间,内核不能使用这部分内存,但是应用程序可以访问。上例说明NK的起始地址是80200000,它占有6MB内存空间,作为ROM用于数据存储区。RAM在80800000开始,占有8MB的内存空间,用于程序存储区。
CONFIG部分
这部分不是必不可少的,在这部分进行一些属性设置,如是否压缩和ROM大小等。
2.4.2注册表文件.REG
注册表文件.REG是建立操作系统映像的注册表入口。注册表是一个数据,存储了大量的配置信息,包括应用程序信息、设备驱动程序的配置、系统配置信息、用户参数和其它相关数据。
当目标平台冷启动时,Makeimg.exe使用.REG文件创建默认注册表。Platform.REG配置与平台有关的注册表信息,如设备驱动程序入口。Project.REG设置与工程有关的注册表格。注册表文件的格式:
[HKEY_LOCAL_MACHINE]
"Launch10" = "shell.exe"
"Launch20" = "device.exe"
"Launch30" = "gwes.exe"
"Depend30" = "hex:14,00"
上述注册表入口设置规定内核在启动时必须自动运行shell.EXE和device.exe模块,gwes.EXE模块必须在device.EXE正常启动以后才能运行。
2.4.3数据库文件.DB
数据库文件.DB 时Windows CE提供内置的轻量级数据库管理系统。Windows CE的属性数据库由1张包含记录的表组成,每个记录包含许多不同的属性,每个属性有3种信息:标志属性的ID号、类型和值。例如:
.Record:
Field:402001f:"{000214A0-0000-0000-C000-000000000046}"
Field:42020003:15
Field:42030003:2
End
属性数据库是一种平面结构,不能定义属性数据库之间的关系。使用Microsoft ActiveX Data Object for Windows CE(ADOCE)技术可以容量地访问属性数据库,甚至可以使用SQL语句查询信息。
2.4.4目录分配表文件.DAT
.DAT文件定义Windows CE映像NK.NIB默认的目录和文件结构。注意,Winodws CE不支持像Windows 9x/2000一样的盘符驱动器,而且没有当前目录的概念。例如:
root:-Directory("Program Files")
Directory("Program Files"):Directory("MY Work")
root:-Directory("My Documents")
Directory("My Documents"):-File("MyFile.doc")
生成2个根目录:Program Files和MyDocuments。Program Files有1个子目录:My Work。文件MyFile.DOC位于My Document目录中。注意MyFile.DOC必须出现在一个.BIB文件中,这样,映像文件中会有MyFile.DOC。
2.4.5设置环境变量:
在所有配置文件中,都存在条件语句IF Enviroment Value......END IF。当条件成立时,IF和END IF之间的信息包含在映像文件NK.BIN中;条件不成立时,则不包含相关模块和文件。通过设置环境变量可以添加或者删除NK.BIN中的模块和组件。以.BIB文件为例:
;Name Path Memory Type
;-------- ------------- --------------- -------
IF IMGUSB
IF CEPC_UHCI
uhci.dll $(_FLATRELEASEDIR).dll NK SH
ENDIF
IF CEPC_OHCI
ohci.dll $(_FLATRELEASEDIR).dll NK SH
ENDIF
usbd.dll $(_FLATRELEASEDIR).dll NK SH
usbhid.dll $(_FLATRELEASEDIR).dll NK SH
ENDIF
这里IMGUSB、CEPC_UHCI、CEPC_OHCI都是逻辑型环境变量。在PB中,可以使用2种方法设置环境变量。
方法1:点击Platform菜单的Setting...,打开平台设置对话框,分别输入Variable和Value设置环境变量。
方法2:点击Build菜单的Open Build Release Directory,打开命令提示窗口,在命令提示窗口中设置环境变量。在命令行中输入SETIMGUSB=1,动态链接库usbd.dll和usbhid.dll被包含到映像文件NK.BIN。uhci.dll和ohci.dll是否包含在NK.BIN中,取决于环境变量CEPC_UHCI和CEPC_OHCI的设置。如果SET IMGUSB=0,KN.BIN中不包含上述4个动态链接库。
2.4.6编译配置文件
生成映像文件NK.BIN是平台创建过程的最后一步,也是配置Windows CE的最终目标。Makeimg.exe使用全部配置文件把目标模块和文件合并成一个惟一的Windows CE映像文件NK.BIN。
3.导出平台SDK :
内核编译完成后,通过project菜单的Export Wizard导出一个平台SDK,供在 EVC或VS.net中开发上层软件使用。
4.内核下载:
BootLoader的开发会生成Eboot.nb0等文件,内核编译会生成NK.nb0和NK.bin等文件,内核下载时,先通过JFlash.exe向Flash中写入Eboot.nb0文件,上电运行,可以通过超级终端看到一些启动和调试信息。之后,通过Eshell.exe来下载NK.bin。然后重起系统,定制的WindowsCE已经可以运行了。