问题现象:系统刚上电是有五个任务进行运行的且运行正常,但是运行了一段时间低优先级的任务不运行了,只有两个高优先级的任务进行切换,
;可疑现象(我猜测的原因),运行到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(); // 退出临界区
}
|