OpenEdv-开源电子网

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

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

[复制链接]

13

主题

66

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2021-1-9
在线时间
41 小时
发表于 2022-11-11 21:16:55 | 显示全部楼层 |阅读模式
1金钱
对于不是新创建的队列进行复位,队列里保存了数据,入队阻塞列表和出队阻塞列表下都挂有任务且不止一个的情况下,是如何复位的?让我疑惑的是如果入队阻塞列表里有多个任务被阻塞,我要复位队列应该循环把入队阻塞列表里的所有删除才对,但是官方源码只删除了一个,这是为什么呢?我把复位队列中最主要的函数贴到下面,希望大佬给答疑下,不胜感激!!!
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-11 21:18:32 | 显示全部楼层
顺便反映一下,原子官方能不出个像贴吧一样的移动端app
回复

使用道具 举报

13

主题

66

帖子

0

精华

新手上路

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

使用道具 举报

13

主题

66

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2021-1-9
在线时间
41 小时
 楼主| 发表于 2022-11-12 12:29:13 | 显示全部楼层
顶一顶,有没有大佬知道这是为啥
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8207
金钱
8207
注册时间
2020-5-11
在线时间
3702 小时
发表于 2022-11-14 09:35:12 | 显示全部楼层
本帖最后由 LcwSwust 于 2022-11-14 09:36 编辑

我表示看不太懂代码,楼主从哪里看出“只删除了一个”的?
根据经验,以循环队列为例,队列有头指针、尾指针,写入一个数据就将尾指针向后移(计数加一),读一个数据就将头指针往后移(计数减一),
若要清空,就让头指针和尾指针指向同一个地方(计数清零),而不需要一个一个的去读数据。
专治疑难杂症
回复

使用道具 举报

13

主题

66

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2021-1-9
在线时间
41 小时
 楼主| 发表于 2022-11-15 19:14:11 | 显示全部楼层
LcwSwust 发表于 2022-11-14 09:35
我表示看不太懂代码,楼主从哪里看出“只删除了一个”的?
根据经验,以循环队列为例,队列有头指针、尾指 ...

从这个函数看到的xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ,你可以随便打开一个工程,然后分析初始化代码
回复

使用道具 举报

13

主题

66

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2021-1-9
在线时间
41 小时
 楼主| 发表于 2022-11-15 19:25:33 | 显示全部楼层
LcwSwust 发表于 2022-11-14 09:35
我表示看不太懂代码,楼主从哪里看出“只删除了一个”的?
根据经验,以循环队列为例,队列有头指针、尾指 ...

这个复位不只要清空队列缓冲区的数据,还要把队列里的两个列表清空吧,补充以下,我帖子里说的入队阻塞列表就是任务发送等待列表即xTasksWaitingToSend,出队阻塞列表就是任务接收等待列表即xTasksWaitingToReceive
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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