x86软件移植到arm WINCE在ARM平台的移植及驱动技术详解

WinCE操作系统简介WINCE操作系统是一个通用的嵌入式操作系统,是一个开放的、可升级的32位嵌入式操作系统,是基于掌上电脑的电子设备操作系统,是一个简化的Windows 95。WindowsCE的图形用户界面相当优秀。它在1996年发布了Windows CE 1.0版和Windows CE。2004年7月的NET 5.0版。目前Windows CE。NET 4.2版是应用最广泛的版本,开发速度也很快,功能不用赘述。其主要应用领域是PDA市场、PPC、智能手机、工业控制、医疗保健等。

操作系统移植的原因为了更快的满足市场需求,在实际的开发过程中,我们更愿意移植操作系统,而不是重新开发。这样不仅可以节省时间,还可以大大提高开发效率。

因为嵌入式系统是一个软硬件紧密结合的系统,所以操作系统移植包括两个层次的工作:一个层次是CPU层次,另一个层次是板卡层次。因为WinCE操作系统几乎完全是用C语言编写的,所以可以移植到很多32位的微处理器上。走吧。包括ARM,x86、MIPS,SH等。而CPU级的移植通常由微软或者芯片厂商来完成,这样会大大减少OEM厂商开发过程中移植操作系统的工作量,但是板级的移植还是需要OEM厂商来完成。

一般来说,WinCE系统由四层组成:应用程序、WinCE内核映像、板级支持包(BSP)和硬件平台。基础软件平台由两部分组成:WinCE系统内核镜像(OS镜像)和板卡支持包(BSP)。因为WinCE系统是一个紧密结合的软硬件系统,即使CPU处理器相同,如果开发板上的外设硬件不同,此时还是需要修改BSP来完成一个新的BSP。所以换句话说,WinCE的移植过程主要是一个重写BSP的过程。

嵌入式操作系统负责分配和调度嵌入式系统的所有软硬件资源,并控制和协调所有组件的工作。与普通操作系统相比,嵌入式操作系统在实时性、硬件依赖性、软件固化性和应用特异性方面具有突出的特点。

WINCE在ARM平台上的移植与驱动技术1、 Bootloader的移植步骤。

BootLoader是一个在操作系统内核运行之前运行的小程序。通过这个小程序可以初始化硬件设备,建立内存空间映射,从而使系统的软硬件环境达到合适的状态,为最终调用操作系统内核准备正确的环境。在嵌入式系统中,通常没有BIOS这样的固件程序(有些嵌入式CPU还会嵌入一个很短的启动程序),所以整个系统的加载和启动任务完全由BootLoader来完成。

修改Bootloader是移植WinCE系统的第一步,也是关键的一步。只有得到一个稳定的启动程序,才能进一步完成WinCE BSP的移植。Bootloader主要用于管理目标平台的启动过程。它是一个独立的程序代码。通过这个小程序可以初始化硬件设备,建立内存空间的映射,下载操作系统的镜像文件,使系统的软硬件环境达到合适的状态,一般存储在目标平台的非易失性存储介质中,如ROM或Flash。

一般来说,Bootloader的作用在不同的场合是很不一样的。比如在桌面Windows PC硬件平台上,由于硬件启动根本不经过Bootloader(而是通过BIOS),开机后Bootloader不需要对CPU的初始化做任何工作;在嵌入式WinCE平台上,Bootloader是第一个执行的程序,所以它必须包含上电初始化程序,通常Bootloader必须包含下载WinCE镜像文件的功能。因为Bootloader会涉及到基本的硬件操作,比如CPU的结构和指令,还会涉及到以太网下载协议和镜像文件格式。因此,从零开始开发需要很长时间,通常的做法是使用微软为每种类型的CPU提供的标准研发板的Bootloader例程。

根据我在这个项目中的经验,Bootloader移植的主要步骤是:修改对应的dir和源文件;(2)是修改makefile.inc修改boot.bib,使其不与config.bib中的内存分配冲突;改进eboot,因为eboot在烧NK的时候会找到BINFS分区。BIN,然后将下载的映像刻录到BINFS分区。

2、 al OAL的全称是OEM适配层,即OEM适配层。它是WindowsCE内核和目标硬件平台之间的代码层。OAL主要负责Windows CE与硬件的通信,涉及CPU、中断、内存、时钟、调试口等核心设备。也是OAL每个模块代码编译后与其他内核库链接在一起的关键(。lib)来形成Windows CE的内核可执行文件NK.EXE。简单来说,就是用OAL来屏蔽CPU平台的细节,抽象硬件功能,实现操作系统内核的可移植性。

从逻辑结构上看,OAL位于WinCE操作系统内核和硬件之间,是连接WinCE系统和硬件的枢纽。从功能的角度来看,OAL非常类似于桌面PC上的BIOS。它具有初始化设备、引导操作系统和抽象硬件功能的功能。但与B10S不同,0AL属于操作系统,是操作系统的一部分。在WinCE6.0中,OAL首先扮演了穿针引线的角色,从它的启动代码就可以看出来。第二个作用是暴露一些OEM函数供Kerel调用,哪些函数由OEMGLOBAL决定。为了方便BSP的升级,6.0基本保留了原有的功能结构。所以我们可以选择5.0的BSP作为参考,移植到6.0。PB6.0的安装目录中也包含了一些bsp,其中DeviceEmulator就是模拟S3C2410平台的。所以,我们也可以以此为参考。简而言之,OAL代码的来源不是问题。问题是如何快速编译这些代码并验证其正确性。

下面将介绍快速调试OAL的方法。

首先克隆一个BSP,命名为2410Tiny。如果从5.0的BSP迁移,需要修改相应的目录结构。6.0没有CEC文件,需要转换。克隆完成后的BSP如下图所示:

其中,目录目录包含2410Tiny.pbcxml,这是CE6.0中BSP的组织文件,类似于5.0中的CEC文件。CESYSGEN存储了一个Makefile。

FILES目录存储与平台对应的配置文件,如BIB、REG等。这里清空platform.bib和platform.reg的内容,注意!Config.bib的内容保证了准确性。

删除SRC目录下的Drivers目录,并修改dirs文件以删除Drivers行。如下图所示:

至此,2410Tiny的BSP准备完成,用这个BSP定制一个OSDesign。选择模板时选择CustomDevice(第二项),然后直接点击Finish结束向导。进入平台属性页进行设置,如下图所示:

完成后,在Catalog Items中选择CEDB数据库引擎项(我一开始没有选择此项,但是我编译了一堆错误。选中此项后,我重新编译了一下,顺利通过。)单击编译按钮开始编译系统。

等它编译好了,我们继续往下看。之所以可以删除SRC目录下的驱动,是因为我们还在调试OAL的阶段,所以可以暂时忽略驱动。只要有OAL和内核,WinCE就能运行。从这个角度来说,我觉得OAL是用来抹平MCU的差异,而驱动是用来抹平外设的差异。

大约10分钟后,编译完成,最终的NK.bin文件大于3M,如下图所示:

此时我们可以启动BOOTLOADER,完成相关配置后下载NK.bin文件,如下图所示:

3M以上的NK,下载需要14秒左右。因为启用了KITL,所以最终可以在DebugOutput中看到WinCE启动的信息,如下图所示:

现在我们可以使用PB6.0的调试工具进行简单的调试。首先,使用目标控制来检查系统的运行过程:

大家可以看到,WinCE6.0目前只运行两个进程,NK.exe就是我们的OAL.exe!看看线程和模块的情况:

至此,可以认为WinCE6.0的OAL可以正常工作。

根据我在这个项目中的经验,Windows CE安装目录的所有子目录都包含一些OAL的源代码。OAL的移植要在fwxsc1.s. main.c、Flash.c、Edeviceinit.c等文件中实现,可以根据实际需要修改相应的代码。在OAL移植过程中,主要修改了这些函数:Startup.s函数、串口调试函数、OEMInit函数、系统时钟函数和中断处理函数。事实上,在大多数情况下,开发工程师只需要修改OAL,甚至不需要修改它。

3、驱动程序移植和开发

设备驱动程序是指可以管理虚拟或物理设备、协议、服务等的软件模块。操作系统通过驱动程序直接与硬件打交道。设备驱动程序可以为WinCE提供设备控制功能,包括LCD/LED/VGA/SVGA显示设备、鼠标、键盘和触摸屏。根据我在这个项目迁移中的经验,建议设备驱动迁移可以通过Platform Builder创建一个新的平台,然后根据硬件平台的需要插入和移除驱动。一般来说,需要修改的文件包括square。围兜,站台。注册和驱动程序源代码。

4、平台文件配置的修改

平台配置文件包括源代码配置文件和操作系统映像配置文件。源代码配置文件主要告诉构建工具需要使用的路径,包括Dirs文件、源文件和Makefile文件。操作系统映像配置文件主要用于为Makeimag工具生成操作系统映像,包括。围兜,注册,dat,db和其他文件。因此,在BSP迁移过程中,需要对这些平台配置文件进行适当的修改和更改。

5、移植时需要注意的特殊点

许多嵌入式开发实践证明,BSP移植是一个复杂而繁琐的过程。由于不同版本WinCE中BSP包的组织结构不同,很多链接库找不到或者这些库已经被替换或删除。唯一的办法就是根据错误提示耐心定位修改。

比如在移植Bootloader的时候,由于Bootloader的下载、刻录、启动镜像过程都会涉及到内存地址,所以在处理各种入口地址的时候,尤其是处理地址冲突的时候,需要避免出错或者内存超范围。另外,在移植OAL时,需要特别注意startup.s和OEMInitDebugSerial函数,因为它们主要是初始化硬件和串口、系统运行和驱动调试的基础。如果硬件配置和调试串口发生了变化,需要进行相应的修改。