1. 系统时钟(system tick)概念
系统时钟是内核需要的唯一中断(IRQ0),系统时钟每毫秒产生一个中断,当发生中断时内核在ISR中累计,到1000的倍数就是过了一秒钟。在处理系统时钟的ISR中不仅要累计计数,还要决定是否通知内核开始重新调度当前所有的线程。要实现一个OAL,系统时钟是第一个必须做的事。
2. 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置于空闲模式,但在空闲模式下仍然要累计系统时钟。
-------以上资料来源--
[/url]-----
在[url=http://www.cnemb.com/forum/read.php?tid=23044] 该贴LZ说是OEMIdle函数的影响,导致时钟时快时慢,但现在不知道究竟是什么影响了, 继续研究