1. 内存管理基础知识

1. RT-Thread 中的两种内存管理方式

  1. 动态内存堆管理
  2. 静态内存池管理

内存堆

2. 存分配管理算法

  1. 内存堆管理
  2. 内存池管理

内存堆管理

  1. 第一种是针对小内存块的分配管理(小内存管理算法);

  2. 第二种是针对大内存块的分配管理(slab 管理算法);

  3. 第三种是针对多内存堆的分配情况(memheap 管理算法)

  • RT-Thread 将 “ZI 段结尾处” 到内存尾部的空间用作内存堆
  • 小内存管理算法主要针对系统资源比较少,一般用于小于 2MB 内存空间的系统;
  • 而 slab 内存管理算法则主要是在系统资源比较丰富时,提供了一种近似多内存池管理算法的快速算法。
  • RT-Thread 还有一种针对多内存堆的管理算法,即 memheap 管理算法。memheap 方法适用于系统存在多个内存堆的情况,它可以将多个内存 “粘贴” 在一起,形成一个大的内存堆,用户使用起来会非常方便。

经过查询源码,rtt nano 默认分配的 heap 是15K

2. 内存堆使用的函数

从内存堆上分配用户指定大小的内存块

void *rt_malloc(rt_size_t nbytes);

释放内存块

void rt_free (void *ptr);

已分配内存块的基础上重新分配内存块的大小

void *rt_realloc(void *rmem, rt_size_t newsize);

内存堆中分配连续内存地址的多个内存块

  void *rt_calloc(rt_size_t count, rt_size_t size);

内存分配钩子,分配完成后调用

void rt_malloc_sethook(void (*hook)(void *ptr, rt_size_t size));
  • 回调函数形式
void hook(void *ptr, rt_size_t size);

内存池

  • 内存池是一种内存分配方式,用于分配大量大小相同的小内存块
  • 内存池一旦初始化完成,内部的内存块大小将不能再做调整。
  • 当内存池中无可用内存块,并且申请线程允许等待时,申请线程将挂起在 suspend_thread 链表上

内存池相关函数

创建内存池

//动态
rt_mp_t rt_mp_create(const char* name,rt_size_t block_count,rt_size_t block_size);
//静态
rt_err_t rt_mp_init(rt_mp_t mp,const char* name,void *start, rt_size_t size,rt_size_t block_size);

释放内存池

//动态
rt_err_t rt_mp_delete(rt_mp_t mp);
//静态
rt_err_t rt_mp_detach(rt_mp_t mp);

申请内存块

void *rt_mp_alloc (rt_mp_t mp, rt_int32_t time);

归还内存块

void rt_mp_free (void *block);

RTT学习笔记6-内存管理相关推荐

  1. Redis运维和开发学习笔记(7) 内存管理和过期策略

    Redis运维和开发学习笔记(7) 内存管理和过期策略 文章目录 Redis运维和开发学习笔记(7) 内存管理和过期策略 内存回收策略 惰性删除 定时任务删除 maxmemory 过期策略allkey ...

  2. 嵌入式linux学习笔记1—内存管理MMU之虚拟地址到物理地址的转化

    一.内存管理基本知识 1.S3C2440最多会用到两级页表:以段的方式进行转换时只用到一级页表,以页的方式进行转换时用到两级页表.页的大小有三种:大页(64KB),小页(4KB),极小页(1KB).条 ...

  3. arm-linux学习笔记3-linux内存管理与文件操作

    配置好linux系统之后需要vim配置一下,有助于我们的编程,主要的配置如下 在/etc/vim/vimrc文件中 "显示行号 set number "自动缩进 set autoi ...

  4. 《C语言深度解剖》学习笔记之内存管理

    第5章 内存管理 1.野指针 定义指针变量的同时最好初始化为NULL,用完指针后也将变量的值设置为NULL.也就是说除了使用时,别的时间都把它设置为NULL 2.堆,栈和静态区 堆:由malloc系列 ...

  5. RTT学习笔记7-中断管理

    基础知识 寄存器 Cortex-M 系列 CPU 的寄存器组里有 R0~R15 共 16 个通用寄存器组和若干特殊功能寄存器 通用寄存器组里的 R13 作为堆栈指针寄存器 (Stack Pointer ...

  6. 【转】.net框架读书笔记---CLR内存管理\垃圾收集(三)

    接上一篇.net框架读书笔记---CLR内存管理\垃圾收集(二),主要学习了终止化对象(实现了Finalize方法的对象),了解了终止化对象的弊端,学习了通过实现IDisposable接口,通过Dis ...

  7. 【JVM学习笔记】内存回收与内存回收算法 就哪些地方需要回收、什么时候回收、如何回收三个问题进行分析和说明

    目录 一.相关名词解释 垃圾收集常用名词 二.哪些地方需要回收 本地方法栈.虚拟机栈.程序计数器 方法区 Java堆 三.什么时候回收 1. 内存能否被回收 内存中的引用类型 引用计数算法 可达性分析 ...

  8. 深入理解Java虚拟机(第3版)学习笔记——JAVA内存区域(超详细)

    深入理解Java虚拟机(第3版)学习笔记--JAVA内存区域(超详细) 运行时数据区域 程序计数器 java虚拟机栈 本地方法栈 java堆 方法区 运行时常量池 直接内存 对象的创建 对象的内存布局 ...

  9. 文件和存储管理学习笔记-动态磁盘管理

    Server 2008 R2 文件和存储管理学习笔记-动态磁盘管理 基本磁盘是包含基本分区.扩展分区或逻辑驱动器的一种物理磁盘 动态磁盘提供了基本磁盘不提供的一些高级功能,创建无限数量卷.跨越多个磁盘 ...

最新文章

  1. java中json重复数据结构_JS实现去除数组中重复json的方法示例
  2. 虚拟dom_虚拟DOM发展的前世与今身
  3. pythonpackage详解_Python详解之包管理:__init__.py
  4. 58.贪心算法练习:  最小新整数
  5. Planes, Trains, but not Automobiles-求最小路径覆盖的起点终点
  6. 光盘刻录只允许读取不能拷贝_原来 8 张图,就可以搞懂「零拷贝」了
  7. leetcode 331. 验证二叉树的前序序列化
  8. pycharm之no python interpreter configured for project的解决办法
  9. git关闭密码自动存储_RobotFramework实战篇PC端web自动化demo及持续集成
  10. 如何在 JavaScript 中实现拖放
  11. python.集合转列表_Python列表、元组、字典、集合
  12. 蓝桥杯 C语言 试题 历届试题 网络寻路
  13. html制作简单扫雷,JavaScript制作windows经典扫雷小游戏
  14. STM32使用外部SRAM扩展内存,自动在SRAM上分配内存空间的方法
  15. python 实现自动化点击界面方案
  16. 《GC篇》七、GC 调优(实战篇)
  17. .netframewor金山卫士推送微软8月补丁 IE所有版本存在高危漏洞
  18. Nginx服务器概述
  19. 不管是否情愿,5G要来了,运营商该做的事一样也不能少
  20. hr读取工作日历的函数

热门文章

  1. linux 查看触摸屏信息,英创信息技术eGalax触摸屏在Linux/X11下的标定方法
  2. 从spring容器中获取对象工具类
  3. 百度车牌识别API-Python版
  4. 解决sklearn.metrics指标报错ValueError: Target is multiclass but average=‘binary‘. Please choose anothe...
  5. python gc清理无用变量与内存
  6. 解决Mac安装LightGBM报错LightGBM and gcc 8 in MacOS: Library not loaded
  7. python按照时间timestramp切分网络前向流与后向流
  8. 90度旋转 flip opencv_基于Hu距的图像旋转矫正之OpenCV实现
  9. 禁止普通账户将主机加入域控
  10. MySQL主键和外键使用及说明