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

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

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

一 动态创建任务

优点‌:

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

缺点‌:

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

二 静态创建任务

优点‌:

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

缺点‌:

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

三 内存回收问题

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

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

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

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

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

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

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

http://www.lryc.cn/news/2397522.html

相关文章:

  • [免费]微信小程序网上花店系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
  • 如何给老旧 iOS App 添加安全保护?用 Ipa Guard 对 IPA 文件混淆加固实录
  • C#语音录制:使用NAudio库实现语音录制功能详解
  • [蓝桥杯]缩位求和
  • MySQ-8.42 MGR 组复制部署及详解
  • css使用scoped之后样式失效问题
  • 【NLP】将 LangChain 与模型上下文协议 (MCP) 结合使用
  • 使用NMEA Tools生成GPS轨迹图
  • 1. pytorch手写数字预测
  • vs中添加三方库的流程
  • JAVASE面相对象进阶之static
  • 深入解析 Redis Cluster 架构与实现(一)
  • (12)java+ selenium->元素定位大法之By_link_text
  • 数据库MySQL集群MGR
  • Ubuntu22.04 安装 ROS2 Humble
  • Spring Boot,注解,@RestController
  • C++中新式类型转换static_cast、const_cast、dynamic_cast、reinterpret_cast
  • AXI 协议补充(二)
  • Linux 基础指令入门指南:解锁命令行的实用密码
  • 标准精读:2025 《可信数据空间 技术架构》【附全文阅读】
  • 山东大学软件学院项目实训-基于大模型的模拟面试系统-面试官和面试记录的分享功能(2)
  • Webug4.0靶场通关笔记05- 第5关SQL注入之过滤关键字
  • ONLYOFFICE文档API:更强的安全功能
  • 深入浅出MQTT协议:从物联网基础到实战应用全解析
  • 解析楼宇自控系统:分布式结构的核心特点与优势展现
  • C#数字图像处理(三)
  • STM32 智能小车项目 L298N 电机驱动模块
  • SQL Transactions(事务)、隔离机制
  • 【动画】unity中实现骨骼蒙皮动画
  • VSCODE的终端无法执行npm命令