关于Small RTOS51的系统时间片分配程序
由于Small RTOS51的系统时间片分配程序为OSTimeTick(),定时中断中调用OSTimeTick()这个函数控制时钟节拍 ,OSWait(K_TMO,5)这个
延时函数中,宏定义的临界区OS_ENTER_CRITICAL()关闭了中断,时钟节拍好像就无法运行了。while (OSWaitTick[OSTaskID] != 0) 一直运行退出不了。
可以给解释下吗?
uint8 OSWait(uint8 typ, uint8 ticks)
{
OSWaitTick[OSTaskID] = ticks; /* 设置超时时间 */
/* 可以优化寄存器的使用 */
switch(typ)
{
case K_SIG: /* 等待信号,即挂起自己 */
OSWaitTick[OSTaskID] = 0; /* 没有超时处理 */
OSClearSignal(OSTaskID); /* 任务进入等待状态 */
OSSched(); /* 运行下一个任务 */
return SIG_EVENT;
case K_TMO: /* 等待超时,即延时一段时间 */
OS_ENTER_CRITICAL();
while (OSWaitTick[OSTaskID] != 0) /* 判断超时时间是否到 */
{
OSClearSignal(OSTaskID); /* 任务进入等待状态 */
OSSched(); /* 运行下一个任务 */
}
OS_EXIT_CRITICAL();
return TMO_EVENT;
case (K_TMO | K_SIG): /* 等待信号(挂起自己)直到超时 */
/* 别的任务或中断可以恢复它 */
OS_ENTER_CRITICAL();
if (OSWaitTick[OSTaskID] == 0) /* 判断超时时间是否到 */
{
return TMO_EVENT;
}
OSClearSignal(OSTaskID); /* 任务进入等待状态 */
OS_EXIT_CRITICAL();
OSSched(); /* 运行下一个任务 */
if (OSWaitTick[OSTaskID] != 0)
{
OSWaitTick[OSTaskID] = 0;
return SIG_EVENT;
}
return TMO_EVENT;
default:
OSWaitTick[OSTaskID] = 0;
return NOT_OK;
}
}
不胜感激~~