WinCE6.0 OAL的特点

     WinCE6.0的OAL跟WinCE5.0中的有较大差别。了解这些差别,对我们移植OAL部分很有帮助。本文将简要介绍WinCE6.0 OAL的特点。

     WinCE5.0将内核、OAL和KITL链接成一个内核可执行文件NK.exe。而WinCE6.0将这三者分开,分别对应Kernel.dll、OAL.exe和KITL.dll。显而易见,这样做最大的好处是可以单独升级这三者中的任何一个,而先前的结构则是牵一发而动全身的。WinCE5.0的OAL结构如图1所示: 

                            
                    图1

WinCE6.0的OAL结构如图2所示: 

               图2
      对比图1和图2,可以看到CE6.0的OAL在功能上和CE5.0的基本一致,主要包括初始化、中断管理和IOCTL等。在图2中增加了NKStub.lib、NKGLOBAL和OEMGLOBAL等内容。这对于WinCE6.0是至关重要的。在CE5.0中,由于内核、OAL和KITL最终链接到一个可执行程序中,所以可以直接相互调用彼此的函数。这看起来很方便,但存在安全隐患,甚至在更新内核代码的时候会影响到OAL的执行。Kernel、OAL和KITL相互独立,则消除了这个安全隐患。现在,它们之间的通讯是通过包涵函数指针和变量值的全局结构变量来实现的。每个模块编译一个函数指针列表以提供给其他模块使用,而列表中没有的函数将不能被别的模块调用。内核模块导出列表NKGLOBAL,主要包括虚拟内存操作、注册表访问和字符串处理等一些内核API以及共享的全局变量。OAL只能调用该列表中包括的内核API。为了方便OAL代码的移植,微软将函数指针列表封装到NKStub.lib中。所以,我们在移植OAL代码时没有必要通过结构中的函数指针去调用内核API,OAL代码保持原来的函数调用方式。简单看一下NKStub.c的代码实现,下面是部分代码:

       BOOL INTERRUPTS_ENABLE (BOOL fEnable)

{

    return g_pNKGlobal->pfnINT_ENABLE (fEnable);

}

       可以看到,OAL中调用相应的内核API时,NKStub将执行对应的结构中的函数指针。所以在编译OAL时,添加NKStub.lib后就可以跟以前一样使用这些内核函数。当然NKStub也包括了KITL中的相应函数列表,所以OAL也能使用KITL中的函数。

       OAL导出了列表OEMGLOBAL,其中包括了OAL函数指针和全局变量。其中有很多函数指针是必须的,如果缺少,系统将不能正常工作。而另外有些函数指针则是可选的。具体内容可查看PB帮助的相应部分。OEMGLOBAL的定义在文件:C:\WINCE600\PRIVATE\WINCEOS\COREOS\NK\OEMMAIN\oemglobal.c中。

       总结一下,CE6.0的OAL从内核中独立出来,这样方便OAL的单独升级,也提高了安全性。由于内核、OAL和KITL相互独立,所以引入了NKGLOBAL和OEMGLOBAL这两个结构以支持模块间的函数调用。为了方便代码的移植,CE6.0提供了NKStub.lib和OEMStub.lib,他们做了从函数指针到函数的转换工作。所以,在移植BSP时,原来的代码可保持不变。

到这里,我们已经知道了WinCE6.0的OAL的特点。实际移植时,还需要注意OAL的目录组织。这里将5.0和6.0 OAL部分的目录组织做一个对比。


CE5.0 OAL目录组织


对应文件


%_WINCEROOT%\platform\BSPNAME\src\kernel\oal


oal.lib


%_WINCEROOT%\platform\BSPNAME\src\kernel\kern


kern.exe


%_WINCEROOT%\platform\BSPNAME\src\kernel\kernkitl


kernkitl.exe


%_WINCEROOT%\platform\BSPNAME\src\kernel\kernkitlprof


kernkitlprof.exe


CE6.0 OAL目录组织


Builds


%_WINCEROOT%\platform\BSPNAME\src\oal\oallib


oal.lib


%_WINCEROOT%\platform\BSPNAME\src\oal\oalexe


oal.exe


%_WINCEROOT%\platform\BSPNAME\src\kitl


kitl.dll

其中,6.0的OALLIB对应5.0的OAL,OALEXE对应Kern,KITL对应Kernkitl。而5.0的kernkitlprof在6.0中一般放在oallib的目录下。在移植BSP时可参照该对应关系进行目录组织。

       本文从功能结构和目录组织上介绍了WinCE6.0 OAL的特点,在移植BSP时可作参考。有关OAL移植的具体实现,后文将详细介绍。另外,文中有不贴切的地方欢迎您指正。

时间: 2024-09-25 02:08:37

WinCE6.0 OAL的特点的相关文章

S3C2410下WinCE6.0的启动过程详解

通过前两篇文章的介绍,我们已经知道NBOOT用来引导EBOOT,继而EBOOT加载并引导WinCE操作系统(NK).那么,WinCE6.0的启动过程又是怎样的呢?本文基于S3C2410的平台做一个详细的分析.需要说明的是,WinCE6.0的整个启动过程对于同一类型的MCU来说大同小异,如S3C2410和PXA270同属ARM平台的MCU,所以他们的启动过程是类似的,可以说唯一的不同就在OAL处,而WinCE操作系统的启动正是从OAL开始的.      OAL(OEM Adaptation Lay

WinCE6.0的EBOOT概要

     为一个新的硬件设备定制WinCE6.0操作系统,一般需要完成以下几个主要步骤: 1.       针对特定的硬件设备创建板级支持包(Board Support Package缩写为BSP),BSP必须包括BOOTLOADER.OEM适配层(OEM Adaptation Layer缩写为OAL)和一些必要的驱动. 2.       利用创建的BSP,定制一个系统设计(OS Design).即通过VS2005创建一个Platform Builder的工程.该工程可编译产生最终的运行时映像文

WinCE6.0 KITL概要

KITL(Kernel Independent Transport Layer)即内核独立传输层,它为我们提供了一种调试WinCE的简便方法.KITL将通信服务协议和用于通信的硬件分离开来.所以我们在创建硬件传输层时就省去很多麻烦,否则我们自己必须实现与设备进行数据交互的协议.KITL工作在硬件传输层之上,因此,它无须关心用于通信的具体硬件,我们可以用USB.Serial或者Ethernet作为KITL的调试通道.具体选择哪一个,由硬件平台和软件资源决定.有些设备没有Ethernet和Seria

S3C2410 && WinCE6.0的中断处理分析

     S3C2410的内核是ARM920T,所以,这里先介绍一下ARM920T的异常.ARM920T中有一个当前程序状态寄存器(CPSR),其中BIT6和BIT7分别控制FIQ和IRQ的使能与否.大家经常说的开中断和关中断,就是指的设置这两个BIT.        ARM体系的异常中断如下图所示:                        可以看到,ARM920T中一共有7中异常模式,如果同一时刻有多个异常发生,系统则通过优先级顺序来决定处理其中的哪一个异常.他们之间的优先级顺序从高到低

图标-WinCE6.0电池电量显示的不正确,求有经验的牛人指教

问题描述 WinCE6.0电池电量显示的不正确,求有经验的牛人指教 我用的WinCE6.0系统,现在电池显示这一块有一些问题,我在"控制面板"里看电池信息,在"电池"这个标签下显示剩余电量100%,在"方案"标签下显示"电池电源".可是为什么我的WinCE桌面右下角的电源信息图标是个"小插头",而不是一个小电池图标呢. 我的电池电量检测芯片是DS2782,电池驱动的PDD层我看了也没多大问题,就是这里有点不

Windows XP下安装WinCE6.0开发环境

Windows下如何编译WinCE6.0及开发应用程序,下面介绍(安装之前必须保证C盘有足够的空间!20g左右!主要是因为在安装程序在安装过程中要解压): 在Visual Studio 2005之前,开发WinCE嵌入式程序需要安装Platform Builder,不过Platform Builder已经作为一个插件集成在Visual Studio 2005里了. 1.下载并安装Visual Studio 2005(Visual Studio 2008只支持开发应用程序,不能用来定制WinCE内

wince6.0模拟器的问题

问题描述 wince6.0模拟器的问题 奇怪模拟器ip地址怎么会是55段的呢,我的电脑是1段的,我试过把模拟器改成1段,但是同步连去就会断开了,如果使用55段的时候,又访问不了我电脑上的数据库,有什么配置让模拟器连接的时候使用的就1段的呢或者说跟电脑ip段相同, 下面是模拟器ip地址 下面是我电脑的ip地址(window2003sp2) 解决方案 这个可以自己设置的,检查下配置文件. 解决方案二: WinCE 的模拟器,功能是有限的. 模拟器运行在 PC 上,可以使用 PC 的网络,但这只是一个

c# wince6.0 可以部署到真机上,但是不能调试,设置的断点处不停。

问题描述 c# wince6.0 可以部署到真机上,但是不能调试,设置的断点处不停. wince5.0 可以部署到真机上,正常运行调试,但是换wince6.0 就不能调试了,其它都很正常,不知道什么原因? 不知道是软件安装问题还是同步软件的问题?

wince6 0-想要在wince6.0下添加一个软关机的功能,就像xp一样

问题描述 想要在wince6.0下添加一个软关机的功能,就像xp一样 请教诸位大神,小弟用vs2005编译一个intel_X86芯片上的wince6.0系统,本身系统只有一个suspend功能,我就想添加一个关机的功能,今天看了一点电源管理方面的知识,想用直接调用setsystempowerstate()函数,但是没啥效果,求各位大神给个思路或步骤啥地,明天争取做出来,跪谢啊...... 解决方案 wince中实现关机功能 http://blog.csdn.net/ymzhou117/artic