X平台系统时钟中断的处理工作 系统时钟由InitClock函数负责初始化工作一般是在OEMInit函数中调用当发生中断时ISR首先用下列语句累计计数 CurMSec += SYSTEM_TICK_MS; /////SYSTEM_TICK_MS = 然后根据下列语句判断应该返回什么值 if ((int) (dwReschedTime – CurMSec) >= ) return SYSINTR_RESCHED; ///重新调度 else return SYSINTR_NOP; ///不再执行任何操作 上述代码中全局变量dwReschedTime在schedulec中定义也就是由内核的调度模块决定在何时开始重新调度线程CurMSec累计了从WindowsCE启动到当前总共产生了多少个system tick实现系统时钟后还要实现OEMIdle函数当没有线程准备运行时OEMIdle被调用OEMIdle函数将CPU置于空闲模式但在空闲模式下仍然要累计系统时钟 三I/O控制代码 I/O控制代码作用 应用软件或者驱动程序可以调用KernelIoControl函数与OAL层通信而KernelIoControl在内部调用OEMIoControl函数OEMIoControl是一个OAL APIOEM可以在OEMIoControl中编写自己的I/O控制代码实现一些功能或者说与应用软件通信I/O控制代码常用的例子如重启计算机得到系统信息设置RTC得到设备ID等还有一些系统程序使用的特殊的I/O控制代码在这里说明一下我经过实验证实CE提供的得到设备ID方法并非有效 编写自己的I/O控制代码步骤 ) 在pkfuncsh或者新编写一个h文件中按如下格式定义 #define IOCTL_MY_CONTROL CTL_CODE(FILE_DEVICE_HAL METHOD_NEITHER FILE_ANY_ACCESS) ) 在oemioctlc中修改OEMIoControl函数添加如下代码 case IOCTL_MY_CONTROL: ) 在应用程序中调用KernelIoControl函数具体参数参见帮助文档 四结束语 OAL所有接口函数和全局变量说明请参见标题为Supported OAL APIs的帮助文档以前的文章《加密Windows CE系统》里介绍的 OEMLoadInit_t pOEMLoadInit 和 OEMLoadModule_t pOEMLoadModule 就是OAL暴露的用于创建可信任环境的全局变量我们编写好了函数后就可以把函数地址赋给这两个变量OAL的确很复杂当实际需要时我们才会具体研究某一部分因为带着问题研究是最有效率的希望这两篇文章能够抛砖引玉让更熟悉OAL的开发者能够公开自己的研究成果和大家分享 [] [] [] |