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

FreeRtos下创建任务失败原因记录

一 问题背景

使用stm32f103 + freertos创建三个任务,如下:程序运行不正常,经过debug,发现第三个任务KeyTask没有创建成功。原因呢大概率是栈空间不够,通过将三个任务的栈传参都改成128,发现三个任务均创建成功,那么确认是栈空间不足导致。最终修改方法是将宏configTOTAL_HEAP_SIZE 由3072改为4096。但是有个疑问,为什么栈空间不足,要修改堆大小?本文即看了一些资料后,有了个认识,做个总结

  osThreadDef(mail_station, mail_station_task, osPriorityNormal, 0, 128);mail_stationHandle = osThreadCreate(osThread(mail_station), NULL);/* definition and creation of TaskDisplay */osThreadDef(TaskDisplay, displayTask, osPriorityNormal, 0, 256);TaskDisplayHandle = osThreadCreate(osThread(TaskDisplay), NULL);/* definition and creation of TaskKey */osThreadDef(TaskKey, keyTask, osPriorityNormal, 0, 256);TaskKeyHandle = osThreadCreate(osThread(TaskKey), NULL);
二 栈和堆的差别
栈特点
  • 自动分配释放,编译器管理
  • 连续内存,栈访问更快
  • 生命周期函数调用结束即销毁
  • 一般用于局部变量,函数传参,函数返回值
  • 无内存碎片
  • 每个线程有独立的栈
堆特点
  • 手动分配malloc,手动释放free,操作不当可能内存泄漏
  • 通常空间更大,但是分配不连续,通过链表管理
  • 若定义全局指针引用,则可跨函数存在
  • 频繁分配释放可能造成内存碎片—明明有内存,但是无法分配大内存
三 freertos下堆内存管理

freertos提供了多种堆内存分配算法,分别存放于heap1.c~heap5.c几个文件中,每个文件各放了一种分配方案;stm32CubeIDE freertos中间件默认采用的是heap4方案,该方案在嵌入式场景中更加通用,可动态分配且有碎片化管理。
在配置文件中,configTOTAL_HEAP_SIZE定义了系统堆内存的大小;如果任务创建采用动态分配,那么每个任务的任务栈,其实也是从系统堆里面分配的。所以当你创建任务越多,分配的任务栈越多,那么加起来就可能造成系统堆空间不够用,这个时候我们就应该增加系统堆内存大小。

http://www.xdnf.cn/news/959509.html

相关文章:

  • 动态元素绑定事件总失效?通过AI 对话框的开发,详解绑定逻辑!
  • @Transactional 什么情况下会失效
  • Linux应用开发之网络套接字编程(实例篇)
  • VMware Workstation踩坑指南
  • Ubuntu 可执行程序自启动方法
  • apt命令介绍
  • 【音乐分析】根据拍号结合bpm计算bar_duration
  • 每日算法题(12-1)ACM输出九九乘法表-20250609
  • DeviceNet转Modbus-RTU协议网关详细解读
  • 医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
  • CCleaner Professional 下载安装教程 - 电脑清理优化工具详细使用指南
  • Kafka入门-监控与可视化
  • 今天做的力扣SQL
  • 二维FDTD算法仿真
  • C++ 类的定义与构造 / 析构函数解析
  • python3基础语法梳理(一)
  • 验证回文串
  • 【学习分享】shell脚本基础(全)
  • 深度解析云存储:概念、架构与应用实践
  • 外链域名年龄 vs 数量老域名的1个链接抵新域名的100个吗?
  • 【配置篇】告别硬编码:多环境配置、@ConfigurationProperties与配置中心初探
  • FDD损失函数 损失函数和梯度的关系
  • Day49 Python打卡训练营
  • 【前端】js Map集合的使用方法
  • C++11委托构造函数和继承构造函数:从入门到精通
  • 查询宝塔的数据库信息
  • 共享存储系统
  • 动画直播如何颠覆传统?解析足球篮球赛事的数据可视化革命
  • ONNX详解:跨平台模型部署解决方案
  • 【Java】谈谈HashMap