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

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.kler.cn/a/571608.html

相关文章:

  • Ubuntu20.04双系统安装及软件安装(五):VSCode
  • 【数据分析】上市公司市场势力数据测算+dofile(1992-2023年)
  • 【PyQt5项目实战分享】基于YOLOv8的车辆轨迹识别与目标检测研究分析软件
  • 【easy视频 | day04】视频转码 + 稿件管理 + 服务端审核稿件
  • qt-C++笔记之Linux下Qt环境变量设置及与QtCreator的关系
  • 第四节:基于Winform框架的串口助手小项目---开关串口《C#编程》
  • IntelliJ IDEA 构建项目时内存溢出问题
  • 直播流程管理 AI 应用的开发思路和功能实现
  • JavaScript+vue 实现复制文字功能
  • P10904 [蓝桥杯 2024 省 C] 挖矿
  • 【0001】初识Java
  • ArcGIS操作:13 生成最小外接矩阵
  • 可狱可囚的爬虫系列课程 16:爬虫重试机制
  • 力扣HOT100之哈希:1. 两数之和
  • MySQL执行更新SQL流程
  • 【存储中间件】MyCat2应用与实战(二):安装与启动
  • 城市管理综合执法系统源码,B/S模式与手机等移动终端架构,java语言开发,可扩展性强
  • 在Spring Boot项目中导出复杂对象到Excel文件
  • Spring 源码硬核解析系列专题(六):Spring MVC 的请求处理源码解析
  • 简单的SQL语句以及使用Node.js连接MySQL