OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3161|回复: 1

队列复位的时候删除入队阻塞列表中的任务为啥不是循环删除直到入队阻塞列表为空?

[复制链接]

13

主题

66

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2021-1-9
在线时间
41 小时
发表于 2022-11-13 15:57:58 | 显示全部楼层 |阅读模式
50金钱
对于不是新创建的队列进行复位,队列里保存了数据,入队阻塞列表和出队阻塞列表下都挂有任务且不止一个的情况下,是如何复位的?让我疑惑的是如果入队阻塞列表里有多个任务被阻塞,我要复位队列应该循环把入队阻塞列表里的所有删除才对,但是官方源码只删除了一个,这是为什么呢?我把复位队列中最主要的函数贴到下面,希望大佬给答疑下,不胜感激!!!
BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue )
{
Queue_t * const pxQueue = ( Queue_t * ) xQueue;

        configASSERT( pxQueue );

        taskENTER_CRITICAL();
        {
                pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize );
                pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
                pxQueue->pcWriteTo = pxQueue->pcHead;
                pxQueue->u.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( UBaseType_t ) 1U ) * pxQueue->uxItemSize );
                pxQueue->cRxLock = queueUNLOCKED;
                pxQueue->cTxLock = queueUNLOCKED;

                if( xNewQueue == pdFALSE )
                {
                        /* If there are tasks blocked waiting to read from the queue, then
                        the tasks will remain blocked as after this function exits the queue
                        will still be empty.  If there are tasks blocked waiting to write to
                        the queue, then one should be unblocked as after this function exits
                        it will be possible to write to it. */
                        if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )
                        {
                                if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )
                                {
                                        queueYIELD_IF_USING_PREEMPTION();
                                }
                                else
                                {
                                        mtCOVERAGE_TEST_MARKER();
                                }
                        }
                        else
                        {
                                mtCOVERAGE_TEST_MARKER();
                        }
                }
                else
                {
                        /* Ensure the event queues start in the correct state. */
                        vListInitialise( &( pxQueue->xTasksWaitingToSend ) );
                        vListInitialise( &( pxQueue->xTasksWaitingToReceive ) );
                }
        }
        taskEXIT_CRITICAL();

        /* A value is returned for calling semantic consistency with previous
        versions. */
        return pdPASS;
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

66

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2021-1-9
在线时间
41 小时
 楼主| 发表于 2022-11-13 15:58:32 | 显示全部楼层
主要疑惑就在判断出队列不是新创建的,然后判断入队阻塞列表是不是空那块,按照正常思维应该循环删除入队阻塞列表中的任务才对,从这个函数的上下调用关系上我也没看到循环删除的地方
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 13:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表