| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> RT-Thread记录(八、理解 RT-Thread 内存管理) -> 正文阅读 |
|
[嵌入式]RT-Thread记录(八、理解 RT-Thread 内存管理) |
目录前言记得最初学习 RT-Thread ,对于内存管理我也是简单看看然后一笔带过,当时觉得用不上,在我做的一些传感器单品项目上,对于内存管理确实知道与不知道没什么关系,但是随着认知的增长,项目复杂程度增加,发现内存管理还不可或缺,于是今时今日正好再次来更新 RT-Thread记录,有必要好好的说一说。 RT-Thread 有2种内存管理方式,分别是动态内存堆管理和静态内存池管理。 先不管这两种方式是怎么实现的,首先要明白一个问题,为什么要内存管理? 一、为什么要内存管理什么是内存管理?为什么需要内存管理? 在我们的程序设计中,一些数据需要的内存大小需要在程序运行过程中根据实际情况确定,在用户需要一段内存空间时,向系统申请,系统选择一段合适的内存空间分配给用户,用户使用完毕后,再释放回系统,以便系统将该段内存空间回收再利用。 这样子不断的申请释放,如果没有内存管理,就会导致内存碎片,对程序产生极大的影响。 具体的原因我在下面博文有详细说明: 如果看完上面的博文,就应该知道了内存管理的重要性。 我们确实直接在函数或者线程里面创建临时变量使用 线程栈 或 者系统栈处理临时变量,但是正如上面博文里面所说的,作为一个通用的操作系统,都会且必须得有自己的合理的内存管理方式。 知道了为什么,那么接下来我们就来了解一下 RT-Thread 的这2种内存管理方式。 二、RT-Thread 内存堆管理现在看看内存堆管理, 所谓堆,看过我博文的朋友应该已经很熟悉了,对于裸机中的堆的位置,大小设定都应该会有一个详细的认知,如果还不知道堆,可以查看下面这篇博文一步到位的理解: STM32的内存管理相关(内存架构,内存管理,map文件分析) 上文虽然是以STM32为例子说明,但是对于 C/C++ 程序编译后的存储数据段 在不同芯片上的顺序基本都是一样的,于是乎在我的又一篇博文中 就得到了一张内存分配的示意图: 2.1 RT-Thread 内存分配要理解 RT-Thread 内存堆管理,首先得知道它管理的是哪一块内存,所以得知道 RT-Thread 内存分配。 其实细心的朋友会发现,我在博文 RT-Thread记录(二、RT-Thread内核启动流程 — 启动文件和源码分析) 中提到过 RT-Thread 内存分配情况,在其中的 通过上面的分析,我们可以得到 RT-Thread 下的内存分配的示意图: 通过上面我们自己的分析,再结合官方说明文档的说明,我们应该能完全明白了什么是 RT-Thread 的内存堆: 至此,我们可以确实的明白,RT-Thread 内存管理管理的是哪一部分的内存了。 2.2 RT-Thread内存堆管理方式那么RT-Thread 对于内存堆,是如何管理的呢? 说明:对于这部分,我个人记录是以知道为主,毕竟我们专栏以应用为主,我们了解会用即可,如果以后确实自己会需要自己写内存管理,肯定会单独更新一篇博文。 2.2.1 内存堆管理的3种方式RT-Thread 内存堆管理又根据具体内存设备划分为三种情况:
这里套用官方的介绍做个简单说明(如果需要深入了解可以去官网查看): 2.2.2 管理方式的程序配置我们上面 简单介绍了RT-Thread 内存堆管理的3种方式,虽然我们没有详细分析内部是如何实现,那么我们也得了解在 RT-Thread 工程中,是怎么配置使用哪一种管理方式,同时了解这些方式的实现在程序什么文件中。 在工程的 如果是使用 slab 管理算法,需要宏定义如下:
如果是使用 memheap 管理算法,需要宏定义如下:
具体的实现文件是在工程 RT-Thread 内存管理详细的实现方式可以自行查看该文件,这里就不过多介绍。 2.3 内存堆 API 函数 对于 RT-Thread 内存堆管理,是有自己的 其 三种管理算法提供的 API 都是相同的。 初始化: 首先是初始化函数:
我在《RT-Thread记录(二、RT-Thread内核启动流程 — 启动文件和源码分析)》板级硬件初始化 — rt_hw_board_init 小结中提到过 这个函数,: 内存管理操作函数: 简单记录一下:
释放内存块后要清空内存块指针,不然会成为野指针。 三、RT-Thread 内存池RT-Thread 的第二种内存管理方式是 内存池,内存池是一种内存分配方式,用于分配大量大小相同的小内存块,它可以极大地加快内存分配与释放的速度,且能尽量避免内存碎片化。 基本介绍套用官方说明: 内存池属于 内核对象!!支持线程挂起功能。 内核对线什么意思?就是我们前面说到的,线程,IPC机制,这些东西都是内核对象,所以存在 内存池 控制块。 有一个点要注意,内存池申请的内存块大小固定! 3.1 内存池的位置内存池也是内存管理,那么他创建的之后在内存的什么位置呢? 首先明白内存池作为一个对象,其实可以认为是一个变量,那么他基本上就是属于.bss段的东西了,在RT-Thread 中,他的位置应该是在 .bss段的。 我们按照上面的内存分配的示意图说明一下内存池申请的内存位置: 内存池属于.bss段的数据,只不过他一般来说都是申请的相对比较大的一块内存空间,然后在这个大空间内自己有自己的分配管理方式。 3.2 内存池程序配置和控制块内存池程序配置: RT-Thread 的内存池在程序中的配置和实现文件如下图: 内存池控制块:(因为是内对象,所以还是熟悉的配方,熟悉的味道~ ~)
内存池具体管理方法的实现可以自己查看下源码,这里暂时不做深入研究。 3.3 内存池操作 API 函数内存池作为内核对象,那么他的操作就和以前那些IPC机制,线程一样的方式,分为动态创建,静态初始化这些。 并不需要在 板级初始化的时候就初始化。用户可以自己选择用于不用。 简单记录说明一下内存池操作函数:
结语本文从为什么要内存管理说起,了解了 RT-Thread 的2种内存管理方式:内存堆 和 内存池。 相信不管你平时用不用动态内存申请,看了这篇文章以后也会对 RT-Thread 的内存管理有一定的了解,在以后需要用到动态内存分配的同时也不会手足无措! 但是特别注意,不管使用哪种方式,在申请的内存使用完之后都必须及时释放,而且要注意清空相应的指针! 但是本文的重点在于理解 为什么要内存管理,和 内存管理管理的是哪一块的内存,对于如何实现内存管理我们只是借用了官方的说明,还是没有深入的研究分析。这个需要等以后博主有机会自己写一套内存管理方式的时候,或许会单独开一篇博文深入分析。 谢谢! |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 5:29:57- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |