当前位置: 首页 > news >正文

FreeRTOS系列---程序正常,但任务无法创建

实验环境

stm32F103RCT6核心板

keil5

vscode

stm32cubemx

使用stm32cubemx

问题现场

void my_task_init(void)
{xTaskCreate(LED1_Task, "LED1_Task", configMINIMAL_STACK_SIZE, NULL, 1, NULL);xTaskCreate(LED2_Task, "LED2_Task", configMINIMAL_STACK_SIZE, NULL, 1, NULL);xTaskCreate(UART_Task, "UART_Task", configMINIMAL_STACK_SIZE, NULL, 4, NULL);xTaskCreate(UART_ReceiveTask, "UART_Receive", configMINIMAL_STACK_SIZE, NULL, 5, NULL);
}

实际创建了四个任务,但是在打印任务列表的时候,第四个任务始终没有出现;打印信息如下所示:

 尝试调整堆空间,在FreeRTOSConfig.h文件中修改

调整为10KB;然后继续打印任务列表;发现任务成功创建,并在运行中;

 

问题分析

分析任务创建不成功,可能有以下几点原因:

1、 内存不足

xTaskCreate(LED1_Task, "LED1_Task", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(LED2_Task, "LED2_Task", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(UART_Task, "UART_Task", configMINIMAL_STACK_SIZE, NULL, 4, NULL);
xTaskCreate(UART_ReceiveTask, "UART_Receive", 256, NULL, 6, NULL);

最常见的原因是FreeRTOS堆内存不足。你使用了256字节的栈空间,这可能比其他任务大,当FreeRTOS的堆内存配置不足时,任务创建会失败。

2、没有检查返回值

xTaskCreate(UART_ReceiveTask, "UART_Receive", 256, NULL, 6, NULL);veTask, "UART_Receive", 256, NULL, 6, NULL);
if (status != pdPASS) {// 任务创建失败的处理printf("Failed to create UART_ReceiveTask, error: %d\n", status);
}

3、栈空间不足

如果你的UART_ReceiveTask函数包含较复杂的本地变量或调用较深,256字节的栈可能不够用。

4、优先级设置问题

优先级6可能超出了系统配置的最大优先级范围。检查你的FreeRTOSConfig.h中的configMAX_PRIORITIES设置。

5、参数不匹配

代码中其他任务使用void *pvParameters,而UART_ReceiveTask使用void *argument。虽然这不会直接导致创建失败,但建议保持一致性:

// ... 现有代码 ...
BaseType_t status;
status = xTaskCreate(UART_ReceiveTask, "UART_Receive", 256, NULL, 6, NULL);
if (status != pdPASS) {// 任务创建失败的处理printf("Failed to create UART_ReceiveTask, error: %d\n", status);
}

6、配置问题

configMINIMAL_STACK_SIZE可能设置得较小,而UART接收任务需要更多栈空间

解决方案

  1. 增加FreeRTOS堆内存大小(在FreeRTOSConfig.h中修改configTOTAL_HEAP_SIZE)
  1. 添加任务创建失败的检查和处理
  1. 增加栈空间大小(例如从256增加到512或更多)
  1. 检查并确保优先级在合理范围内
  1. 统一任务函数参数命名
http://www.lryc.cn/news/546387.html

相关文章:

  • linux应用:errno、perror、open、fopen
  • 物联网中的气象监测设备具备顶级功能
  • 15-YOLOV8OBB损失函数详解
  • WHAT - 前端异步事件流处理场景梳理
  • 计算机网络软考
  • 安防监控/视频集中存储EasyCVR视频汇聚平台如何配置AI智能分析平台的接入?
  • 做小程序开发的安全防护全方案
  • 在Spring Boot项目中导出复杂对象到Excel文件
  • 从JDBC到数据库连接池:构建高性能Java应用的基石(中篇)
  • JavaWeb后端基础(6)
  • nio多线程版本
  • Electron、Tauri及其它跨平台方案终极对比
  • 蓝桥杯试题:二分查找
  • MongoDB Chunks核心概念与机制
  • 决策树(Decision Tree):机器学习中的经典算法
  • 高频 SQL 50 题(基础版)_1084. 销售分析 III
  • Python-selenium启动edge打开百度
  • 网络安全需要掌握哪些技能?
  • 自动扶梯人员摔倒掉落识别检测数据集VOC+YOLO格式5375张2类别
  • 中国棒球国家队征战世界棒球经典赛·棒球1号位
  • 重生之数据结构与算法----数组链表
  • 计算机网络常见疑问
  • C++07(继承)
  • 文件上传漏洞:upload-labs靶场1-10
  • 【Python/Pytorch】-- 创建3090Ti显卡所需环境
  • 自然语言转SQL之Vanna.ai:AI集成数据库
  • 【零基础到精通Java合集】第二十二集:CMS收集器详解(低延迟的里程碑)
  • 2025-03-04 学习记录--C/C++-PTA 习题5-5 使用函数统计指定数字的个数
  • SP导入模型设置
  • 计算机网络——IP地址