硬汉嵌入式论坛

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

[Amazon FreeRTOS] portMAX_DELAY参数的阻塞问题

[复制链接]

38

主题

75

回帖

189

积分

初级会员

积分
189
发表于 2025-7-10 19:49:40 | 显示全部楼层 |阅读模式



FreeRTOS小白,有个问题没想通,

假设一个任务如下,

void vTask(void* pvParameters)
{
    unsigned char LED1;
    unsigned char LED2;
        
    while(1)
    {
          if(xQueueReceive(xQueue, &GetData, portMAX_DELAY)==pdTRUE)  //-----------1
          {
              LED_ON();  //LED点亮   -------------2
          }

         vTaskDelay(200);  //---------------3
    }
}


我的问题是:
1,1处代码,因为用了portMAX_DELAY参数,如果没接收到数据,是不是就阻塞在这里了,然后一直等待?等待的意思应该是去执行其他的任务?不是我们说的那种程序一直卡在这里吧(我自己想如果是这种也就失去了RTOS意义了,但还是想确认一下)?
2,如果1处阻塞了,是不是后面的程序,包括2和3处的代码都不会执行了?
3,如果1处阻塞了,后面的2处不执行好理解,但是3也不执行的话,有点不太理解,如果3不执行,那我设置这个任务200ms执行一次岂不失去了意义?因为1处阻塞,改变了我的代码逻辑?

我问了下AI,很多AI都说如果1处阻塞,后面的vTaskDelay(200);都不会执行了,,,


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-11 09:45:23 | 显示全部楼层
1、这个任务会在这里等待,其它任务不影响,继续执行。
2、对
3、3不会执行了,可以把你的程序修改为

         if(xQueueReceive(xQueue, &GetData, 200)==pdTRUE)  //-----------1
          {
            
          }
          else
          {

           }

200ms内u收到了消息,做个处理,没收到也做个处理。看看是不是你想要的。

回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2025-7-11 14:28:21 | 显示全部楼层
硬汉说的第三点,只有在你的freertos心跳宏,设置为1000的时候才对,要不然需要转换一下
回复

使用道具 举报

38

主题

75

回帖

189

积分

初级会员

积分
189
 楼主| 发表于 2025-7-11 16:37:04 | 显示全部楼层
eric2013 发表于 2025-7-11 09:45
1、这个任务会在这里等待,其它任务不影响,继续执行。
2、对
3、3不会执行了,可以把你的程序修改为

感谢硬汉的回复,我理解了
回复

使用道具 举报

38

主题

75

回帖

189

积分

初级会员

积分
189
 楼主| 发表于 2025-7-11 16:38:00 | 显示全部楼层
m1249394401 发表于 2025-7-11 14:28
硬汉说的第三点,只有在你的freertos心跳宏,设置为1000的时候才对,要不然需要转换一下

是的,我在config里面配置的是1000HZ,刚好1ms,所以这里直接写200是没问题的,感谢回复
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-11 21:03 , Processed in 0.041075 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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