这里是用链表实现的队列,主要注意一点,很难发现的隐形错误:
// 1. 如果硬实时就绪队列前面的任务硬实时任务为挂起态,即已经执行完了,那么就从就绪队列里删除这个队首TAB
if(IsEmpty(queueReadyHardTaskPtr)!=true)
{
for(i=0;i<queueReadyHardTaskPtr->Size;i++)
{
tmp=(TAB*)Front(queueReadyHardTaskPtr);
FrontAndDeQueueLink(queueReadyHardTaskPtr);
}
}
上面这个写法就是错的,遍历不完整个队列,问题在于for循环的总值这里queueReadyHardTaskPtr->Size这样写不对,因为下面删除一个头元素后,再次回到for循环,这个值也减1了,因为queueReadyHardTaskPtr->Size是跟着队列大小动态变化的,这样就造成遍历不完队列所有元素的结果。实践告诉我,这个错误很难很难发现,所以一定一定要注意!!!
正确写法应该如下:
// 1. 如果硬实时就绪队列前面的任务硬实时任务为挂起态,即已经执行完了,那么就从就绪队列里删除这个队首TAB
if(IsEmpty(queueReadyHardTaskPtr)!=true)
{
len=queueReadyHardTaskPtr->Size;//注意:这里一定只能用len,循环里就是用len作为总变量,不然出队一个就少一个,很难,就错了
for(i=0;i<len;i++)
{
tmp=(TAB*)Front(queueReadyHardTaskPtr);
FrontAndDeQueueLink(queueReadyHardTaskPtr);
}
}