这里是用链表实现的队列,主要注意一点,很难发现的隐形错误:

 

    // 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);    
        }    
    }