硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5020|回复: 10
收起左侧

[FreeRTOS] 消息队列等待时间问题

[复制链接]

20

主题

72

回帖

132

积分

初级会员

积分
132
发表于 2018-7-4 11:02:33 | 显示全部楼层 |阅读模式
一个最高优先级的任务A,任务本身没有延时,通过判断xQueueReceive阻塞任务,第三个参数设置成0或者设置成portMAX_DELAY,都不影响其他低优先级的任务运行,就是说立即返回和无线等待效果是一样的,为什么?我自己本来理解的是设置成无限等待且优先级最高时,就会一直卡在这里等待,但实际测试不是这样的,求解
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107220
QQ
发表于 2018-7-4 11:15:16 | 显示全部楼层
验证下你的程序模板是否有问题,将任务A直接写成while(1){}  什么都不执行,看看还有其它任务有问题不。
回复

使用道具 举报

20

主题

72

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2018-7-4 11:28:06 | 显示全部楼层
static void vTaskCan1Rec(void *pvParameters)
{
                while(1);
}

这个最高优先级的任务写成这样,其他任务照样可以运行

以前是
    while(1)
    {
                                if(xQueueReceive(xMessageBufferCan1Rec,(void *)&Can1RxData,portMAX_DELAY)==pdPASS)
                                {
                                                //处理消息
                                }
   }

xQueueReceive第三个参数无论写成什么,程序都可以正常运行

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107220
QQ
发表于 2018-7-4 11:43:04 | 显示全部楼层
502398542 发表于 2018-7-4 11:28
static void vTaskCan1Rec(void *pvParameters)
{
                while(1);

高优先级任务设置成这样,其它任务都可以正常运行的话,说明你的程序设计有问题。
static void vTaskCan1Rec(void *pvParameters)
{
                while(1);
}
回复

使用道具 举报

20

主题

72

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2018-7-4 11:53:50 | 显示全部楼层
是程序的问题,任务被挂起了,现在恢复了,现在的现象是
while(1)
    {
                                if(xQueueReceive(xMessageBufferCan1Rec,(void *)&Can1RxData,portMAX_DELAY)==pdPASS)
                                {
                                                //处理消息
                                }
   }
这样其他任务可以运行,

第三个参数写0时,其他任务不能运行,这样正常吗?和我理解的整好相反啊,写0的时候不是应该立即返回吗,是不是我对立即返回的理解有问题?
回复

使用道具 举报

20

主题

72

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2018-7-4 12:09:20 | 显示全部楼层
eric2013 发表于 2018-7-4 11:43
高优先级任务设置成这样,其它任务都可以正常运行的话,说明你的程序设计有问题。
static void vTaskCan ...

另外再问一下,定时器回调函数和其他任务相比,优先级是怎样的?是像硬件中断一样,优先级高于其他任务吗
回复

使用道具 举报

36

主题

1446

回帖

1554

积分

至尊会员

积分
1554
发表于 2018-7-4 20:26:29 | 显示全部楼层
502398542 发表于 2018-7-4 11:53
是程序的问题,任务被挂起了,现在恢复了,现在的现象是
while(1)
    {

你理解有误,设置portMAX_DELAY并不是说死等。没有消息到来,其他低优先级的任务也是可以运行的。没有消息的话,这个高优先级任务不是就绪状态,是等待状态 wait
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107220
QQ
发表于 2018-7-5 01:14:49 | 显示全部楼层
502398542 发表于 2018-7-4 11:53
是程序的问题,任务被挂起了,现在恢复了,现在的现象是
while(1)
    {

这样就正常了,设置为0后,是立即返回,相当于查询,其它任务没有执行的机会了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107220
QQ
发表于 2018-7-5 01:16:19 | 显示全部楼层
502398542 发表于 2018-7-4 12:09
另外再问一下,定时器回调函数和其他任务相比,优先级是怎样的?是像硬件中断一样,优先级高于其他任务吗

你说的定时器回调是指的FreeRTOS定时器吗,如果是的话,这个定时器也是一个专门的任务,在FreeRTOSConfig.h文件里面可以设置下优先级,详情可以学习下我们的FreeRTOS教程定时器组章节
http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

20

主题

72

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2018-7-6 09:42:30 | 显示全部楼层
sanit 发表于 2018-7-4 20:26
你理解有误,设置portMAX_DELAY并不是说死等。没有消息到来,其他低优先级的任务也是可以运行的。没有消 ...

好的,明白了,多谢
回复

使用道具 举报

20

主题

72

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2018-7-6 09:42:49 | 显示全部楼层
eric2013 发表于 2018-7-5 01:16
你说的定时器回调是指的FreeRTOS定时器吗,如果是的话,这个定时器也是一个专门的任务,在FreeRTOSConfig ...

好的,谢谢
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-21 23:14 , Processed in 0.186148 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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