μC/OS-II的系统时钟
μC/OS-II与大多数计算机系统一样,用硬件定时器产生一个周期为ms级的周期性中断来实现系统时钟,最小的时钟单位就是两次中断之间相间隔的时间,这个最小时钟单位叫做时钟节拍(Time Tick)。
硬件定时器以时钟节拍为周期定时地产生中断,该中断的中断服务程序叫做OSTickISR( )。中断服务程序通过调用函数OSTimeTick( )来完成系统在每个时钟节拍时需要做的工作。
void OSTickISR(void)
{
保存CPU寄存器;
调用OSIntEnter( ); //记录中断嵌套层数
if (OSIntNesting = = 1;
{
OSTCBCur->OSTCBStkPtr = SP; //保存堆栈指针
}
调用OSTimeTick( ); //节拍处理
清除中断;
开中断;
调用OSIntExit( ); //中断嵌套层数减一
恢复CPU寄存器;
中断返回;
}
这是系统时钟中断服务程序
void OSTimeTick (void)
{
……
OSTimeTickHook( );
……
OSTime++; //记录节拍数
……
if (OSRunning = = TRUE) {
ptcb = OSTCBList;
while (ptcb->OSTCBPrio != OS_IDLE_PRIO)
{
OS_ENTER_CRITICAL( );
if (ptcb->OSTCBDly != 0)
{
if (--ptcb->OSTCBDly = = 0) //任务的延时时间减一
{
if ((ptcb->OSTCBStat & OS_STAT_SUSPEND)
= = OS_STAT_RDY)
{
OSRdyGrp |= ptcb->OSTCBBitY;
OSRdyTbl[ptcb->OSTCBY]
|= ptcb->OSTCBBitX;
} else {
ptcb->OSTCBDly = 1;
}
}
}
ptcb = ptcb->OSTCBNext;
OS_EXIT_CRITICAL( );
}
}
时钟节拍服务函数
函数OSTimeTick( )的任务,就是在每个时钟节拍了解每个任务的延时状态,使其中已经到了延时时限的非挂起任务进入就绪状态。
1