OpenEdv-开源电子网

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

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

[复制链接]

13

主题

66

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2021-1-9
在线时间
41 小时
发表于 2022-11-15 19:11:07 | 显示全部楼层 |阅读模式
140金钱
对于不是新创建的队列进行复位,队列里保存了数据,入队阻塞列表和出队阻塞列表下都挂有任务且不止一个的情况下,是如何复位的?让我疑惑的是如果入队阻塞列表里有多个任务被阻塞,我要复位队列应该循环把入队阻塞列表里的所有删除才对,但是官方源码只删除了一个,这是为什么呢?我把复位队列中最主要的函数贴到下面,希望大佬给答疑下,不胜感激!!!
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-15 20:23:59 | 显示全部楼层
补充一下,帖子里说的入队阻塞列表就是任务发送等待列表即xTasksWaitingToSend,出队阻塞列表就是任务接收等待列表即xTasksWaitingToReceive
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2022-11-16 00:10:56 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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