语句(1),(2),(3)表明:时钟中断服务程序在每一个时钟中断在需要的情况下对任务的延迟项进行减1操作,如果任务T的定时时间间隔到期(延迟项被减为0),并且任务T没有附加的挂起操作,任务T就会进入就绪表,然而该函数却没有进一步将任务T移出资源R的等待队列,也就是说此时任务T跨了两个状态,这两个状态从本质上讲是矛盾的。虽然任务T此时处于就绪状态,但未必马上就能获得执行权,这取决于任务T的优先级。在任务T没有被调度执行之前的这段时间内,假设资源R到达了,比如一个中断服务程序调用了OSSemPost函数,会是什么情况呢?我们再来分析OSSemPost函数。
void OSSemPost(OS_EVENT *pevent)
{
OS_ENTER_CRITICAL();
if(pevent->OSEventGrp!=0x00){
OS_EventTaskRdy(pevent,(void*)0,OS_STAT_SEM);//(4)
OS_EXIT_CRITICAL();
OS_Sched();
return(OS_NO_ERR);
}
if(pevent->OSEventCnt<65535){
pevent->OSEventCnt++;
OS_EXIT_CRITICAL();
return(OS_NO_ERR);
}
OS_EXIT_CRITICAL();
return(OS_SEM_OVF);
}
}
|