RT-Thread动态内存扩展,使用多块不连续的RAM作为动态内存

开发环境

MCU:STM32F429VET6(1M Flash,192K+64K共256K SRAM)
编译环境:MDK5.38
实时系统:RT-Thread标准版

目的

这颗MCU的SRAM默认是使用192K,即从地址0x20000000开始,最大0x30000(192KB)大小,另外64K的RAM是从地址0x10000000开始,最大0x10000(64KB)大小。
在这里插入图片描述

最近项目开发过程中,发现SRAM空间不足了,使用想着怎么把剩余的64KB给用起来,把系统的运行内存从192K提升到256K。

实现过程

1.原理

由于RT-Thread自带内存管理,其中针对多内存堆的管理,即memheap管理算法, 支持多块内存(物理地址不连续)拼接使用。当系统中存在多个内存堆的时候,用户只需要在系统初始化时将多个所需的 memheap 初始化,并开启 memheap 功能就可以很方便地把多个 memheap(地址可不连续)粘合起来用于系统的 heap 分配。
注意:在开启 memheap 之后原来的 heap 功能将被关闭,两者只可以通过打开或关闭 RT_USING_MEMHEAP_AS_HEAP 来选择其一。
memheap 工作机制如下图所示,首先将多块内存加入 memheap_item 链表进行粘合。当分配内存块时,会先从默认内存堆去分配内存,当分配不到时会查找 memheap_item 链表,尝试从其他的内存堆上分配内存块。应用程序不用关心当前分配的内存块位于哪个内存堆上,就像是在操作一个内存堆。
在这里插入图片描述

2.实现步骤

2.1 开启memheap

在这里插入图片描述
选择使用memheap as heap。

2.2 使能RT_USING_MEMHEAP_AUTO_BINDING

查看rt_malloc代码发现,默认heap申请不到则去其他heap申请内存,如下图:
在这里插入图片描述

2.3 将64K的SRAM加入 memheap_item 链表

我们把64K的SRAM定义为SRAM2,起始地址和大小都定义好,如下:

#define STM32_SRAM2_SIZE          (64)
#define STM32_SRAM2_BEGIN         (0x10000000)
#define STM32_SRAM2_END           (STM32_SRAM2_BEGIN + STM32_SRAM2_SIZE * 1024)

在heap初始化的时候,同时初始化64K的SRAM:

    /* Heap initialization */
#if defined(RT_USING_HEAP)static struct rt_memheap tcmsram_heap;rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);rt_memheap_init(&tcmsram_heap, "sram2", (void *)STM32_SRAM2_BEGIN, (rt_size_t)(STM32_SRAM2_END - STM32_SRAM2_BEGIN));
#endif
2.4 查看内存池大小

在这里插入图片描述
从上图中看出,heap共有57536Byte,sram2有65536Byte大小,即我们前面新增的64KB SRAM。
同时也能看到heap的可用大小只有2716Byte了,本次新增sram2也就是因为这个可用空间不够。

3.延展

HEAP的起始地址定义如下:

#if defined(__CC_ARM) || defined(__CLANG_ARM)
extern int Image$$RW_IRAM1$$ZI$$Limit;
#define HEAP_BEGIN      (&Image$$RW_IRAM1$$ZI$$Limit)
#elif __ICCARM__
#pragma section="CSTACK"
#define HEAP_BEGIN      (__segment_end("CSTACK"))
#else
extern int __bss_end;
#define HEAP_BEGIN      (&__bss_end)
#endif

目前用的MDK编译环境, Image$$RW_IRAM1$$ZI$$Limit是ARM链接器符号,指执行区中ZI输出节末尾后面的字节的地址。

映像结构如下图:
在这里插入图片描述
从分散加载文件得知,RW_IRAM1 为程序 RW 和 ZI 区加载地址,如下图:
在这里插入图片描述
所以,HEAP_BEGIN (&Image$$RW_IRAM1$$ZI$$Limit)就是RW和ZI所需加载空间剩余的起始地址。举个例子:假如MCU的RAM为256K,RW+ZI共占用了180K,则heap内存池可用空间为256-180=76K字节大小。

4.结尾

最近用RT-Thread调试项目,遇到RAM不够的情况,按照上面的方法解决了RAM不够的问题,所以记录一下,如果有遇到同样类似的问题可参考。以上如有描述有误的也请指出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/772338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS code配置Markdown以及预览

1.安装 Visual Studio Code: 如果尚未安装Visual Studio Code,请先下载并安装它。您可以从官方网站(https://code.visualstudio.com/)下载适用于您的操作系统的版本。 2安装扩展 Visual Studio Code的强大之处在于其扩展生态系…

python生成requirement.txt

pipreqs第三方库(推荐) 使用 pipreqs 可以自动检索到当前项目下的所有组件及其版本,并生成 requirements.txt 文件,极大方便了项目迁移和部署的包管理。相比直接用pip freeze 命令,能直接隔离其它项目的包生成。 使用…

第九届蓝桥杯大赛个人赛省赛(软件类)真题C 语言 A 组-分数

solution1 直观上的分数处理 #include <iostream> using namespace std; int main() {printf("1048575/524288");return 0; }#include<stdio.h> #include<math.h> typedef long long ll; struct fraction{ll up, down; }; ll gcd(ll a, ll b){if…

2024中国闪存市场观察:AI助推闪存全面起势?

过去两年&#xff0c;闪存市场一直处于低迷状态&#xff0c;但去年第四季度闪存颗粒资源的上涨&#xff0c;导致闪存产品价格一路上扬&#xff0c;市场遂发生反转。 2024年&#xff0c;中国闪存市场会彻底走向复苏&#xff0c;还是急转直下&#xff1f;中国AI热潮&#xff0c;…

MATLAB 自定义生成平面点云(可指定方向,添加噪声)(48)

MATLAB 自定义生成平面点云(可指定方向,添加噪声)(48) 一、算法介绍二、算法步骤三、算法实现1.代码2.效果一、算法介绍 通过这里的平面生成方法,可以生成模拟平面的点云数据,并可以人为设置平面方向,平面大小,并添加噪声来探索不同类型的平面数据。这种方法可以用于…

【大全】常用加解密算性能、安全对比

常用算法 1、古典加密算法 古典密码&#xff08;classical cryptography&#xff09;编码方式归根结底主要就是置换和代换. 置换&#xff1a;已知明文字母集S{a,b}&#xff0c;置换后的密码可以是S’{b,a}&#xff0c;即将明文字符位置发生变化后形成的密码就是置换密码. 代换&…

JavaScript高架高级(四)---这可能是你看过的最完整的this指向

前言 简单阐述 前端的初学者在学习Javascript中this指向的时候经常都会一头雾水&#xff0c;尤其是在ES6箭头函数出现之前。 this指向之所以容易让人头疼&#xff0c;原因在于 this 是在代码执行时根据环境和情况不同才决定绑定为什么值。 所以本篇文章主要是介绍和总结了各…

Openstack(T) 部署Ceilometer服务 ---mongo命令error

执行如下命令 # mongo --host controller --eval db db.getSiblingDB("ceilometer"); db.addUser({user: "ceilometer", pwd: "admin123", roles: [ "readWrite", "dbAdmin" ]}) 出现错误 1.安装mongo ①vi /etc/yum.r…

数据结构进阶篇 之 【二叉树】详细概念讲解(带你认识何为二叉树及其性质)

有朋自远方来&#xff0c;必先苦其心志&#xff0c;劳其筋骨&#xff0c;饿其体肤&#xff0c;空乏其身&#xff0c;鞭数十&#xff0c;驱之别院 一、二叉树 1、二叉树的概念 1.1 二叉树中组分构成名词概念 1.2 二叉树的结构概念 1.3 特殊的二叉树 2、二叉树的存储结构 …

全面:vue.config.js 的完整配置

vue.config.js是Vue项目的配置文件&#xff0c;用于配置项目的构建、打包和开发环境等。 在Vue CLI 3.0之后&#xff0c;项目的配置文件从原来的build和config目录下的多个配置文件&#xff0c;合并成了一个vue.config.js文件。这个文件可以放在项目的根目录下&#xff0c;用于…

向赵丽颖学习大女主式的生活方式!

最近&#xff0c;随着电视剧《与凤行》的热播&#xff0c;赵丽颖再次以其精湛的演技和不变的专业状态回到了大众视野。从《楚乔传》的坚韧女将到《知否知否应是绿肥红瘦》中的睿智女性&#xff0c;赵丽颖的每一次转变都让人眼前一亮。尽管在这几年中&#xff0c;她也经历了许多…

AI入侵游戏业:是颠覆者还是创新助手?揭秘未来游戏新趋势!

在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经成为各行各业的关注焦点。而在娱乐产业中&#xff0c;AI技术的引入也让人们对电子游戏的未来发展产生了无限遐想。那么&#xff0c;AI究竟会给电子游戏行业带来怎样的变革&#xff1f;它会成为行业的颠…

机器学习 - save和load训练好的模型

如果已经训练好了一个模型&#xff0c;你就可以save和load这模型。 For saving and loading models in PyTorch, there are three main methods you should be aware of. PyTorch methodWhat does it do?torch.saveSaves a serialized object to disk using Python’s pickl…

AI大模型学习的伦理与社会影响

AI大模型学习 随着人工智能技术的快速发展&#xff0c;AI大模型学习成为当前热门研究领域之一。AI大模型学习是指基于大规模数据集和深度学习模型进行训练&#xff0c;以实现更高的准确性和复杂性。这些大模型已经在几乎所有领域都取得了显著的成就&#xff0c;包括自然语言处…

通讯录管理系统实现(C++版本)

1.菜单栏的设置 &#xff08;1&#xff09;我么自定义了一个showmenu函数&#xff0c;用来打印输出我们的菜单栏&#xff1b; &#xff08;2&#xff09;菜单栏里面设置一些我们的通讯录里面需要用到的功能&#xff0c;例如增加联系人&#xff0c;删除联系人等等 2.退出功能…

ocrclass.h:117:18: error: field ‘end_time‘ has incomplete type ‘timeval‘

Alpine Linux v3.5上安装 tesseract-4.1.1 报错&#xff1a; 缺少timeval函数 ocrclass.h:117:18: error: field end_time has incomplete type timeval Current Behavior: In file included from control.cpp:37:0: ../../src/ccutil/ocrclass.h:117:18: error: field end…

javaWeb私人牙科诊所管理系统

一、摘要 随着科技的飞速发展&#xff0c;计算机已经广泛的应用于各个领域之中。在医学领域中&#xff0c;计算机主要应用于两个方面&#xff1a;一是医疗设备智能化&#xff0c;以硬件为主。另一种是病例信息管理系统&#xff08;HIS&#xff09;以软件建设为主&#xff0c;以…

1978-2022年全国31省社会消费品零售总额数据

1978-2022年全国31省社会消费品零售总额数据 1、时间&#xff1a;1978-2022年 2、指标&#xff1a;社会消费品零售总额 3、范围&#xff1a;31省市 4、来源&#xff1a;整理自国家统计J和各省年鉴 5、缺失情况说明&#xff1a;1997-2022年31省市均无缺失&#xff0c; 199…

GB 16807-2009 防火膨胀密封件检测

防火膨胀密封件是指火灾时遇火或高温作用能够膨胀&#xff0c;且能辅助建筑构配件使之具有隔火、隔烟、隔热等防火密封性能的产品。 GB 16807-2009防火膨胀密封件检测项目&#xff1a; 测试项目 测试方法 外观 GB 16807 尺寸允许偏差 GB 16807 膨胀性能 GB 16807 产烟…

随机链表的深拷贝

目录 一、何为深拷贝&#xff1f; 二、题目 三、思路 1.拷贝节点插入到原节点后面 2.控制拷贝节点的random 3.脱离原链表 : 尾插的思想 四、代码 五、附加 一、何为深拷贝&#xff1f; 一个引用对象一般来说由两个部分组成&#xff1a;一个具名的Handle&#xff0c;也就…