硬汉嵌入式论坛

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

[FreeRTOS] FREERTOS任务调度问题,低优先级任务不进行调度了

[复制链接]

2

主题

5

回帖

11

积分

新手上路

积分
11
发表于 2025-5-29 09:25:59 | 显示全部楼层 |阅读模式
问题现象:系统刚上电是有五个任务进行运行的且运行正常,但是运行了一段时间低优先级的任务不运行了,只有两个高优先级的任务进行切换,
   ;可疑现象(我猜测的原因),运行到usb那个任务的时候操作了文件系统,可能就会造成上述问题,导致usbtask和比他优先级低的任务就不运行了,而比usbtask任务高的任务还是正常运行,求大佬相救,
然后我也做了一些尝试比如打印任务栈大小之类的,
[2025-05-29 09:25:16.214]: SuperJob_task          R        7        100        6
UartJob_task           R        6        846        7
USBJob_task            R        5        845        8
LcdJob2_task           R        4        92        5
LcdJob_task            R        3        760        4
IDLE                   R        0        116        2
Tmr Svc                S        31        234        3   
下面是我的任务创建函数,

[C] 纯文本查看 复制代码
#define START_TASK_PRIO 2       // 任务优先级
#define START_STK_SIZE 256      // 任务堆栈大小
TaskHandle_t StartTask_Handler; // 任务句柄

#define LcdJob_PRIO 3       // 任务优先级
#define LcdJob_STK_SIZE 1400  // 任务堆栈大小
TaskHandle_t LcdJob_Handler; // 任务句柄

#define LcdJob2_PRIO 4        // 任务优先级
#define LcdJob2_STK_SIZE 120  // 任务堆栈大小
TaskHandle_t LcdJob2_Handler; // 任务句柄

#define SuperJob_PRIO 7        // 任务优先级
#define SuperJob_STK_SIZE 256  // 任务堆栈大小
TaskHandle_t SuperJob_Handler; // 任务句柄

#define UartJob_PRIO 6       // 任务优先级
#define UartJob_SIZE 1000      // 任务堆栈大小
TaskHandle_t UartJob_Handler; // 任务句柄

#define USBJob_PRIO 5        // 任务优先级
#define USBJob_STK_SIZE 1000  // 任务堆栈大小
TaskHandle_t USBJob_Handler; // 任务句柄   void start_task(void *p_arg)
{
  taskENTER_CRITICAL(); // 进入临界区
  // 创建 LcdJob
  xTaskCreate((TaskFunction_t)LcdJob_task,
              (const char *)"LcdJob_task",
              (uint16_t)LcdJob_STK_SIZE,
              (void *)NULL,
              (UBaseType_t)LcdJob_PRIO,
              (TaskHandle_t *)&LcdJob_Handler);

  xTaskCreate((TaskFunction_t)LcdJob2_task,
              (const char *)"LcdJob2_task",
              (uint16_t)LcdJob2_STK_SIZE,
              (void *)NULL,
              (UBaseType_t)LcdJob2_PRIO,
              (TaskHandle_t *)&LcdJob2_Handler);

  // 创建 SuperJob
  xTaskCreate((TaskFunction_t)SuperJob_task,
              (const char *)"SuperJob_task",
              (uint16_t)SuperJob_STK_SIZE,
              (void *)NULL,
              (UBaseType_t)SuperJob_PRIO,
              (TaskHandle_t *)&SuperJob_Handler);

  // USBjob
  xTaskCreate((TaskFunction_t)UartJob_task,
              (const char *)"UartJob_task",
              (uint16_t)UartJob_SIZE,
              (void *)NULL,
              (UBaseType_t)UartJob_PRIO,
              (TaskHandle_t *)&UartJob_Handler);
  xTaskCreate((TaskFunction_t)USBJob_task,
              (const char *)"USBJob_task",
              (uint16_t)USBJob_STK_SIZE,
              (void *)NULL,
              (UBaseType_t)USBJob_PRIO,
              (TaskHandle_t *)&USBJob_Handler);
 // xTaskCreate(TaskMonitor, "Monitor", 128, NULL, tskIDLE_PRIORITY, NULL);

  // Uartjob
  vTaskDelete(StartTask_Handler); // 删除开始任务
  taskEXIT_CRITICAL();            // 退出临界区
}


回复

使用道具 举报

6

主题

73

回帖

91

积分

初级会员

积分
91
发表于 2025-5-30 10:49:10 | 显示全部楼层
在使用FreeRTOS 的过程中通常会在一个任务函数中使用延时函数对这个任务延时,当执行延时函数的时候就会进行任务切换,并且此任务就会进入阻塞态,直到延时完成,任务重新进入就绪态。
在FreeRTOS 中延时函数有相对模式和绝对模式,其中函数vTaskDelay()是相对模式(相对延时函数),函数vTaskDelayUntil()是绝对模式(绝对延时函数)。
在线程的主while中 ,加上vTaskDelay() ,里边的时间看情况定
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 3 天前 | 显示全部楼层
参考https://blog.csdn.net/loveliu928/article/details/105588583   我找到原因了 ,应该是我的usb host问题,导致低优先级任务饿死了,我修改USB库函数后暂时没有出现问题了,已经一个多礼拜没出问题了,感谢各位回复
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 22:50 , Processed in 0.401507 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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