- UID
- 1023166
- 性别
- 男
- 来自
- 燕山大学
|
Windows CE OAL层的结构与开发(2)
①创建中断标识符。下面代码节选自SAMSUNG2410的oalintr.h。中断映射表通常位于\Platform\\INC。 #define SYSINTR USB (SYSlNTR FIRMWARE+11) #define SYSINTR USBD (SYSlNTR_FIRMWARE+12) ② 创建并注册ISR。ISR的主要任务是返回中断标识符。ISR代码通常位于\Platform\\KERNEL \HAL下。 下面代码节选自SAMSUNG2410的armint.c。 if(IntPendVal==INTSRC_ADC){ s2410INT.>rlNTSUBMSKl=BIT_SUB_TC; s2410INT_>rINTMSK |=BIT_ADC; s2410INT_>rSRCPND |=BIT_ADC; s2410INT_>rINTPND =BIT_ADC; return(SYSINTR_TOUCH); } 在中断处理中,还有三个函数也起着至关重要的作用。它是OEMInterruptEnable()、OEMInterruptDisable()和 OEMInterruptDone()。 ◇OEMInterruptEnable()用于执行允许设备产生中断的硬件操作; ◇OEMInterruptDisable()禁止设备发出中断申请; ◇OEMInterruptDone()中断处理结束。 3.2 以太网口调试函数 以太网口调试函数与串口调试函数相比,具有更快的速度。 ◇OEMEthInit 初始化以太网调试口; ◇OEMEthEnableInts开以太网适配器中断; ◇OEMEthDisableInts关以太网适配器中断; ◇OEMEthISR 以太网适配器中断服务例程; ◇OEMEthGetFrame从以太网调试口收数据; ◇OEMEthSendFrame从以太网调试口发数据; ◇OEMEthQueryClientlnfo获取平台相关信息; ◇OEMEthGetSecs 返回从某一特定时间开始的计时值。本函数用于处理超时。 3.3 KITL KITL全称为Kernel Independent TransportLayer。它的主要用途是提供更方便的调试手段,如图4所示。KITL出现在Windows CE.net之后,把软件传输协议与硬件传输层隔离开。KITL使得开发者不必了解硬件传输层如何与软件协议层接口。 以下是应该在OEMInit函数中加入的KITL初始化代码。 ①初始化所有PCI桥和设备,枚举它们并且给它们分配资源,然后使能,使他们能正常工作。注:此条适于有KITL网络接口卡(NIC)和NIC桥的情况。 ② 对相关总线进行初始化,使得CPU能够正确识别NIC。 ③通过调用KitlInit函数来初始化KITL。这部分代码可参照其它平台,代码文件为Halkitl.c。 ④执行0EMKitlInit函数,进行相关的硬件初始化工作。搜索是否存在KITL 网口、串口或并口连接。 ⑤执行完OEMKitlInit后,把Kitl.1ib和Kitleth.1ib包含入平台资源文件\\Kernel\Buildexe\Kernkitl,以便把KITL打包进内核。有关KITL的其它函数请参考微软MSDN。
3.4 OEMIOControl OEMIOContr01在OAL层是一个非常重要的函数,应用程序是通过调用KernelIoContrOI来调用OEMl0Control的。内核对许多硬件平台信息的获得都要通过对它的调用来实现。此外,0EMl0Contr0I还是用户模式应用代码到内核模式OAL代码之间的转换入口。这就是说,用在用户模式下通过调用0EMl0Control可以获得内核模式的权力。0EMIOControl函数原型如下: BOOL OEMIoControl(......) {switch(dwloControlCode) {caseIOCTL_HAL_SET_DEVICE_INFO: case10CTL_HAL_REBOOT: …… default: return FALSE; } return TRUE: } 硬件资源利用和调试手段的加强大大丰富了OAL的功能,但是嵌入式系统通常会面临的功耗问题和由于网络功能的日益普及而带来的安全性问题并没有涉及到。 4 完整OAL 完整OAL是指在加强OAL的基础上扩充了功耗和安全性验证的OAL。所以这一阶段的主要工作集中在电源管理与模块认证两部分。 4.1 电源管理 OAL层的电源管理与驱动程序的电源管理颇为不同。一种设备驱动程序仅负责某种特定的设备,如果可能,则把这种设备置为省电模式,当形势需要时再把设备置为满载荷模式。OAL层的电源管理则是负责整个系统功耗管理。例如,调度器在下一个25ms没有线程要运行时,系统将被置为省电模式。 电源管理函数响应关闭系统和使系统空闲的系统调用。这些系统调用可能是软触发也可能是硬触发。以下两个函数是须在OAL层中实现的电源管理函数: ◇0EMIdle一一把设备置为空闲状态,此时系统处于低功耗状态; ◇0EMPoweroff一一把设备置为断电状态; ◇OEMPowerOff和OEMIdle的程序代码可在如下目录中参照例程%_WINCER00T%\Platform\\Kerlael \Hal。 4.2 模块认证 自从Windows CE 3.0以来,在RAM中加载和运行模块前,内核可以对其进行授权核查。对于在ROM中运行的模块则不需要此过程。模块认证实际上是在被加载的模块后添加一数字签名,只有当系统用公开密钥验证数字签名通过后,该模块才可以被加载到RAM中运行。这样系统可以阻止或限制一些模块的运行,达到系统安全的目的。 要达到以上目的须完成以下两个函数: ◇OEMCertifyModuleInit,用于初始化验证过程,每验 证一个模块调用一次; ◇OEMCertifyM0dule,用于验证数字签名。 为了支持这两个函数,在OEMInit函数中须分配两个全局变量pOEMLoadInit和p0EMLoadModule,用来存放这两个函数的地址。 结语 Windows CE的OAL层是一个复杂的函数集。它的复杂性不但体现在包含函数数目繁多,而且体现在很多函数的硬件相关性非常大。本文并没有详细讲解每个OAL层函数,而是就一些通常会遇到的OAL层函数进行层层划分;在说明OAL层的功能和结构的同时,提出开发OAL的一种方法和思路。 |
|