程序小白
认证:优质创作者
作者动态
小小调度器——开局default,优雅总藏于细节之中
2星期前
小小调度器——调度器核心的纯C实现
3星期前
小小调度器——原来C代码还能这么写,原作者没少挨打吧!
3星期前
解析由系统库引发的hardfault血案(RT-Thread+ESP32)
2023-07-17 16:04
TINA瞬时现象仿真分析——运放缓冲器振铃
2023-02-28 11:38

RT-thread——内存管理(动态内存堆管理)

单片机中所谓的内存指的就是RAM,而并不是所有的RAM都需要管理的,只有用到动态内存申请的应用中才需要内存管理,并不是所有的应用都需要用到动态内存管理,其实在嵌入式领域大部分应用场景下都不会用到这个功能,那么你可以完全跳过此篇,或者就当茶余饭后的小说看一看。


关于动态内存管理方式:分为两种动态内存堆管理和静态内存池管理。


先来聊聊为什么动态内存管理能不用就不用的理由(缺点):

1.申请内存需要用到查找空闲内存算法,这个是需要时间的,有时候甚至会出现不可控的时间。。

2.频繁的申请和释放内存,会造成内存空间碎片化,导致内存不可用而系统出现问题,一般通过重启硬件完成修复。

3.申请内存会存在失败的情况,针对申请失败的情况需要做额外的处理。


当然他的好处也是多多:例如硬件资源有限的情况下,可以做更多的事情,应用更灵活。


      RTOS会大篇幅的讲解内存管理算法,针对不同的内存容量其管理方式不同,那为什么要用不同的内存管理方式呢?主要是就是针对不同的内存容量,不同的算法能更有效的加快查找空闲内存的时间。至于算法的细节,其实不用看,看多了晕。你选择什么样的内存算法,其实站在应用的角度来看,是完全没有差别的,影响的只是系统分配内存的速度。

      所以记住以下经验值就足够了:

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

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

第三种是针对多内存堆的分配情况(memheap 管理算法,当系统含有多个地址可不连续的内存堆)。


动态内存管理API:

1.申请内存API:

/*分配的内存块地址 	成功
  RT_NULL 	失败*/
void *rt_malloc(rt_size_t nbytes);/*nbytes 	需要分配的内存块的大小,单位为字节*/

2.释放内存API:

void rt_free (void *ptr);/*ptr 	待释放的内存块指针*/

3.重新分配内存块API:

/*  在已分配内存块的基础上重新分配内存块的大小(增加或缩小)
    返回:重新分配的内存块地址 	成功*/
void *rt_realloc(void *rmem, /*rmem 	指向已分配的内存块*/
									rt_size_t newsize);/*newsize 	重新分配的内存大小*/

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 2
收藏 1
关注 114
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧