WEB开发网
开发学院软件开发VC OAL点点滴滴(二) 阅读

OAL点点滴滴(二)

 2007-03-18 21:26:03 来源:WEB开发网   
核心提示: 二、实现系统时钟系统时钟(system tick)概念系统时钟是内核需要的唯一中断(IRQ0),系统时钟每毫秒产生一个中断,OAL点点滴滴(二)(3),当发生中断时内核在ISR中累计,到1000的倍数就是过了一秒钟,在论坛上交流会更方便些,其它网友也可以回答参与,在处理系统时钟的ISR中不

二、实现系统时钟

系统时钟(system tick)概念

系统时钟是内核需要的唯一中断(IRQ0),系统时钟每毫秒产生一个中断,当发生中断时内核在ISR中累计,到1000的倍数就是过了一秒钟。在处理系统时钟的ISR中不仅要累计计数,还要决定是否通知内核开始重新调度当前所有的线程。要实现一个OAL,系统时钟是第一个必须做的事。

X86平台系统时钟中断的处理工作

系统时钟由InitClock函数负责初始化工作,一般是在OEMInit函数中调用。当发生中断时,ISR首先用下列语句累计计数:   CurMSec += SYSTEM_TICK_MS; /////SYSTEM_TICK_MS = 1然后根据下列语句判断应该返回什么值:   if ((int) (dwReschedTime – CurMSec) >= 0)
     return SYSINTR_RESCHED; ///重新调度
   else
     return SYSINTR_NOP; ///不再执行任何操作

上述代码中全局变量dwReschedTime在schedule.c中定义,也就是由内核的调度模块决定在何时开始重新调度线程。CurMSec累计了从WindowsCE启动到当前总共产生了多少个system tick。实现系统时钟后还要实现OEMIdle函数,当没有线程准备运行时OEMIdle被调用,OEMIdle函数将CPU置于空闲模式,但在空闲模式下仍然要累计系统时钟。

三、I/O控制代码

I/O控制代码作用

应用软件或者驱动程序可以调用KernelIoControl函数与OAL层通信,而KernelIoControl在内部调用OEMIoControl函数。OEMIoControl是一个OAL API,OEM可以在OEMIoControl中编写自己的I/O控制代码实现一些功能,或者说与应用软件通信。I/O控制代码常用的例子如重启计算机、得到系统信息、设置RTC、得到设备ID等。还有一些系统程序使用的特殊的I/O控制代码。在这里说明一下,我经过实验证实CE提供的得到设备ID方法并非有效。

编写自己的I/O控制代码步骤

在pkfuncs.h或者新编写一个.h文件中按如下格式定义:

#define IOCTL_MY_CONTROL CTL_CODE(FILE_DEVICE_HAL, 3000, METHOD_NEITHER, FILE_ANY_ACCESS)

在oemioctl.c中修改OEMIoControl函数,添加如下代码:

case IOCTL_MY_CONTROL:

......

在应用程序中调用KernelIoControl函数,具体参数参见帮助文档。

结束语

OAL所有接口函数和全局变量说明请参见标题为“Supported OAL APIs”的帮助文档。以前的文章《加密Windows CE系统》里介绍的 OEMLoadInit_t pOEMLoadInit 和 OEMLoadModule_t pOEMLoadModule 就是OAL暴露的用于创建可信任环境的全局变量,我们编写好了函数后就可以把函数地址赋给这两个变量。OAL的确很复杂,当实际需要时我们才会具体研究某一部分,因为带着问题研究是最有效率的。希望这两篇文章能够抛砖引玉,让更熟悉OAL的开发者能够公开自己的研究成果,和大家分享。

写作时间:2005-01-12

如果您有技术问题向我咨询,请登录天极网嵌入式开发论坛,本人将在此论坛回复您的问题。在论坛上交流会更方便些,其它网友也可以回答参与,弥补了我的不足。

上一页  1 2 3 

Tags:OAL 点点滴滴

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接