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

嵌入式学习笔记 - freeRTOS 动态创建任务跟静态创建任务的区别,以及内存回收问题

FreeRTOS动态创建任务和静态创建任务各有优缺点,选择哪种方式取决于具体的应用场景和需求。

一 动态创建任务

优点‌:

  • 灵活性高‌:动态任务在运行时通过pvPortMalloc()动态分配内存,系统自动管理栈和任务控制块(TCB)。这使得任务可以随时创建和删除,适合需要频繁创建/删除任务的场景‌
  • 内存管理方便‌:动态任务不需要用户手动分配内存,系统会自动管理内存的分配和释放,减少了内存管理的复杂性‌。

缺点‌:

  • 性能开销‌:动态内存分配和管理会增加一定的性能开销,尤其是在高频创建和销毁任务时,可能会影响系统的实时性‌
  • 内存碎片‌:动态内存分配可能导致内存碎片问题,尤其是在长期运行的应用中‌

二 静态创建任务

优点‌:

  • 性能优越‌:静态任务在编译时分配内存,内存使用可预测,没有动态内存分配的开销,适合对实时性要求高的场景‌
  • 减少碎片‌:由于内存是在编译时分配的,避免了动态内存分配带来的碎片问题‌

缺点‌:

  • 灵活性差‌:静态任务需要用户手动分配内存,不适合需要频繁创建和删除任务的场景。一旦任务数量确定,难以动态调整‌
  • 内存管理复杂‌:用户需要手动管理任务控制块和栈空间的分配,增加了开发的复杂度‌

三 内存回收问题

静态创建的任务在任务删除后,其任务栈空间和任务控制块空间仍然存在

在FreeRTOS中,‌静态创建的任务被删除后,其任务栈空间仍然存在,不会被自动释放‌。原因如下:

  1. 静态创建任务时,栈空间由用户显式分配
    静态创建任务需要开发者预先定义并分配任务栈空间(通常是全局数组或静态变量)和任务控制块(TCB)所需的内存。这些内存不由FreeRTOS堆管理器管理 。

  2. 任务删除操作仅移除任务调度相关结构,不释放用户分配的栈内存
    当调用vTaskDelete()删除任务时,FreeRTOS完成的操作包括:

    • 将任务从就绪列表、阻塞列表、挂起列表和事件列表中移除。
    • 释放由内核动态分配的资源(如链表节点)。
    • 对于动态创建的任务,空闲任务会回收其栈和TCB占用的堆内存。
    • 对于静态创建的任务,内核不会回收用户预先分配的栈空间和TCB结构体所占用的内存‌ 。
  3. 静态内存的回收责任在用户
    静态创建方式的内存管理责任完全在开发者。任务删除后,原先用于该任务的栈数组和TCB结构体所占用的内存空间依然保留在系统中。开发者可根据需要:

    • 复用该内存空间创建新任务。
    • 重新分配作其他用途。
    • 在程序生命周期内不再使用(但需注意内存占用问题)。

总结:
FreeRTOS静态创建任务的栈空间在任务删除后依然存在且不会被内核自动回收。开发者需自行管理这些预分配内存的生命周期和后续使用,避免内存浪费或泄漏。

相关文章:

  • 【AI智能体】Spring AI MCP 从使用到操作实战详解
  • 概率统计:AI大模型的数学支柱
  • 【HW系列】—安全设备介绍(开源蜜罐的安装以及使用指南)
  • 做好 4个基本动作,拦住性能优化改坏原功能的bug
  • 数据库系统概论(十二)SQL 基于派生表的查询 超详细讲解(附带例题表格对比带你一步步掌握)
  • 【C#】Quartz.NET怎么动态调用方法,并且根据指定时间周期执行,动态配置类何方法以及Cron表达式,有请DeepSeek
  • 智启未来:当知识库遇见莫奈的调色盘——API工作流重构企业服务美学
  • 我爱学算法之—— 前缀和(上)
  • 分布式锁剖析
  • STM32 笔记 _《GPIO配置从低层走向高层》
  • 盲盒经济2.0:数字藏品开箱是否适用赌博法规
  • 牛客2025年儿童节比赛
  • 不使用绑定的方法
  • 打卡day42
  • 计算机网络技术
  • vscode编辑器怎么使用提高开发uVision 项目的效率,如何编译Keil MDK项目?
  • 28 C 语言作用域详解:作用域特性(全局、局部、块级)、应用场景、注意事项
  • iOS安全和逆向系列教程 第18篇:iOS应用脱壳技术详解与实战
  • C语言 — 文件
  • QtWidgets,QtCore,QtGui
  • 网站功能表/seo sem是什么职位
  • 学做网站设计/搜索推广
  • 中山建网站最好的公司/世界新闻最新消息
  • 网站开发站点的文件夹/鞍山seo外包
  • 山东青岛网站建设公司/4414站长平台
  • 凡客是什么意思/台州百度快照优化公司