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

stm32f103c8t6移植freeRTOS内存不足报错问题的解决办法

最近尝试手动为stm32f103c8t6移植FreeRTOS,出现了内存不足的报错

这是因为单片机内部存储空间有限,而程序所占用RAM空间太大,导致内部存储空间不足。

stm32f103c8t6的ROM大小为72KB,主要存储程序和只读常量;

而RAM大小为20KB主要存储RW-data(可读可写变量)和ZI-data(没有初始化的可读可写变量)。

1、修改FreeRTOSConfig.h文件配置项

将configTOTAL_HEAP_SIZE后面的参数改得尽量小,例如,将20改为0.5。

该配置项是设置堆的大小,也就是单独划出一部分空间用于系统动态内存分配,而这部分内存是在RAM上的。

修改后编译结果:

其中RW-data和ZI-data数值之和是RAM被占用的字节数,可以看出已占用180+3732=3912字节,也就是3912÷1024=3.82KB,RAM剩余空间大小为20-3.82=16.18kb。

我们需要将堆的大小设置的大一些,以便于后期系统调度任务的内存分配,但不能超过RAM的剩余存储空间。

例如,将configTOTAL_HEAP_SIZE后面的参数改为10,然后编译:

可以看出ZI-data变大了,但RW-data与ZI-data之和并没有超过20KB,也就不存在内存不够用的问题了。

2、将一些比较大的数组常量前面加const修饰

在使用单片机驱动OLED时,我们经常会定义一些比较大的数组,用来作为字库、图片库等,由于这些数组通常比较大,占用的空间也比较大,就会产生内存不足的问题。

在没有const修饰时,这些数据会存储在RAM中——总共只有20KB,这些数组就能占好几KB,也就是RW-data的数值会很大。

在这些数组前面用const前面加上const,就变成了只读常量,会被存储在ROM中——有72KB,不怕空间不够~

 

http://www.dtcms.com/a/277089.html

相关文章:

  • 浏览器渲染原理与性能优化全解析
  • 快速傅里叶变换(FFT)中的振幅和相位
  • 【计算机网络架构】环型架构简介
  • 在 C# 中调用 Python 脚本:实现跨语言功能集成
  • ADB 调试日志全攻略:如何开启与关闭 `ADB_TRACE` 日志
  • CS课程项目设计1:交互友好的井字棋游戏
  • 详解Linux下多进程与多线程通信(二)
  • 【QT】使用QSS进行界面美化
  • 异或为什么叫异或
  • 【读书笔记】《Effective Modern C++》第3章 Moving to Modern C++
  • Datawhale AI夏令营——基于带货视频评论的用户洞察挑战赛
  • 【PTA数据结构 | C语言版】简单计算器
  • 17.使用DenseNet网络进行Fashion-Mnist分类
  • LabVIEW调用外部DLL
  • 深度学习图像分类数据集—七种树叶识别分类
  • 零基础 “入坑” Java--- 十、继承
  • ARC 03 从Github Action job 到 runner pod
  • PPO(近端策略优化)
  • 华为HarmonyOS 5.0深度解析:跨设备算力池技术白皮书(2025全场景智慧中枢)
  • 【C++】list及其模拟实现
  • C++--List
  • AI交互中的礼貌用语:“谢谢“的效用与代价分析
  • 【操作系统-Day 5】通往内核的唯一桥梁:系统调用 (System Call)
  • MVC 参考手册
  • C++值类别与移动语义
  • linux shell从入门到精通(一)——初识Shell程序
  • opencv中contours的使用
  • Spring Boot RESTful API 设计指南:查询接口规范与最佳实践
  • Docker从环境配置到应用上云的极简路径
  • 【Docker基础】Dockerfile指令速览:文件与目录操作指令详解