硬汉嵌入式论坛

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

[FreeRTOS] freeRTOS最高优先级任务R状态不跑疑问

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2024-9-7 17:09:08 | 显示全部楼层 |阅读模式



//  创建队列,指定队列长度和每个队列项的大小
    queueHandle_key = xQueueCreate(15, sizeof(uint8_t));

// 创建一个任务
    xTaskCreate(task_key, (const char *)"key", 128, NULL, 5, NULL);

/* 任务函数,用于处理key通讯任务*/
static void task_key(void *arg)
{
    uint8_t value = 0;
    while (1)
    {
        // 等待队列中有数据可用
        if (xQueueReceive(queueHandle_key, &value, portMAX_DELAY) == pdPASS)
        {
        
    }
}
/*在中断函数里*/
void GPIOM_Handler(void)
{
  BaseType_t xHigherPriorityTaskWoken = pdFALSE;
  uint8_t key_value = 1;

  xQueueSendFromISR(queueHandle_key, &key_value, &xHigherPriorityTaskWoken);
  if (xHigherPriorityTaskWoken == pdTRUE)
  {
      portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
  }
}
遇到这样一个问题,我的最高级别任务是task_key,我在其它低级任务里用xQueueSend(queueHandle_key, &key_value, 0);传递数据给队列,在中断里用xQueueSendFromISR(queueHandle_key, &key_value, &xHigherPriorityTaskWoken);传递数据给队列这样,每当队列有数据,task_key函数就会跑,正常情况下是正常的。但是,我的这个中断函数是编码器,在疯狂转动编码器的情况下,会出现,队列满了的情况,而key任务的状态是R,但是完全没有跑(把portMAX_DELAY改成100,然后串口输出也没反应),而其它任务全部正常。剩余栈:60。也不是栈不够。优化等级也改成-0,也是不行。然后我不在中断里用xQueueSendFromISR函数,而是搞个全局变量,在其它任务里xQueueSend就不会出现这种情况。实在是不知道什么原因,所以想请教一下。。。拜托有遇到这种情况的大佬解答一二。

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2024-9-10 08:55:02 | 显示全部楼层
1、FreeRTOS没法统计历史最大栈使用情况,你要加大下任务栈
2、然后xQueueSendFromISR返回值加上,这个要判断下。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2024-9-10 23:12:04 | 显示全部楼层
eric2013 发表于 2024-9-10 08:55
1、FreeRTOS没法统计历史最大栈使用情况,你要加大下任务栈
2、然后xQueueSendFromISR返回值加上,这个要 ...

有试过加大KEY的任务栈,也是一样的结果。至于xQueueSendFromISR返回值,有打印出来过,显示失败,因为队列满了,我做过一个处理,如果xQueueSendFromISR失败,就从队列取出一个出来,然后再xQueueSendFromISR就成功一次,然后再xQueueSendFromISR就又是队列满导致的错误。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2024-9-10 23:12:51 | 显示全部楼层
eric2013 发表于 2024-9-10 08:55
1、FreeRTOS没法统计历史最大栈使用情况,你要加大下任务栈
2、然后xQueueSendFromISR返回值加上,这个要 ...

队列的长度也试过加大,还是会出现这种现象
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2024-9-11 01:09:20 | 显示全部楼层
二三五 发表于 2024-9-10 23:12
队列的长度也试过加大,还是会出现这种现象

满了的话,说明你的任务处理不及时,得想办法处理下,解决后看看是否还会有这种问题。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2024-9-11 19:42:51 | 显示全部楼层
eric2013 发表于 2024-9-11 01:09
满了的话,说明你的任务处理不及时,得想办法处理下,解决后看看是否还会有这种问题。

问题就是处理的这个KEY任务的优先级是最高的,而且这个key任务状态是R,但是就是不跑
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2024-9-12 07:24:23 | 显示全部楼层
二三五 发表于 2024-9-11 19:42
问题就是处理的这个KEY任务的优先级是最高的,而且这个key任务状态是R,但是就是不跑

我觉得你这个FIFO满的问题解决了,应该就可以了。

简单省事些,别用这个FIFO了,继续用全局变量,然后你这里用信号量吧,做个同步即可,这样也是一个好的解决办法。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2024-9-12 16:12:44 | 显示全部楼层
eric2013 发表于 2024-9-12 07:24
我觉得你这个FIFO满的问题解决了,应该就可以了。

简单省事些,别用这个FIFO了,继续用全局变量,然后 ...

额,是个项目,然后遇到这个问题,所以把现象写出来,问问看。项目这个问题已经用了其它方法避免了。
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-9-12 16:38:04 | 显示全部楼层
看其他几个任务是不是堆栈溢出了,溢出的话会把相邻的任务搞异常,搞几个全局变量用于统计队列发送和接收成功次数,看看能不能对得上
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2024-9-13 17:20:12 | 显示全部楼层
skyshine 发表于 2024-9-12 16:38
看其他几个任务是不是堆栈溢出了,溢出的话会把相邻的任务搞异常,搞几个全局变量用于统计队列发送和接收成 ...

其它任务也没有溢出,队列收发在key任务不跑前完全对得上
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 16:16 , Processed in 0.043107 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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